Unity XR-XR Interaction Toolkit开发使用方法(十三)组件介绍(XR Grab Interactable)
目录
一、插件介绍
二、主要组件
XR Interaction Manager
XR Controller
XR Interactor
XR Direct Interactor
XR Ray Interactor
XR Socket Interactor
XR Gaze Interactor
XR Interaction Group
XR Interactable
XR Simple Interactable
三、XR Grab Interactable
1、组件介绍
2、核心功能与特点
物理驱动的抓取
投掷与惯性模拟
多交互器协同
抓取条件过滤
事件与反馈
3、组件配置详解
交互属性表
凝视交互属性表
运动控制属性表
跟踪参数表
抛出与附加属性表
高级配置表
4、事件系统与脚本交互
1. 抓取时播放音效
2. 抓取后锁定物体旋转
5、与其他组件的协作
与 Rigidbody 的集成
与 XR Interaction Group 的协同
与 XR Socket Interactor 的联动
6、实际应用场景
场景1:物理抓取与投掷
场景2:双手协同操作
场景3:可破坏物体
7、高级用法与优化
自定义抓取条件
动态调整抓取参数
抓取动画与特效
8、常见问题与解决
问题:抓取后物体抖动
问题:投掷力度不足
问题:多抓取时物体偏移
一、插件介绍
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. 抓取时播放音效
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. 抓取后锁定物体旋转
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
。 - 双手抓取物体时,计算两交互器的平均位置和旋转,动态更新物体姿态:
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
事件,检测抓取力度:
public float breakForce = 10.0f;
private void OnGrab(XRBaseInteractor interactor)
{
float grabSpeed = interactor.GetVelocity().magnitude;
if (grabSpeed > breakForce)
{
Destroy(gameObject); // 物体被抓碎
}
}
7、高级用法与优化
自定义抓取条件
- 继承
XRGrabInteractable
,重写IsSelectableBy
方法:
public class CustomGrab : XRGrabInteractable
{
public string requiredTag = "PlayerHand";
public override bool IsSelectableBy(IXRSelectInteractor interactor)
{
return interactor.CompareTag(requiredTag) && base.IsSelectableBy(interactor);
}
}
动态调整抓取参数
- 根据物体状态(如被浸泡在水中)修改物理属性:
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
或手动计算双手平均位置。