目录
[XR Interaction Manager](#XR Interaction Manager)
[XR Controller](#XR Controller)
[XR Interactor](#XR Interactor)
[XR Direct Interactor](#XR Direct Interactor)
[XR Ray Interactor](#XR Ray Interactor)
[XR Socket Interactor](#XR Socket Interactor)
[XR Gaze Interactor](#XR Gaze Interactor)
[XR Interaction Group](#XR Interaction Group)
[XR Interactable](#XR Interactable)
[XR Simple Interactable](#XR Simple Interactable)
[三、XR Grab Interactable](#三、XR Grab Interactable)
[1. 抓取时播放音效](#1. 抓取时播放音效)
[2. 抓取后锁定物体旋转](#2. 抓取后锁定物体旋转)
[与 Rigidbody 的集成](#与 Rigidbody 的集成)
[与 XR Interaction Group 的协同](#与 XR Interaction Group 的协同)
[与 XR Socket Interactor 的联动](#与 XR Socket Interactor 的联动)
一、插件介绍
Unity XR-XR Interaction Toolkit开发使用方法(一)-CSDN博客
Unity XR-XR Interaction Toolkit开发使用方法(二)Hisense XR-V3 Pro SDK接入-CSDN博客
二、主要组件
XR Interaction Manager
Unity XR-XR Interaction Toolkit开发使用方法(三)组件介绍(XR Interaction Manager)-CSDN博客
XR Controller
Unity XR-XR Interaction Toolkit开发使用方法(四)组件介绍(XR Controller)-CSDN博客
XR Interactor
Unity XR-XR Interaction Toolkit开发使用方法(五)组件介绍(XR Interactor)-CSDN博客
XR Direct Interactor
Unity XR-XR Interaction Toolkit开发使用方法(六)组件配置(XR Direct Interactor)-CSDN博客
XR Ray Interactor
Unity XR-XR Interaction Toolkit开发使用方法(七)组件配置(XR Ray Interactor)-CSDN博客
XR Socket Interactor
Unity XR-XR Interaction Toolkit开发使用方法(八)组件介绍(XR Socket Interactor)-CSDN博客
XR Gaze Interactor
Unity XR-XR Interaction Toolkit开发使用方法(九)组件介绍(XR Gaze Interactor)-CSDN博客
XR Interaction Group
Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)-CSDN博客
XR Interactable
Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR Interactable)-CSDN博客
XR Simple Interactable
Unity XR-XR Interaction Toolkit开发使用方法(十二)组件介绍(XR Simple Interactable)-CSDN博客
三、XR Grab Interactable
1、组件介绍
Unity XR Grab Interactable 是 XR Interaction Toolkit 中用于实现 物理抓取与投掷交互 的核心组件,专为需要模拟真实抓取、投掷、旋转等行为的场景设计(如抓取杯子、抛掷飞盘、双手操作物体)。它在 XR Interactable
的基础上扩展了物理交互能力,是构建沉浸式抓取体验的核心工具。
可交互组件,提供基础抓取功能。当该组件被交互器选中(抓取)时,将跟随其移动,并在释放时继承其速度。

2、核心功能与特点
物理驱动的抓取
- 支持 运动学抓取(Kinematic) 和 物理力抓取(Velocity Tracking) 两种模式,适应不同物理模拟需求。
- 抓取时自动将物体绑定到交互器的
Attach Transform
,确保位置对齐。
投掷与惯性模拟
- 释放物体时,根据交互器的运动速度施加线速度和角速度,模拟真实投掷效果。
- 可配置速度缩放比例(
Velocity Scale
和Angular Velocity Scale
)。
多交互器协同
- 支持 双手抓取 (需启用
Allow Multiple Selection
),允许多个交互器共同控制同一物体(如双手调整物体旋转)。
抓取条件过滤
- 通过 标签(Tag) 、脚本接口(IXRSelectFilter) 或 自定义逻辑 限制可抓取的交互器类型。
事件与反馈
- 提供
OnSelectEntered
、OnSelectExited
等事件,支持抓取/释放时的音效、粒子特效等反馈。
3、组件配置详解
交互属性表
属性 | 描述 |
---|---|
交互管理器 (Interaction Manager) | 此可交互对象关联的 XRInteractionManager(将与其通信) |
交互层遮罩 (Interaction Layer Mask) | 允许与交互层遮罩重叠的交互器进行交互 |
碰撞体 (Colliders) | 用于与此可交互对象交互的碰撞体(若为空,则使用所有子碰撞体) |
距离计算模式 (Distance Calculation Mode) | 定义如何计算与交互器的距离(从最快到最精确): - 变换位置 (Transform Position) :使用可交互对象的变换位置计算距离(性能最佳,但精度可能较低) - 碰撞体位置 (Collider Position) :使用碰撞体列表中最短距离点(中等性能,中等精度) - 碰撞体体积 (Collider Volume):计算碰撞体表面或内部的最短距离(性能消耗最高,精度最高) |
自定义光标 (Custom Reticle) | 有效时显示在线条末端的指示符 |
选择模式 (Select Mode) | 控制可交互对象的选择策略: - 单选 (Single) :同一时间仅允许一个交互器选择 - 多选 (Multiple):允许多个交互器同时选择 |
聚焦模式 (Focus Mode) | 定义可交互对象的聚焦策略: - 无 (None) :禁用聚焦状态 - 单组 (Single) :允许单个交互组的交互器聚焦 - 多组 (Multiple):允许多个交互组的交互器聚焦 |
凝视交互属性表
属性 | 描述 |
---|---|
允许凝视交互 (Allow Gaze Interaction) | 启用来自 XRGazeInteractor 的基础交互事件 |
允许凝视选择 (Allow Gaze Select) | 允许通过凝视交互器进行选择 |
覆盖凝视选择时间 (Override Gaze Time To Select) | 允许覆盖 XRGazeInteractor 的悬停选择时间 |
凝视选择时间 (Gaze Time To Select) | XRGazeInteractor 悬停触发选择所需的秒数 |
覆盖自动取消选择时间 (Override Time To Auto Deselect) | 允许覆盖 XRGazeInteractor 的自动取消选择时间 |
自动取消选择时间 (Time To Auto Deselect) | 被凝视选择后自动取消选择的秒数 |
允许凝视辅助 (Allow Gaze Assistance) | 启用后,XRGazeInteractor 会生成 XRInteractableSnapVolume 辅助射线交互器吸附 |
运动控制属性表
属性 | 描述 |
---|---|
运动类型 (Movement Type) | 定义对象被选中时的移动方式: - 速度跟踪 (Velocity Tracking) :通过设置刚体速度移动(允许穿透无刚体的碰撞体,但移动延迟较高) - 运动学 (Kinematic) :通过物理更新移动刚体(保持物理同步,允许碰撞) - 瞬时 (Instantaneous):直接更新变换位置(延迟最低,但可能穿透碰撞体) |
保留父级变换 (Retain Transform Parent) | 释放对象时恢复其原始父级 |
跟踪参数表
属性 | 描述 |
---|---|
跟踪位置/旋转/缩放 (Track Position/Rotation/Scale) | 启用后跟随交互器的位置/旋转/缩放 |
平滑参数 (Smooth Position/Rotation/Scale) | 启用平滑过渡 |
平滑强度 (Smooth Amount) | 平滑过渡的强度系数(值越大跟随越紧密) |
收紧参数 (Tighten) | 限制平滑过渡的最大偏移(0为无限制,1为完全收紧) |
速度阻尼/缩放 (Velocity Damping/Scale) | 速度跟踪模式下对线速度的阻尼和缩放系数 |
角速度阻尼/缩放 (Angular Velocity Damping/Scale) | 速度跟踪模式下对角速度的阻尼和缩放系数 |
抛出与附加属性表
属性 | 描述 |
---|---|
分离时抛出 (Throw On Detach) | 释放时继承交互器的速度 |
抛出平滑参数 (Throw Smoothing) | 速度计算的平滑时长和曲线 |
抛出速度缩放 (Throw Velocity Scale) | 线速度和角速度的缩放系数 |
强制重力 (Force Gravity On Detach) | 释放时强制启用重力 |
附加变换 (Attach Transform) | 交互时的附着点(默认使用对象自身原点) |
动态附加 (Use Dynamic Attach) | 根据交互器姿态动态计算附着点 |
匹配位置/旋转 (Match Position/Rotation) | 初始化抓取时对齐交互器的附着点 |
吸附到碰撞体 (Snap To Collider Volume) | 保持动态附着点在碰撞体表面/内部 |
附加缓动时间 (Attach Ease In Time) | 抓取时的缓动时间(0表示立即附加) |
高级配置表
属性 | 描述 |
---|---|
抓取变换器 (Grab Transformers) | 单/多交互器抓取时的变换器配置 |
交互过滤器 (Interactable Filter) | 为交互器分配悬停/选择/交互强度过滤器 |
交互事件 (Interactable Events) | 可交互对象的事件回调配置 |
4、事件系统与脚本交互
XR Grab Interactable 的事件可通过 Unity Event 或 脚本动态监听 实现。以下是典型用法:
1. 抓取时播放音效
cs
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
public class GrabFeedback : MonoBehaviour
{
public AudioClip grabSound;
private XRGrabInteractable grabInteractable;
void Start()
{
grabInteractable = GetComponent<XRGrabInteractable>();
grabInteractable.onSelectEntered.AddListener(PlayGrabSound);
}
private void PlayGrabSound(XRBaseInteractor interactor)
{
AudioSource.PlayClipAtPoint(grabSound, transform.position);
}
}
2. 抓取后锁定物体旋转
cs
grabInteractable.onSelectEntered.AddListener(interactor =>
{
Rigidbody rb = grabInteractable.GetComponent<Rigidbody>();
rb.constraints = RigidbodyConstraints.FreezeRotation;
});
5、与其他组件的协作
与 Rigidbody 的集成
- 若使用
Velocity Tracking
模式,物体必须附加Rigidbody
组件。 - 调整
Rigidbody
的Mass
、Drag
参数优化运动效果。
与 XR Interaction Group 的协同
- 使用
XR Interaction Group
管理多个抓取交互器的优先级(如双手抓取时动态分配控制权重)。
与 XR Socket Interactor 的联动
- 物体被抓取后,可插入
XR Socket Interactor
插槽(如钥匙归位)。
6、实际应用场景
场景1:物理抓取与投掷
- 为物体添加
XRGrabInteractable
和Rigidbody
。 - 设置
Movement Type
为 Velocity Tracking ,调整Velocity Scale
为 1.5(增强投掷力度)。 - 监听
OnSelectExited
事件,根据手柄速度赋予物体动能。
场景2:双手协同操作
- 启用
Allow Multiple Selection
。 - 双手抓取物体时,计算两交互器的平均位置和旋转,动态更新物体姿态:
cs
void Update()
{
if (grabInteractable.interactorsSelecting.Count == 2)
{
Vector3 avgPos = (interactor1.attachTransform.position + interactor2.attachTransform.position) / 2;
Quaternion avgRot = Quaternion.Lerp(interactor1.attachTransform.rotation, interactor2.attachTransform.rotation, 0.5f);
transform.position = avgPos;
transform.rotation = avgRot;
}
}
场景3:可破坏物体
- 监听
OnSelectEntered
事件,检测抓取力度:
cs
public float breakForce = 10.0f;
private void OnGrab(XRBaseInteractor interactor)
{
float grabSpeed = interactor.GetVelocity().magnitude;
if (grabSpeed > breakForce)
{
Destroy(gameObject); // 物体被抓碎
}
}
7、高级用法与优化
自定义抓取条件
- 继承
XRGrabInteractable
,重写IsSelectableBy
方法:
cs
public class CustomGrab : XRGrabInteractable
{
public string requiredTag = "PlayerHand";
public override bool IsSelectableBy(IXRSelectInteractor interactor)
{
return interactor.CompareTag(requiredTag) && base.IsSelectableBy(interactor);
}
}
动态调整抓取参数
- 根据物体状态(如被浸泡在水中)修改物理属性:
cs
void Update()
{
if (isUnderwater)
{
GetComponent<Rigidbody>().drag = 5.0f; // 增加阻力
velocityScale = 0.5f; // 降低投掷速度
}
}
抓取动画与特效
- 使用
OnSelectEntered
触发抓取动画(如手柄振动、物体高亮)。 - 结合
Particle System
实现抓取/释放时的粒子特效。
8、常见问题与解决
问题:抓取后物体抖动
解决:
- 启用
Rigidbody
的插值(Interpolate)。 - 降低
Velocity Tracking
的平滑时间。
问题:投掷力度不足
调整:
- 增加
Velocity Scale
或检查手柄速度计算逻辑。
问题:多抓取时物体偏移
优化:
- 调整
Attach Ease In Time
或手动计算双手平均位置。