本次作业为移动端 VR 实验,将基于 Google Cardboard VR 设备,在移动设备上开发一款简单的游戏。在本次作业中,同学们将了解 Google VR 开发包,并学习如何使用它来开发简单的 Cardboard 应用。
如果你使用的是 Unity Hub 管理 Unity 版本,请按如下过程安装 Android/IOS Build Support。


以 Android 平台为例,如果你没有使用 Unity Hub,则需要手动配置Android相关SDK。请参照该文档来安装 Android Build Support。
File->Build Settings,在Platform中选择Android,并点击右下角 Switch Platform 来切换平台
Other Settings->Identification下的Package Name 和 Minimum API Level。Minimum API Level 需要设置为 19 以上。
Build Settings 中选中 Build 打包为apk,并在 Android 手机中运行。(也可以将手机连接电脑,在USB调试模式下点击 Build and Run 进行调试。)运行成功即表示环境配置完成。我们通过构建一个简单的游戏来了解 Google VR SDK 的基础用法。
新建一个空白3D Unity项目,导入Google VR SDK。
在 File->Build Settings->Player Settings->XR Settings 中选中 Virtual Reality Supported,并在 Virtual Reality SDK 中添加 Cardboard。

新建空物体名为 Player ,位于(0,0,0),设置 Main Camera 为其子物体。注意 Main Camera->Transform->position=(0,0,0)。
为Main Camera添加 GvrPointerPhysicsRaycaster 组件。该组件使之能和场景中的物体交互
在项目目录中搜索并添加 GvrEditorEmulator 预设体。该预设体使得 Unity Editor 可以模拟VR环境下的头部运动,便于在 Editor 中调试。
在项目目录中搜索并添加 GvrEventSystem 预设体。该预设体使游戏能追踪点击、悬停等事件。
在项目目录中搜索并添加 GvrReticlePointer 预设体,作为 Camera 的子物体。该预设体在游戏中显示为准星,使得用户能利用它在场景物体上点击、悬停。
新建一个 Cube 物体,位置为 (3,4,0)。

ReticleTest.cs 。脚本中添加一个共有函数 RandomlyTeleport() ,该函数能让 Cube 传送到一个随机位置: public void RandomlyTeleport(){
var rad = Random.Range(0, 6.18f);
var r = 5.0f;
gameObject.transform.position = new Vector3(
Mathf.Sin(rad)*r, Random.Range(-0.5f, 0.5f), Mathf.Cos(rad)*r
);
}
Event Trigger 脚本,并在 Pointer Click 下绑定当前物体的 RandomlyTeleport 函数。此时,当玩家点击 Cube 时,便会调用到 ReticleTest.RandomlyTeleport 函数,使 Cube 被传送到下一个随机位置。

接下来,你需要利用 Cardboard 的特点,设计实现一个新颖的游戏。
用户交互:在 Cardboard 中,我们获取的用户输入只有头盔的旋转信息以及一个点击事件。其中头盔的旋转可以通过 Main Camera->Transform 计算得到,点击事件可以通过上一章的方法实现。
VR中的UI:在VR环境中,由于头部会经常性地转动,因此常常会使用固定位置的UI。 为实现固定位置的UI,需要将Canvas->Canvas Render Mode 设置为 WorldSpace 。对于过大的 Canvas ,建议使用 Scale 来调整其大小,以保证 Canvas 中的 UI 有足够分辨率显示。