Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR 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
1、组件介绍
2、核心功能与特点
交互类型支持
事件驱动设计
物理与运动控制
可扩展性
3、组件配置详解
1. 基础配置
Interaction Manager
Interaction Layer Mask
Colliders
2. 交互行为配置
Interactable Events
Filters
3. 高级配置
Allow Multiple Selection
Custom Reticle
4、事件系统与脚本交互
1. 通过 Unity Event 绑定
2. 通过脚本监听事件
5、与其他组件的协作
与 XR Interactor 的交互
与 XR Interaction Manager 的协同
与物理系统的集成
6、实际应用场景
场景1:基础抓取与释放
场景2:悬停高亮与提示
场景3:条件过滤交互
7、子类与扩展
XR Grab Interactable
XR Simple Interactable
8、优化与调试技巧
性能优化
调试工具
输入防抖
9、常见问题与解决
问题:物体无法被交互
问题:抓取后物体位置偏移
问题:事件未触发
一、插件介绍
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
是否一致。