目录
一、插件介绍
二、主要组件
XR Interaction Manager
XR Controller
XR Interactor
XR Direct Interactor
三、XR Ray Interactor
1、组件介绍
2、核心功能与特点
射线检测与交互
多模式交互支持
视觉反馈定制
事件驱动逻辑
3、组件配置详解
4、工作原理
射线生成
碰撞检测
交互响应
视觉更新
5、事件系统与脚本交互
示例脚本:动态调整射线颜色
6、与其他组件的协作
与 XR Controller 的输入绑定
与 XR Interaction Manager 的协调
与 Teleportation 组件的集成
7、实际应用场景
场景1:UI 菜单交互
场景2:远距离抓取物体
场景3:抛物线传送
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
1、组件介绍
Unity XR Ray Interactor 是 XR Interaction Toolkit 中用于实现 射线交互 的核心组件,允许用户通过手柄或控制器发射射线,远距离选择、操作物体或与UI元素交互。它广泛用于菜单导航、远距离抓取、传送等场景,是构建非接触式沉浸交互的核心工具。
用于远距离与 Interactables 交互的 Interactor。这是通过光线投射处理的,光线投射会更新此交互器的当前有效目标集。
2、核心功能与特点
射线检测与交互
- 从指定起点(如手柄尖端)发射射线,检测路径上的
XR Interactable
对象或 UI 元素。 - 支持 直线射线 和 曲线抛物线射线(如弧形轨迹),适应不同交互需求。
多模式交互支持
- 物体选择:通过射线选中并抓取远处物体(需结合
XR Grab Interactable
)。 - UI 操作:与 Unity Canvas 交互(如点击按钮、滑动条)。
- 传送锚点:配合
Teleportation Area
实现玩家瞬移。
视觉反馈定制
- 可自定义射线外观(颜色、长度、终点标记),增强用户体验。
- 支持动态调整射线终点位置(如吸附到物体表面或UI元素)。
事件驱动逻辑
- 提供
OnHoverEntered
、OnSelectEntered
等事件,响应悬停、选中、激活等操作。
3、组件配置详解
Property | Description |
---|---|
Interaction Manager | 该交互器将与之通信的XRInteractionManager(如果未指定,将自动查找一个)。 |
Interaction Layer Mask | 允许与可交互对象交互,前提是它们的交互层遮罩与此处设置的任何层有重叠。 |
Enable Interaction with UI GameObjects | 启用后,允许该交互器影响UI。 |
Force Grab | 强制抓取将对象移动到手中,而非远程交互。 |
Anchor Control | 允许用户使用摇杆移动附着锚点。 |
Translate Speed | 锚点平移的速度。仅在启用锚点控制时使用和显示。 |
Rotate Reference Frame | 定义旋转锚点时上轴的可选参考系。未设置时,绕附着变换的局部上轴旋转。仅在启用锚点控制时使用和显示。 |
Rotation Mode | 指定锚点旋转的控制方式。仅在启用锚点控制时使用和显示。 |
Rotate Over Time | 将旋转模式设为"随时间旋转"可在旋转输入激活时随时间控制锚点旋转。 |
Match Direction | 将旋转模式设为"匹配方向"可使锚点旋转与二维旋转输入方向一致。 |
Rotate Speed | 锚点旋转的速度。仅在启用锚点控制且旋转模式设为"随时间旋转"时使用和显示。 缩放模式 决定可交互对象如何使用缩放值。 |
Scale Mode | 决定可交互对象如何使用缩放值。 |
Attach Transform | 用作可交互对象附着点的变换。 若未设置,在Awake时自动实例化并设置。 修改此值不会自动销毁之前的对象。 |
Ray Origin Transform | 射线投射的起始位置和方向。 若未设置且在Awake时初始化,将使用XRBaseInteractor.attachTransform的姿态。修改此值不会自动销毁之前的对象。 |
Disable Visuals When Blocked In Group | 当本交互器属于交互组且因组内其他交互器活跃而无法交互时,是否禁用视觉效果。 |
Line Type | 射线投射类型。 |
Straight Line | 设为"直线"类型可向场景投射固定长度的单条射线。 |
Projectile Curve | 设为"抛物线"类型可通过弹道采样生成抛物线轨迹。 |
Bezier Curve | 设为"贝塞尔曲线"类型可使用控制点和终点创建二次贝塞尔曲线。 |
Max Raycast Distance | 仅在直线类型时使用和显示。 增加该值可使射线延伸更远。 |
Reference Frame | 仅在抛物线或贝塞尔曲线类型时使用和显示。 定义地平面和上方向的曲线参考系。若未设置,启动时将尝试查找XROrigin.Origin游戏对象,若不存在则默认使用全局上方向和原点。 |
Velocity | 仅在抛物线类型时使用和显示。抛物线的初始速度。 增加该值可使曲线延伸更远。 |
Acceleration | 仅在抛物线类型时使用和显示。 抛物线在参考系中的重力值。 |
Additional Ground Height | 仅在抛物线类型时使用和显示。 抛物线在调整后地面高度下继续延伸的额外高度。增加该值可使终点高度更低。 |
Additional Flight Time | 仅在抛物线类型时使用和显示。 抛物线到达调整地面后的额外飞行时间。增加该值可使终点高度更低。 |
Sample Frequency | 仅在抛物线或贝塞尔曲线类型时使用和显示。 Unity用于近似曲线路径的采样点数。值越大近似质量越高,但射线检测次数增加会影响性能。 值n将产生n-1个线段。直线类型不使用此属性(有效值始终为2)。 |
End Point Distance | 仅在贝塞尔曲线类型时使用和显示。 增加该值可使曲线终点远离起点。 |
End Point Height | 仅在贝塞尔曲线类型时使用和显示。 减少该值可使曲线终点相对于起点更低。 |
Control Point Distance | 仅在贝塞尔曲线类型时使用和显示。 增加该值可使曲线峰值点远离起点。 |
Control Point Height | 仅在贝塞尔曲线类型时使用和显示。 增加该值可使曲线峰值点相对于起点更高。 |
Raycast Mask | 用于限制射线检测目标的层遮罩。 |
Raycast Trigger Interaction | 通过射线与触发器碰撞体的交互类型。 |
Raycast Snap Volume Interaction | 是否在射线检测中包含/忽略捕捉体积触发器碰撞体(即使射线设置为忽略触发器)。若不使用注视辅助或XR可交互捕捉体积组件,建议设为忽略以提高性能。 |
Hit Detection Type | 射线检测使用的碰撞检测类型。 |
Raycast | 使用物理射线检测碰撞 |
Sphere Cast | 使用物理球体检测碰撞 |
Cone Cast | 使用锥形检测碰撞 |
Hit Closest Only | 是否仅将最近的可交互对象视为有效目标。 启用后仅最近对象接收悬停事件,否则所有命中的可交互对象均有效(多悬停)。 |
Blend Visual Line Points | 将射线检测采样点与控制器当前姿态混合。用于保持视觉连线与控制器同步(避免延迟)。 当控制器配置为渲染前直接采样输入以减少延迟时,控制器可能与射线曲线起点存在位姿差异。 设为false时视觉线保持固定参考系,不会向射线末端弯曲。 |
Select Action Trigger | 选择 Unity 如何解释来自控制器的选择输入操作。控制不同的输入风格,以确定此交互器是否可以进行选择,例如按钮是当前被按下还是仅切换活动状态。当此设置为“State”且多个交互器选择设置为“InteractableSelectMode”.Single的可交互对象时,你可能会遇到不期望的行为,即每个帧中可交互对象的选择在交互器之间来回传递。这也可能导致选择交互事件在每个帧触发。通过将其设置为“State Change”可以解决此问题,这是默认且推荐的选项。 |
State | 按住按钮期间视为激活。允许提前按住按钮并在可交互时触发。 |
State Change | 仅在按下按钮的帧激活,成功后保持至释放。必须在可交互时按下才能触发。 |
Toggle | 首次按下开始交互,第二次按下结束。 |
Sticky | 按下开始,释放第二次时结束。 |
Keep Selected Target Valid | 初始选择后是否持续选中(即使目标不再有效)。 启用后XR交互管理器保留选择(即使目标不在有效列表)。禁用时若目标不在列表则清除选择。 典型用例:传送射线交互器在不指向目标时取消选择。 |
Hide Controller On Select | 控制选择时是否隐藏控制器模型。 |
Allow Hovered Activate | 控制当无当前选择时,是否向悬停(未选中)的可交互对象发送激活事件。默认仅向选中对象发送。 |
Target Track Mode | 指定应在"待选目标"属性中跟踪多少个可交互对象(适用于自定义反馈)。选项按性能最优顺序排列。 |
Hover To Select | 启用后,交互器悬停一段时间后自动选择可交互对象(若启用UI交互则包括UI)。 |
Hover Time To Select | 悬停多少秒后自动选择(秒)。 |
Auto Deselect | 启用后,交互器在选择一段时间后自动取消选择。 |
Time To Auto Deselect | 自动取消选择前需保持选择的秒数(当自动取消选择启用时)。 |
Starting Selected Interactable | 启动时自动选择的可交互对象(可选,可为空)。 |
Audio Events | 与下方交互器事件共享选择/悬停事件,提供便捷的音频播放配置。 |
On Select Entered | 启用后,编辑器显示音频剪辑配置界面(选择开始时播放) |
On Select Exited | 启用后,编辑器显示音频剪辑配置界面(成功退出选择时播放) |
On Select Canceled | 启用后,编辑器显示音频剪辑配置界面(选择取消时播放) |
On Hover Entered | 启用后,编辑器显示音频剪辑配置界面(悬停开始时播放) |
On Hover Exited | 启用后,编辑器显示音频剪辑配置界面(成功结束悬停时播放) |
On Hover Canceled | 启用后,编辑器显示音频剪辑配置界面(悬停取消时播放) |
Allow Hover Audio While Selecting | 当前选中悬停对象时是否允许播放悬停音频(默认启用)。 |
Haptic Events | 与交互器事件共享选择/悬停事件,提供震动反馈配置: |
On Select Entered | 启用后,编辑器显示持续时间(秒)和强度(标准化)配置界面(选择开始时震动反馈) |
On Select Exited | 启用后,编辑器显示配置界面(成功退出选择时震动反馈) |
On Select Canceled | 启用后,编辑器显示配置界面(选择取消时震动反馈) |
On Hover Entered | 启用后,编辑器显示配置界面(悬停开始时震动反馈) |
On Hover Exited | 启用后,编辑器显示配置界面(成功结束悬停时震动反馈) |
On Hover Canceled | 启用后,编辑器显示配置界面(悬停取消时震动反馈) |
Allow Hover Haptics While Selecting | 当前选中悬停对象时是否允许悬停震动反馈(默认启用)。 |
Interactor Events | 参见交互器事件页面。 |
4、工作原理
射线生成
- 每帧从
Ray Origin
位置发射射线,根据Line Type
生成轨迹(直线或曲线)。
碰撞检测
- 检测射线路径上的
Interactable
对象或 UI 元素,筛选符合Layer Mask
的目标。
交互响应
- 当用户按下绑定的输入(如 Trigger 键),触发
Select
动作: - 若目标是物体:尝试抓取(需物体有
XR Grab Interactable
)。 - 若目标是 UI:触发点击事件(如按钮
OnClick
)。
视觉更新
- 动态调整射线轨迹和终点位置,提供实时反馈。
5、事件系统与脚本交互
XR Ray Interactor 提供以下关键事件:
事件 | 触发时机 | 典型应用 |
---|---|---|
OnHoverEntered | 射线首次悬停在目标上时 | 显示提示信息、高亮物体 |
OnHoverExited | 射线离开目标时 | 隐藏提示、取消高亮 |
OnSelectEntered | 射线选中目标时(如按下按钮) | 抓取物体、触发UI点击事件 |
OnSelectExited | 释放目标时 | 释放物体、重置UI状态 |
OnActivate | 激活操作时(如按下扳机键) | 执行特殊功能(如确认传送) |
示例脚本:动态调整射线颜色
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;public class RayColorChanger : MonoBehaviour
{public XRRayInteractor rayInteractor;public Color hoverColor = Color.yellow;private Color defaultColor;void Start(){defaultColor = rayInteractor.lineColor;rayInteractor.onHoverEntered.AddListener(SetHoverColor);rayInteractor.onHoverExited.AddListener(ResetColor);}void SetHoverColor(XRBaseInteractable interactable){rayInteractor.lineColor = hoverColor;}void ResetColor(XRBaseInteractable interactable){rayInteractor.lineColor = defaultColor;}
}
6、与其他组件的协作
与 XR Controller 的输入绑定
XR Controller
的Select Action
(如 Trigger 键)触发射线选择动作。Activate Action
可用于额外功能(如确认传送)。
与 XR Interaction Manager 的协调
- 管理射线交互与其他交互器(如
XR Direct Interactor
)的优先级冲突。
与 Teleportation 组件的集成
- 配合
Teleportation Area
和Teleportation Anchor
,实现射线指向传送:
public XRRayInteractor rayInteractor;
public TeleportationProvider teleportationProvider;void OnSelectEntered(SelectEnterEventArgs args)
{if (rayInteractor.TryGetCurrent3DRaycastHit(out RaycastHit hit)){TeleportRequest request = new TeleportRequest(){destinationPosition = hit.point,};teleportationProvider.QueueTeleportRequest(request);}
}
7、实际应用场景
场景1:UI 菜单交互
- 为手柄添加
XR Ray Interactor
,启用UI Interaction
。 - 在 Canvas 上添加
Tracked Device Graphic Raycaster
。 - 配置射线的
Line Visual
,使其在悬停按钮时变色。 - 监听
OnSelectEntered
事件,触发按钮点击逻辑。
场景2:远距离抓取物体
- 为物体添加
XR Grab Interactable
和Rigidbody
。 - 配置
XR Ray Interactor
,设置Select Action
为手柄 Trigger 键。 - 当射线选中物体时,按下 Trigger 键抓取,物体通过物理力跟随射线终点。
场景3:抛物线传送
- 设置
Line Type
为Projectile Curve
,调整曲线参数模拟自然投掷轨迹。 - 射线终点落在
Teleportation Area
上时,显示传送标记。 - 松开输入键时,将玩家传送到射线终点位置。
8、优化与调试技巧
-
性能优化
-
减少射线检测频率:调整
Raycast Update Interval
(避免每帧检测)。 -
使用层级掩码过滤无关物体,减少计算量。
-
-
视觉体验提升
-
为曲线射线添加
XR Interactor Line Visual
,启用Smooth Movement
减少抖动。 -
使用
End Point Marker
预制体,增强射线终点的视觉反馈。
-
-
输入响应优化
-
配置
Select Action
的输入死区(Deadzone),防止误触发。 -
为UI交互添加声音反馈(通过
OnSelectEntered
事件播放音效)。
-
9、常见问题与解决
-
问题:射线无法检测到物体
检查步骤:-
确认物体有
XR Interactable
组件和Collider
。 -
检查
Layer Mask
是否包含物体所在层级。 -
确保射线长度(
Max Raycast Distance
)足够。
-
-
问题:UI 元素无法交互
解决:-
在 Canvas 上添加
Tracked Device Graphic Raycaster
。 -
确认
XR Ray Interactor
的UI Interaction
已启用。 -
检查 UI 元素的
Raycast Target
是否开启。
-
-
问题:射线轨迹显示异常
排查方向:-
调整
XR Interactor Line Visual
的Line Width
和Vertex Density
。 -
确保
Line Origin
与控制器模型对齐。
-