核心结论
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。
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 OcclusionCheck 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 输入框更稳。
最简落地链路
如果你只想记最实用的一条链路:
Canvas.RenderMode = World Space- Canvas 上有
TrackedDeviceGraphicRaycaster - 场景里有
EventSystem + XRUIInputModule - 控制器上用
NearFarInteractor NearFarInteractor.Enable UI Interaction = trueUI Press Input已正确绑定