核心结论

XR Interaction Toolkit 提供组件与辅助菜单,把 XR 控制器接入 Unity UI,让 3D 跟踪设备能像鼠标一样点按钮。

一句话总结:

普通 Unity UI 默认不是为 VR 控制器射线准备的。如果想让手柄射线点按钮,必须走 XR UI 这套配置链路。

从 GameObject > XR 菜单创建:

  • UI Canvas:新建 World Space Canvas;场景里没有 EventSystem 还会一起创建。
  • UI EventSystem:创建或选中已有 XR EventSystem。

EventSystem

EventSystem 是 UI 事件的中央分发器,处理输入并更新当前活动的 Canvas。每个 EventSystem 还要配一个 Input Module。

XR 交互器(NearFarInteractor、XRPokeInteractor 等)如果支持 UI 交互,需要向 XRUIInputModule 注册。

通常把 EventSystem 设为 DontDestroyOnLoad,多场景切换时只保留一个实例。

三件事容易混:
  • 场景同一时间只能有一个有效的 EventSystem。
  • 同一时间也只能有一个启用中的 Input Module。
  • XR UI 交互必须用 XRUIInputModule,不是旧版 StandaloneInputModule。
项目若有多个场景(Home / Quality Rating / JND),每个场景各放一个 EventSystem 容易打架,建议统一在一处初始化。

Tracked Device Physics Raycaster

场景里加 TrackedDevicePhysicsRaycaster,让带物理 Collider 的对象也能接收来自跟踪设备的 EventSystem 事件。

本项目主线仍是 NearFarInteractor → World Space Canvas → TrackedDeviceGraphicRaycaster → XRUIInputModule,Physics Raycaster 可作为补充。

Canvas

XR Interaction Toolkit 里,用户只能与 Render Mode = World Space 的 Canvas 交互。

TrackedDeviceGraphicRaycaster(必须挂在 Canvas 同物体)允许 3D 跟踪设备高亮和选中 Canvas 上的 UI 元素。

如果还在用 Screen Space - Overlay 或 Screen Space - Camera,XR 射线通常不会按预期工作。

UI 遮挡检测

用 TrackedDeviceGraphicRaycaster 时,可能出现非 UI 物体挡住 UI 的情况。可启用:

  • Check For 3D Occlusion
  • Check For 2D Occlusion

两个选项默认关闭,是为了省性能——每启用一个就增加一次额外射线检测。

如果 UI 面板总是放在视野前方且无复杂遮挡,先不急着开;如果发现模型挡不住 UI,再考虑打开 Check For 3D Occlusion 并配合 Blocking Mask。

Canvas Optimizer

可选组件,用于层级深 / UI 复杂时的性能优化。它会自动禁用那些看不见或距离太远的 Canvas 的输入处理。

当前项目 UI 不复杂;如果将来场景越来越多、World Space Canvas 越来越多、VR 设备上 UI 性能变差,它会变得有价值。

输入框已知问题

  • UWP 平台上标准 uGUI Input Field 可能收不到软件键盘输入,建议换 TextMeshPro - Input Field。
  • Quest 平台上使用 Multi Line Newline 的 Input Field 可能出现软件键盘关闭问题。

当前项目首页、评分、JND 不依赖文本输入,不是第一优先级。但要做路径输入、实验编号录入、被试信息录入时,直接用 TMP 输入框更稳。

最简落地链路

如果你只想记最实用的一条链路:

  1. Canvas.RenderMode = World Space
  2. Canvas 上有 TrackedDeviceGraphicRaycaster
  3. 场景里有 EventSystem + XRUIInputModule
  4. 控制器上用 NearFarInteractor
  5. NearFarInteractor.Enable UI Interaction = true
  6. UI Press Input 已正确绑定

参考资料