当前位置: 首页 > article >正文

Unity XR-XR Interaction Toolkit开发使用方法(七)组件配置(XR Ray Interactor)

目录

一、插件介绍

二、主要组件

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、核心功能与特点

射线检测与交互

  1. 从指定起点(如手柄尖端)发射射线,检测路径上的 XR Interactable 对象或 UI 元素。
  2. 支持 直线射线 和 曲线抛物线射线(如弧形轨迹),适应不同交互需求。

多模式交互支持

  1. 物体选择:通过射线选中并抓取远处物体(需结合 XR Grab Interactable)。
  2. UI 操作:与 Unity Canvas 交互(如点击按钮、滑动条)。
  3. 传送锚点:配合 Teleportation Area 实现玩家瞬移。

视觉反馈定制

  1. 可自定义射线外观(颜色、长度、终点标记),增强用户体验。
  2. 支持动态调整射线终点位置(如吸附到物体表面或UI元素)。

事件驱动逻辑

  1. 提供 OnHoverEnteredOnSelectEntered 等事件,响应悬停、选中、激活等操作。

3、组件配置详解

PropertyDescription
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、工作原理

射线生成

  1. 每帧从 Ray Origin 位置发射射线,根据 Line Type 生成轨迹(直线或曲线)。

碰撞检测

  1. 检测射线路径上的 Interactable 对象或 UI 元素,筛选符合 Layer Mask 的目标。

交互响应

  1. 当用户按下绑定的输入(如 Trigger 键),触发 Select 动作:
  2. 若目标是物体:尝试抓取(需物体有 XR Grab Interactable)。
  3. 若目标是 UI:触发点击事件(如按钮 OnClick)。

视觉更新

  1. 动态调整射线轨迹和终点位置,提供实时反馈。

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 的输入绑定

  1. XR Controller 的 Select Action(如 Trigger 键)触发射线选择动作。
  2. Activate Action 可用于额外功能(如确认传送)。

与 XR Interaction Manager 的协调

  1. 管理射线交互与其他交互器(如 XR Direct Interactor)的优先级冲突。

与 Teleportation 组件的集成

  1. 配合 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 菜单交互

  1. 为手柄添加 XR Ray Interactor,启用 UI Interaction
  2. 在 Canvas 上添加 Tracked Device Graphic Raycaster
  3. 配置射线的 Line Visual,使其在悬停按钮时变色。
  4. 监听 OnSelectEntered 事件,触发按钮点击逻辑。

场景2:远距离抓取物体

  1. 为物体添加 XR Grab Interactable 和 Rigidbody
  2. 配置 XR Ray Interactor,设置 Select Action 为手柄 Trigger 键。
  3. 当射线选中物体时,按下 Trigger 键抓取,物体通过物理力跟随射线终点。

场景3:抛物线传送

  1. 设置 Line Type 为 Projectile Curve,调整曲线参数模拟自然投掷轨迹。
  2. 射线终点落在 Teleportation Area 上时,显示传送标记。
  3. 松开输入键时,将玩家传送到射线终点位置。

8、优化与调试技巧

  1. 性能优化

    • 减少射线检测频率:调整 Raycast Update Interval(避免每帧检测)。

    • 使用层级掩码过滤无关物体,减少计算量。

  2. 视觉体验提升

    • 为曲线射线添加 XR Interactor Line Visual,启用 Smooth Movement 减少抖动。

    • 使用 End Point Marker 预制体,增强射线终点的视觉反馈。

  3. 输入响应优化

    • 配置 Select Action 的输入死区(Deadzone),防止误触发。

    • 为UI交互添加声音反馈(通过 OnSelectEntered 事件播放音效)。


9、常见问题与解决

  • 问题:射线无法检测到物体
    检查步骤

    1. 确认物体有 XR Interactable 组件和 Collider

    2. 检查 Layer Mask 是否包含物体所在层级。

    3. 确保射线长度(Max Raycast Distance)足够。

  • 问题:UI 元素无法交互
    解决

    1. 在 Canvas 上添加 Tracked Device Graphic Raycaster

    2. 确认 XR Ray Interactor 的 UI Interaction 已启用。

    3. 检查 UI 元素的 Raycast Target 是否开启。

  • 问题:射线轨迹显示异常
    排查方向

    • 调整 XR Interactor Line Visual 的 Line Width 和 Vertex Density

    • 确保 Line Origin 与控制器模型对齐。


http://www.kler.cn/a/563594.html

相关文章:

  • C++ STL(一)std::vector std::array
  • 玩机日记 15 使用Lucky申请半永久的ssl证书,并且替换阿里云的自签名证书
  • 集合与反射
  • 算法平台的开源框架
  • PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 TIFF
  • 网页五子棋——项目测试
  • HarmonyOS Design 介绍
  • 基于ffmpeg+openGL ES实现的视频编辑工具-添加背景音乐(十)
  • vue+element-dialog:修改关闭icon / 遮罩层不能挡住弹窗 / 遮罩层不能遮挡元素
  • miqiu的分布式(三):JVM本地锁失效的三大典型场景
  • Java集合设计模式面试题
  • 5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
  • 十一、大数据治理平台总体功能架构
  • leetcode 541. 反转字符串 II 简单
  • Document对象
  • docker 安装 seafile 企业云盘
  • flask 是如何分发请求的?
  • PHP-create_function
  • 【linux配置】 修改内核网络参数
  • Unity基础——世界坐标系(Global)和本地坐标系(Local)