目录
一、插件介绍
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
1、组件介绍
Unity XR Interactable 是 XR Interaction Toolkit 中用于标记物体为 可交互对象 的核心组件,定义了物体如何响应交互器(如手柄、射线、视线)的操作(如抓取、悬停、激活)。它是所有交互行为的“接收方”,为开发者提供了灵活的事件系统和属性配置,是构建 XR 交互逻辑的基础。
2、核心功能与特点
交互类型支持
- 支持多种交互行为:悬停(Hover)、选中(Select)、激活(Activate)、焦点(Focus) 等。
- 可配置交互的触发条件(如仅允许特定类型的交互器操作)。
事件驱动设计
- 提供丰富的回调事件(如
OnHoverEntered
、OnSelectExited
),便于监听和响应交互状态变化。 - 支持通过 Unity Event 或脚本绑定自定义逻辑。
物理与运动控制
- 与 Unity 物理引擎深度集成,支持基于物理的抓取、投掷、碰撞反馈。
- 可配置物体的运动模式(如运动学抓取或物理模拟)。
可扩展性
- 作为基类,派生出多种专用交互组件(如
XR Grab Interactable
、XR Simple Interactable
)。 - 允许通过继承和重写方法实现自定义交互逻辑。
3、组件配置详解
在 Inspector 面板中,XR Interactable 的关键属性如下:
1. 基础配置
Interaction Manager
- 绑定的交互管理器(默认为场景中的
XR Interaction Manager
)。
Interaction Layer Mask
- 指定可与此物体交互的层级,过滤无关的交互器。
Colliders
- 手动指定用于检测交互的碰撞体列表(默认自动获取物体及其子物体的所有碰撞体)。
2. 交互行为配置
Interactable Events
OnFirstHoverEntered
:首次悬停时触发。OnLastHoverExited
:最后一个悬停离开时触发。OnSelectEntered
/OnSelectExited
:选中开始/结束。OnActivate
/OnDeactivate
:激活/取消激活(如按下扳机键)。
Filters
- Hover Filters / Select Filters:通过脚本接口(
IXRHoverFilter
、IXRSelectFilter
)过滤交互器。 - 示例:仅允许带有特定标签的交互器悬停或选中物体。
3. 高级配置
Allow Multiple Selection
- 是否允许多个交互器同时选中该物体(如双手抓取)。
Custom Reticle
- 自定义悬停或选中时显示的光标预制体(如高亮图标)。
4、事件系统与脚本交互
XR Interactable 提供的事件可通过 Inspector 面板直接绑定 或 脚本动态监听。以下是典型用法:
1. 通过 Unity Event 绑定
在 Inspector 面板中,将事件(如
OnSelectEntered
)拖拽到目标脚本方法。
示例:抓取物体时播放音效。
2. 通过脚本监听事件
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
public class InteractableDemo : MonoBehaviour
{
private XRBaseInteractable interactable;
void Start()
{
interactable = GetComponent<XRBaseInteractable>();
interactable.onSelectEntered.AddListener(OnGrabbed);
interactable.onHoverEntered.AddListener(OnHoverStart);
}
private void OnGrabbed(XRBaseInteractor interactor)
{
Debug.Log($"{interactor.name} 抓取了 {interactable.name}");
}
private void OnHoverStart(XRBaseInteractor interactor)
{
GetComponent<Renderer>().material.color = Color.red;
}
}
5、与其他组件的协作
与 XR Interactor 的交互
XR Interactor
(如 XR Direct Interactor
)检测到 XR Interactable
后,触发其事件。
- 例如:当手柄靠近物体时,
XR Interactable
的OnHoverEntered
事件被触发。
与 XR Interaction Manager 的协同
XR Interaction Manager
管理所有交互器和可交互对象的注册与事件分发。
- 例如:当一个交互器选中物体时,管理器确保冲突的正确处理。
与物理系统的集成
若物体需要物理反馈(如投掷),需附加 Rigidbody
组件,并配置 XR Grab Interactable
的运动模式:
- Kinematic:直接控制物体位置(无物理模拟)。
- Velocity Tracking:通过力或速度驱动物体(模拟物理抓取)。
6、实际应用场景
场景1:基础抓取与释放
- 为物体添加
XR Grab Interactable
(继承自XR Interactable
)。 - 配置
OnSelectEntered
事件:抓取时缩小物体。 - 配置
OnSelectExited
事件:释放时恢复原大小并施加投掷力。
场景2:悬停高亮与提示
- 监听
OnHoverEntered
事件:悬停时显示发光材质。 - 监听
OnHoverExited
事件:隐藏发光效果。
场景3:条件过滤交互
- 创建自定义
IXRSelectFilter
脚本:仅允许带有 "Key" 标签的交互器抓取物体。 - 将过滤器添加到
XR Interactable
的 Select Filters 列表。
7、子类与扩展
XR Interactable 作为基类,派生出多种专用交互组件:
XR Grab Interactable
- 扩展抓取功能,支持 运动学抓取 或 物理抓取。
- 可配置抓取附着力、投掷速度比例。
XR Simple Interactable
- 轻量级交互,仅响应悬停和基础选中事件(无物理抓取)。
- 适用于按钮、开关等简单交互。
8、优化与调试技巧
性能优化
- 减少
XR Interactable
对象的碰撞体复杂度(使用简单形状碰撞体)。 - 通过
Interaction Layer Mask
过滤不必要的交互检测。
调试工具
- 启用
XR Interactable
的调试模式(Gizmos),可视化交互范围。 - 使用
Debug.Log
输出交互事件参数:
interactable.onSelectEntered.AddListener((interactor) =>
Debug.Log($"选中者:{interactor.name}, 物体:{interactable.name}"));
输入防抖
- 为悬停事件添加延迟触发(通过脚本控制),避免快速移动时的误触。
9、常见问题与解决
问题:物体无法被交互
检查步骤:
- 确认物体附加了
XR Interactable
或其子类组件。 - 检查
Interaction Layer Mask
是否允许当前交互器的层级。 - 验证碰撞体是否正确设置(非Trigger类型)。
问题:抓取后物体位置偏移
解决:
- 调整
XR Grab Interactable
的Attach Transform
位置。 - 检查物体的
Rigidbody
是否被其他力干扰。
问题:事件未触发
排查方向:
- 确保事件回调方法为
public
或在脚本中动态注册。 - 检查交互器与可交互对象的
Interaction Manager
是否一致。