它是什么
TrackedDeviceGraphicRaycaster 允许 3D 跟踪设备在 Canvas 上高亮并选中 UI 元素。
它必须与 Canvas 组件挂在同一个 GameObject 上。
一句话定位:
它是"让 XR 控制器射线真正能点到 Unity UI"的关键桥梁。
如果少了它,即使 Canvas 是 World Space、有 NearFarInteractor、有 XRUIInputModule,也可能点不到按钮。
属性
| 属性 | 作用 |
|---|---|
Ignore Reversed Graphics | 射线忽略背向射线源的 Graphic。UI 背面通常不该被点到。 |
Check for 2D Occlusion | 2D 对象遮挡 UI 时是否阻挡射线(需 Collider)。 |
Check for 3D Occlusion | 3D 对象遮挡 UI 时是否阻挡射线(需 Collider)。 |
Blocking Mask | 允许遮挡 UI 的物体层。 |
Raycast Trigger Interaction | Trigger Collider 是否算阻挡。 |
对项目最关键的三个理解
- 它解决的不是"UI 显示"。它解决的是"射线能不能打到 UI / UI 能不能收到 XR 射线事件 / 悬停点击滚动能不能工作"。
- 它必须和 Canvas 同物体。这条特别容易忘。
- 它和
NearFarInteractor是配套关系:
NearFarInteractor发出 XR UI 射线,TrackedDeviceGraphicRaycaster让 Canvas 接得住。缺一边都不行。
遮挡选项怎么理解
| 选项 | 何时开 | 代价 |
|---|---|---|
Check for 3D Occlusion | UI 面板前可能有 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 里点不到按钮,依次检查:
- Canvas 是否
World Space TrackedDeviceGraphicRaycaster是否与 Canvas 在同一对象上- 场景里是否有
XRUIInputModule NearFarInteractor.Enable UI Interaction是否开启UI Press Input是否绑定- 是否被 3D 物体错误遮挡 /
Blocking Mask配置不当