它是什么

TrackedDeviceGraphicRaycaster 允许 3D 跟踪设备在 Canvas 上高亮并选中 UI 元素。

它必须与 Canvas 组件挂在同一个 GameObject 上。

一句话定位:

它是"让 XR 控制器射线真正能点到 Unity UI"的关键桥梁。

如果少了它,即使 Canvas 是 World Space、有 NearFarInteractor、有 XRUIInputModule,也可能点不到按钮。

属性

属性作用
Ignore Reversed Graphics射线忽略背向射线源的 Graphic。UI 背面通常不该被点到。
Check for 2D Occlusion2D 对象遮挡 UI 时是否阻挡射线(需 Collider)。
Check for 3D Occlusion3D 对象遮挡 UI 时是否阻挡射线(需 Collider)。
Blocking Mask允许遮挡 UI 的物体层。
Raycast Trigger InteractionTrigger Collider 是否算阻挡。

对项目最关键的三个理解

  1. 它解决的不是"UI 显示"。它解决的是"射线能不能打到 UI / UI 能不能收到 XR 射线事件 / 悬停点击滚动能不能工作"。
  2. 它必须和 Canvas 同物体。这条特别容易忘。
  3. 它和 NearFarInteractor 是配套关系:
    NearFarInteractor 发出 XR UI 射线,TrackedDeviceGraphicRaycaster 让 Canvas 接得住。缺一边都不行。

遮挡选项怎么理解

选项何时开代价
Check for 3D OcclusionUI 面板前可能有 3D 模型,希望"前面物体挡住 UI"多一次射线检测
Check for 2D Occlusion有 2D 物理对象遮挡 UI多一次射线检测
Blocking Mask限定允许遮挡的层层不对则挡不住

开了 3D 遮挡后模型仍挡不住 UI → 检查模型所在层是否在 Blocking Mask 里。

架构说明(人话版)

官方补充:它在一次 UI 射线检测中,会用到:

  • EventSystem 维护的"全局共享结果列表"
  • 当前 Raycaster 自己的"本地命中缓存"

EventSystem 把多个 Raycaster 的命中结果汇总到一起,因此不能简单地"全局结果列表第一个命中就是当前 Canvas 该处理的命中"。TrackedDeviceGraphicRaycaster 维护自己的一套本地命中数据,保证当前 Canvas 的判断更准确。

这部分对日常使用不是必须掌握,但它解释了:

场景里有多个 Canvas、多个射线器时,这个组件仍然能稳定区分"当前该点的是谁"。

场景配置建议

场景配置
Home 场景首页按钮所在的 HomeCanvas 必须挂它;首页始终在头前时可不开复杂遮挡
质量评价 / JND面板可能被模型遮挡时考虑开 Check for 3D Occlusion,结合性能与层做测试

快速排错清单

VR 里点不到按钮,依次检查:

  1. Canvas 是否 World Space
  2. TrackedDeviceGraphicRaycaster 是否与 Canvas 在同一对象上
  3. 场景里是否有 XRUIInputModule
  4. NearFarInteractor.Enable UI Interaction 是否开启
  5. UI Press Input 是否绑定
  6. 是否被 3D 物体错误遮挡 / Blocking Mask 配置不当

参考资料