Unity使用UGUI进行VR游戏的界面开发
我不知道有多少同学是跟我一样,在开发VR游戏中,是使用的面片或者模型来做的UI界面,响应简单的射线点击或者碰撞事件,来做的一些交互。但是如果想实现一个滚动文本或者滑动条的控件,就显得比较麻烦。
后来有同学跟我讨论过是否可以使用UGUI来做VR游戏界面,当时考虑到UGUI的3D界面也是通过射线响应,感觉是应该是可行的,正在准备开始写的时候,又发现了一个好东西,原来Oculus已经出了一个使用UGUI的Demo,哈哈,我比较懒,就用来学习使用一下。
Unity5.2 Oculus UGUI Demo 链接:https://static.oculus.com/downloads/OVR_UI_Demo_5_2.zip
OculusUnity SDK 链接:https://developer3.oculus.com/downloads/game-engines/0.1.3.0-beta/Oculus_Utilities_for_Unity_5/
看了一下demo,Oculus UGUI是通过用眼睛发出射线,与Canvas交互,上面有一个圆圈模拟鼠标的点,通过头的不停摆动可以移动圆圈,告诉我们鼠标的移动位置,然后通过手柄的A键,模拟鼠标的按下和放开。你就可以看着一个滑动条按住A键就能去拖动(VR的操作都在体验上,每次到这个时候,我都不知道怎样去形容才更好理解,有兴趣的 ,还是自己动手体验一下)。同时,它还通过集成物理射线去响应与3D物体的交互,还集成了鼠标操作。
然后结合自己的项目需求,我们需要处理htc和oculus两种设备的输入,而且决定不用头部来发射射线,而使用手柄来做射线操作,感觉用头部操作,并不是很方便,而且决定去掉鼠标的操作。整理好需求,我们就主要来讨论将Oculus UGUI Demo更改到两种设备都能使用,这里就以更改为htc的操作为例。
1.打开OVR_UI_Demo,这里会报一些错误,那是因为你没有导入Oculus的sdk,但是暂时也不用去管,后面为了方便htc的操作,我们会更改一些操作。首先来看看几个脚本,看着这几个脚本是不是感觉特别熟悉,都是从UGUI扩展来的。
2.1 OVRGazePointer用来确定射线的终点位置,也就是模拟我们平常的鼠标位置;
2.2 OVRInputModule表示输入模式,简单来说,就是检测按键的按下或者放开,我们会用手柄的按键来模拟鼠标的点击;
2.3 OVRRaycaster表示Canvas的射线检测;
2.4 OVRPhysicsRaycaster物理射线检测,后面用来与一些场景中的3D物体的交互;
2.5 OVRRayPointerEventData的数据还是跟PointerEventData一样,包括一些position、delta、worldSpaceRay等。
3、我们就来开始整理错误,首先创建一个OVRCameraRigInfor脚本,用来存摄像机与射线物体的信息,然后将OVRGazePointer和OVRPhysicsRaycaster脚本里的OVRCameraRig替换为我们所更改的OVRCameraRigInfor,并调用我们里面所设置的变量。
然后再GetGazeButtonState添加htc的右手手柄的扳机事件,忽略掉我的HTCVIVE的宏定义,我其实已经做好了两个设置的输入操作,这里我们只看htc的输入操作
5.1 、新建一个场景,删除Main Camera和Directional Light,再拖入SteamVR预设里的[CameraRig];
5.2 在ui中新建一个Canvas,设置Render Mode为World Space,将[CameraRig]的Camera(eye)赋值给event Camera, 移除它的Graphic Raycaster组件,并添加OVRRaycaster与OVRCameraRigInfor,并将Camera(eye)、Controller (right)分别给OVRCameraRigInfor