目录
一、插件介绍
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
1、组件介绍
Unity XR Simple Interactable 是 XR Interaction Toolkit 中用于实现 轻量级交互 的核心组件,适用于无需物理抓取或复杂运动控制的场景(如按钮点击、开关触发、信息提示)。它继承自 XRBaseInteractable
,仅提供基础的悬停(Hover)和选中(Select)事件响应,是快速搭建简单交互逻辑的理想选择。
这是交互对象(Interactable object)的最简版本。它仅提供了XRBaseInteractable的具体实现,旨在用于在无底层交互行为(underlying interaction behavior)的情况下响应交互事件(interaction events)。
2、核心功能与特点
轻量级交互
- 仅支持 悬停(Hover) 和 选中(Select) 两种基础交互事件,适用于点击、触摸等简单操作。
- 无需物理组件(如
Rigidbody
),资源消耗低。
快速配置
- 通过 Inspector 面板直接绑定事件回调,无需编写脚本即可实现基本功能(如按钮点击播放音效)。
- 与 Unity UI 系统无缝集成,支持射线或直接触摸交互。
无障碍兼容
- 适配手柄、射线、视线(Gaze)等多种交互方式,确保不同设备的统一体验。
事件驱动设计
- 提供
OnHoverEntered
、OnSelectEntered
等事件,支持灵活的逻辑扩展。
3、组件配置详解
属性 | 描述 |
---|---|
Interaction Manager | 该可交互对象(Interactable)关联的 XRInteractionManager (若未指定,会自动查找可用实例)。 |
Interaction Layer Mask | 允许与特定交互层(Interaction Layer)的交互器(Interactor)发生交互。仅当交互器的交互层遮罩与此处设置的层存在交集时,交互才会生效。 |
Colliders | 用于与此可交互对象交互的碰撞体(若未指定,默认使用所有子级碰撞体)。 |
Custom Reticle | 当交互有效时,在线条末端显示的自定义标线。 |
Select Mode | 定义可交互对象的选择策略,控制同时可选中它的交互器数量。注意:此值仅在尝试选择时由交互管理器读取,因此从 Multiple 切换为 Single 不会强制退出已存在的选择。 |
Single | 设置为 Single 时,禁止同时被多个交互器选中。 |
Multiple | 设置为 Multiple 时,允许多个交互器同时选中此可交互对象。 |
Allow Gaze Interaction | 启用后,允许来自 XRGazeInteractor 的基础交互事件及其他凝视功能。 |
Allow Gaze Select | 启用后,允许 XRGazeInteractor 通过凝视选择此对象。 |
Override Gaze Time To Select | 启用后,此可交互对象可覆盖 XRGazeInteractor 的默认悬停选择时间。 |
Gaze Time To Select | 当凝视交互器启用 Hover To Select 时,XRGazeInteractor 需悬停在此对象上的时间(秒)才能触发选择。 |
Override Time To Auto Deselect | 启用后,此可交互对象可覆盖 XRGazeInteractor 的默认自动取消选择时间。 |
Time To Auto Deselect | 当凝视交互器启用 Auto Deselect 时,此对象被选中后将在指定时间(秒)后自动取消选择。 |
Allow Gaze Assistance | 启用后,XRGazeInteractor 会为此可交互对象生成 XR Interactable Snap Volume ,使配置正确的 XR Ray Interactor 可吸附到此对象。需参考 XR Interactable Snap Volume 或 XR Ray Interactor 进行配置。 |
Interactable Events | 详见可交互事件页面。 |
4、事件系统与脚本交互
XR Simple Interactable 的事件可通过 Unity Event 或 脚本动态监听 实现。以下是典型用法:
1. 直接通过 Inspector 绑定
-
将
OnSelectEntered
事件拖拽到目标脚本方法,例如:-
点击按钮时播放音效
AudioSource.Play()
。 -
悬停时显示提示文本
TextMeshPro.SetActive(true)
。
-
2. 通过脚本监听事件
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
public class SimpleButton : MonoBehaviour
{
private XRSimpleInteractable simpleInteractable;
void Start()
{
simpleInteractable = GetComponent<XRSimpleInteractable>();
simpleInteractable.onSelectEntered.AddListener(OnButtonPressed);
}
private void OnButtonPressed(XRBaseInteractor interactor)
{
Debug.Log($"按钮被 {interactor.name} 按下!");
GetComponent<Renderer>().material.color = Color.green;
}
}
5、与其他组件的协作
与 XR Interactor 的交互
XR Ray Interactor
或XR Gaze Interactor
检测到XR Simple Interactable
后,触发其事件。- 例如:射线指向按钮时悬停高亮,按下手柄 Trigger 键触发点击。
与 UI 系统的集成
- 在 Canvas 元素上添加
XR Simple Interactable
,结合Tracked Device Graphic Raycaster
实现 VR 中的 UI 交互。 - 示例:滑动条(Slider)的拖拽操作可通过监听
OnSelectEntered
和手柄移动实现。
与音效/粒子系统的联动
- 通过事件触发
AudioSource
或ParticleSystem
,增强交互反馈。 - 例如:悬停时播放提示音,选中时触发爆炸特效。
6、实际应用场景
场景1:VR 菜单按钮
- 创建 3D 按钮模型,添加
XR Simple Interactable
。 - 配置
OnSelectEntered
事件:调用SceneManager.LoadScene()
切换场景。 - 悬停时通过
OnHoverEntered
缩放按钮,提供视觉反馈。
场景2:信息提示板
- 在物体上附加
XR Simple Interactable
。 - 当用户悬停时(
OnHoverEntered
),显示隐藏的提示文本。 - 离开时(
OnHoverExited
)隐藏文本。
场景3:虚拟控制面板
- 创建多个按钮,每个按钮绑定不同的
OnSelectEntered
事件。 - 使用射线交互选中按钮,触发对应功能(如打开门、启动机器)。
7、与 XR Grab Interactable 的对比
特性 | XR Simple Interactable | XR Grab Interactable |
---|---|---|
交互类型 | 悬停、选中(无物理抓取) | 悬停、抓取、投掷(支持物理模拟) |
物理依赖 | 无需 Rigidbody |
需要 Rigidbody 实现物理运动 |
适用场景 | 按钮、开关、UI 元素 | 可抓取的物体(如杯子、工具) |
事件复杂度 | 简单事件(Hover/Select) | 复杂事件(抓取、释放、激活) |
性能开销 | 低 | 中高(依赖物理计算) |
8、高级用法与优化
动态条件过滤
- 继承
XRSimpleInteractable
,重写IsSelectableBy
方法,实现基于条件的交互限制:
public class LockedButton : XRSimpleInteractable
{
public bool isLocked = true;
public override bool IsSelectableBy(IXRSelectInteractor interactor)
{
return !isLocked && base.IsSelectableBy(interactor);
}
}
多交互器协同
- 使用
XR Interaction Group
管理多个交互器对同一XR Simple Interactable
的操作(如双手同时点击按钮)。
性能优化
- 合并多个简单交互对象的碰撞体,减少检测计算量。
- 为低频交互对象禁用
XR Simple Interactable
,按需激活。
9、常见问题与解决
问题:悬停或选中事件未触发
检查步骤:
- 确认物体附加了
XR Simple Interactable
组件。 - 检查
Interaction Layer Mask
是否允许当前交互器的层级。 - 确保碰撞体未被设置为
Trigger
(除非交互器支持触发器检测)。
问题:UI 按钮无法点击
解决:
- 在 Canvas 上添加
Tracked Device Graphic Raycaster
组件。 - 确保 UI 元素的
Raycast Target
已启用。
问题:多选功能异常
排查方向:
- 确认
Allow Multiple Selection
已启用。 - 检查交互器是否支持同时选中多个对象。