Unity中Oculus VR的UI交互
谈到UnityUI交互,首先我们先来看下Unity的UI系统中几个关键的组成部分:
· EventSystem
· InputModules
· RayCasters
· GraphicComponents: Button, Toggle, Slider 等.
EventSystem是处理所有UI事件的核心。它与其他几个部分紧密联系,例如InputModule,是它主要的事件处理来源。在Unity UI系统中,一个场景中只能有一个InputModule活跃。默认情况下,EventSystem绑定了一个鼠标输入模块(StandaloneInputModule)和一个触碰输入模块(TouchInputModule),他们分别用于处理PC端鼠标的输入以及移动设备触摸的输入监测。真正意义上的UI交互监测是在raycaster类中实现,例如GraphicRaycaster。
raycaster负责处理可交互对象的一些设置。当一个InputModule提交了鼠标或触摸点的信息,它会轮询所有可用的raycaster,每个raycaster都会监测自己的组件是否有触发交互事件。有两种Unity内置的raycaster,GraphicRaycaster (用于Canvas)以及PhysicsRaycaster (用于非UI对象)。
在用户点击场景时,raycaster会发出很多用于检测的射线,返回来的结果是一个对象的集合,但是用户肯定不希望一次点击同时响应不同的UI元素,这会混淆操作,而InputModule的职责就是去找到场景中最近的射线检测结果。
然后再来看下,我们导入的Oculus Unity集合包中的东西,用Oculus提供的来替换掉我们工程里的部分组件。
- 替换相机
- 删除场景中的Camera
- 添加OVR/Prefabs/OVRCameraRig预置体到场景中作为相机
- 将相机调整到合适的位置
- 更改输入模块
- 选择Hierarchy中的EventSystem对象
- 移除用于处理常规鼠标输入的StandaloneInputModule组件
- 添加OVRInputModule脚本
- 把OVRCameraRig对象下的CentreEyeAnchor拖到OVRInputModule的RayTransform属性上,使射线始终从双眼中间位置发出
- OVRInputModule中的JoyPadClickButton和GazeClickKey分别用于设置Touch手柄和键盘上操作UI的按键
- 添加凝视指针
- 添加Prefabs/OVRGazePointer预置体到场景中来指示当前凝视的位置
- 预置体上除了OVRGazePointer脚本还有一个与粒子特效有关的脚本,如不需要可以删除
- 把OVRCameraRig对象下的CentreEyeAnchor拖放到OVRGazePointer脚本的RayTransform属性上,使指针跟随射线
- 设置Canvas
- 将需要凝视操作的Canvas的Render Mode属性设置为World Space
- 将Canvas中的EventCamera设置为OVRCameraRig下的CenterEyeAnchor
- 移除Canvas绑定的用于监测鼠标与GUI元素交互的GraphicRaycaster组件
- 添加用于处理射线的OVRRaycaster脚本
- 在OVRRaycaster组件中,将Blocking Objects属性设为All,使凝视行为可以锁定场景中的其他可交互对象
- 更改指针移动方式
若希望通过其他输入设备移动指针,则进行此步,以右手Touch控制器为例。
- 选择EventSystem对象,把OVRInputModule的RayTransform属性改为OVRCameraRig对象下的RightHandAnchor,使射线从右手的Touch控制器发出
- 选择GazePointerRing对象,将OVRGazePointer脚本的RayTransform属性改为OVRCameraRig对象下的RightHandAnchor,使指针跟随射线
- 添加世界坐标下的鼠标
若需要为VR场景提供与凝视一起存在的鼠标操作UI的功能,则进行此步操作。
- 将Prefabs/TrackedRemote预置体添加到场景中