Unity使用UGUI进行VR游戏的界面开发

时间:2023-12-20 16:06:44

原文链接:http://gad.qq.com/article/detail/7181505

本文首发腾讯GAD开发者平台,未经允许,不得转载

我不知道有多少同学是跟我一样,在开发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扩展来的。

Unity使用UGUI进行VR游戏的界面开发

2.先给一个UGUI的源码链接:https://bitbucket.org/Unity-Technologies/ui

,本来想理一下大概的逻辑关系,其实看看也应该都明白了,大概说一下几个脚本的意思,

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,并调用我们里面所设置的变量。

Unity使用UGUI进行VR游戏的界面开发

4.更改操作模式,打开OVRInputModule脚本,注释掉Oculus的事件,并设置一个htc的手柄变量,在这里最好导入htc的sdk,因为我们会用到它的一些脚本

Unity使用UGUI进行VR游戏的界面开发

然后再GetGazeButtonState添加htc的右手手柄的扳机事件,忽略掉我的HTCVIVE的宏定义,我其实已经做好了两个设置的输入操作,这里我们只看htc的输入操作

Unity使用UGUI进行VR游戏的界面开发

然后再在GetExtraScrollDelta添加htc 手柄的Scroll Delta,就是你在拖动滚动条或者滚动文本时所需要的移动Delta

Unity使用UGUI进行VR游戏的界面开发

5.到这里好像就行了,我们可以做一个示例来看一看:

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

Unity使用UGUI进行VR游戏的界面开发

5.3 在EventSystem中移除Standalone Input Module,添加OVRInputModule,并将Controller (right)都赋值给rightTracked与rayTransform

Unity使用UGUI进行VR游戏的界面开发

5.4 在Canvas下面创建一个Image命名GazePointer,并绑定OVRGazePointer脚本,将Canvas赋值给Camera Rig,值就是开始说的鼠标点。然后就可以在Canvas下面创建操作界面,点击运行就能通过htc的右手手柄扣动扳机去操作界面。

Unity使用UGUI进行VR游戏的界面开发

6.总结:我这里是在写好之后,再发的文章,并没有太多的运行截图,只是讲了一下怎么改为支持htc的一些思路,有兴趣或者不太清楚的同学可以单独找我讨论。因为是oculus的demo,将它改为支持htc就有点不地道,我这里就不放测试工程了。

相关文章