初探CardBoard:(1)在Unity中实现简单VR场景
为何使用CardBoard
现在的VR越来越流行,各种设备也是百花齐放。然而,对于研究VR刚刚起步的小白来说,昂贵的设备(例如HTC)并不一定是最佳选择。那么Google 的CardBoard就映入了我眼前。
价格低廉
使用它仅仅需要以下设备:
- 一个光学盒子 ,淘宝上只需要不到200块钱,只是注意大小要能够放下你的手机;
- 一个Android手机,这是唯一的花费点,一个好的手机总可以使你的体验更加良好,最次也得Android5.0以上的手机;
兼容性
Google 的SDK可以完美导入到unity中。
前期准备
- 最新版的CardBoardSDK,可以从https://developers.google.com/vr下载,由于谷歌被禁用,也可以从以下地址下载:https://download.csdn.net/download/qq_21854397/10806697。
- Unity5.1以上,unity从这个版本开始支持VR开发。并且,请配置好Unity Android的开发环境,网上很多教材,就不再赘述。
开始工程
一、简单的环境布置
为了测试方便,我们为场景添加几个简单的物体。
- 添加地板:添加一个cube,位置归零,大小如图设置:
为其创建一个蓝色的Material,可以使地板呈现黄色 - 在地板上放置物体:我在这里加了一个cube,一样给他一个别的颜色的Materal
- 建立游戏角色:在Hierarchy面板右键–>CreatEmpty,改名为Player,将其高度(Y)设置为成人高度(1.6-2)。将MainCamera放置为Player的子物体。ManCamera的位置归零。
- 场景调整:调整Player的X、Z位置,使相机可以看到cube,最终在Game视图中与此图类似
- 切换平台:切换到Android平台(新版Cardboard SDK 必须在Android 或者 Ios 平台开发测试)。并在Player Settings中–>XRSetting–>
勾选VR支持并且选择Cardboard开发。
至此,我们前期的场景已经布置完毕。
二、导入SDK
将下载的最新的CardBoard SDK 包导入unity。
三、SDK基础组件说明
- GvrEditorEmulator 预制体:位于GoogleVR–>Prefab下。功能是可以在unity测试中控制相机转动,然而,打包后手机陀螺仪并不受它控制,所以打包apk有没有它无所谓,测试有他比较方便。
- GvrEventSystem 预制体:位于GoogleVR–>Prefab–>EventSystem下,功能是处理VR中的交互事件,类似于做UI时会增加EventSystem.
- GvrReticlePointer 预制体:位于GoogleVR–>Prefab–>CardBoard下,功能是为相机添加一个瞄准星。
- GvrPointerPhysicsRaycaster.cs 脚本 :位于GoogleVR–>Scripts–>EventSystem下,功能是可以为相机发射一条射线,配合GvrReticlePointer,可以与瞄准的物体触发事件。
一个基本功能的VR场景暂时只会用到SDK中的这几个预制体与脚本。
四、将之前的场景布置为VR场景
- 为MainCamera添加射线:将*GvrPointerPhysicsRaycaster.cs 脚本拖到MainCamera上。
- 为MainCamera添加瞄准器:将GvrReticlePointer 预制体添加到camara下。
为了观察方便,我将瞄准器材质(Material)换为红色:
- 为Cube物体添加Event Trigger:这样,cube可以检测到相机射线(预制体发出的)与cube的碰撞,从而做出反应。
- 将GvrEventSystem 预制体添加到Hierarchy面板:用于检测与响应碰撞。
- 将GvrEditorEmulator 预制体添加到Hierarchy面板:用来在测试中使鼠标可以控制角度。
五、在unity中测试
运行项目,使用Alt+左键 或者Ctrl+左键可以控制角度。注意观察准星的变化。
- 准星不在cube上:
- 将准星瞄准cube:
注意:在测试中发现,场景不是左右画面。这是因为Google在新出的SDK中取消了GvrViewerMain这个预制体,在老的版本,GvrViewerMain预制体用来体现左右VR模式。在新的SDK中,不再支持左右分画面,只有打包成为apk在手机上才能看到左右VR模式的画面。
六、打包为apk传到手机
记得选择Android API版本,一定要大于5.1才可以支持VR模式。
一些问题与解决
打包时遇到的问题
当你打包时遇到一些奇奇怪怪的问题时,可以尝试提高Android API Level,这有可能是由于Google的SDK对低版本的平台支持不够好造成的。