探索Unity中的Google Cardboard VR开发

虚拟现实(VR)技术近年来取得了飞速的发展,其中Google Cardboard因其低成本和易用性而受到广泛关注。在本文中,将一起探索如何在Unity中设置和使用Google的VR SDK,以便开发基于Google Cardboard的VR应用。

目标

今天的目标是设置Unity以支持Google Cardboard,并浏览Unity的教程,以便更好地理解VR开发的基本流程。

步骤1: 在Unity中设置Google Cardboard

将按照Google的官方文档来设置Unity中的VR支持。Google VR SDK的一个优点是,可以重用大部分与Google Cardboard一起使用的预制件和脚本,并将其用于Google Daydream,这意味着可以同时支持两个不同的平台。

首先,需要确保已经安装了Unity(版本5.6或更高)。为了能够运行VR应用,需要安装Android Build Support。如果还没有安装,需要重新下载Unity,并在安装过程中选择包含Android Build Support的选项。

在Unity正确设置并包含Android Build Support之后,需要获取Google的VR资源。可以从下载Google的VR SDK。下载完成后,需要将这个.unitypackage添加到Unity项目中。

为了操作这个步骤,将创建一个新的Unity项目。在Unity中,通过选择File > New Project…来创建新项目。在新项目中,导入下载的包中的所有内容。在Unity中,可以通过前往Assets > Import Package > Custom Package来导入。

现在已经导入了所有需要的内容,最后一步是更改Unity的一些设置,以便可以运行游戏。

首先,需要让Unity将游戏项目运行在Android平台上。通过选择File > Build Settings打开Build Settings。选择Android并点击Switch Platform,等待游戏完成重新打包资产以适应新平台。

接下来,需要更改Player Settings以支持想要的特定VR SDK。在例子中,将是Google Cardboard。在Build Settings旁边选择Player Settings。在Player Settings中,启用Virtual Reality Supported,然后将Cardboard添加到Virtual Reality SDKs中。

最后,在Minimum API Level中,选择API level 19作为最低Android版本。Google Cardboard至少需要API level 19,而Google Daydream Viewer至少需要API level 24。

步骤2: 浏览Unity教程

现在一切都配置好了,可以正式开始浏览Google的SDK基础知识。

在浏览SDK基础知识的同时,也浏览了GVRDemo场景。在新项目中,前往Assets > GoogleVR > Demos > Scenes并打开GVRDemo。

Google提供了预制件和脚本,这些将为处理VR功能。这些都位于Assets > GoogleVR > Prefab和Scripts。以下是它们以及附加到它们上的脚本的作用:

  • GvrEditorEmulator预制件 - 允许像使用头戴设备一样控制相机。按住alt键可以围绕相机旋转视图。
  • GvrControllerMain预制件 - 为提供了Daydream控制器,可以使用Google的控制器API与之交互。
  • GvrEventSystem预制件 - 使能够使用Google的输入指针系统。具体来说,是视线/控制器如何与对象交互并选择它们。
  • GvrPointerGraphicRaycaster脚本 - 这个脚本就像通常会附加到UI画布上的Graphic Raycaster,以便可以使用输入设备(视线或控制器)与UI进行交互。
  • GvrPointerPhysicsRaycaster脚本 - 这个脚本在屏幕中间射出一条射线,以便在决定点击时选择某个对象。应该将其附加到主相机上。还需要在每个想要与之交互的对象上附加Unity的事件系统。
  • GvrControllerPointer预制件 - 这是Daydream的控制器。它为提供了一个手臂资产来模仿控制器。这个预制件必须是附加了GvrPointerPhysicsRaycaster的主相机对象的兄弟。
  • GvrReticlePointer预制件 - 这是Google Cardboard的视线控制器。它在屏幕中间创建一个点,用它来选择游戏中的对象。为了使这个预制件工作,必须将其作为Main Camera游戏对象的子对象。

还有很多其他的预制件和脚本,但在高层次上,这些是制作VR游戏所需的基础知识。

当打开GvrDemo时,这是所看到的:

建议在场景中四处探索,看看层次结构中的对象,但在高层次的总结中,这是层次结构中与Google Cardboard相关的相关内容(因为它也有Daydream资产):

  • GvrEditorEmulator用于在VR中模拟头部运动。
  • GvrEventSystem用于Unity检测选择对象时的VR输入。
  • 在Player > Main Camera中,有GvrPointerPhysicsRaycaster脚本,它允许使用Google的射线投射系统进行3D对象。
  • 在Floor Canvas游戏对象中,有GvrPointerGraphicRaycaster,以便与UI进行交互。
  • 最后,在Player > Main Camera > GvrReticlePointer中,有Google Cardboard的视线光标,用它与游戏世界进行交互。

这个游戏的主要目的是点击游戏中出现的立方体。当点击立方体时,它将被随机移动到游戏中的其他地方。

所有这些有趣的部分是如何通过视线触发代码。

事件触发系统是Unity识别对注册了事件触发器的游戏对象上采取的任何行动的一种方式。

一个动作可能是:

  • OnPointerClick
  • OnPointerEnter
  • OnPointerExit

在例子中,OnPointerClick将在点击附有事件触发器的对象时触发。

以下是传送脚本:

using UnityEngine; using System.Collections; [RequireComponent(typeof(Collider))] public class Teleport : MonoBehaviour { private Vector3 startingPosition; public Material inactiveMaterial; public Material gazedAtMaterial; void Start() { startingPosition = transform.localPosition; SetGazedAt(false); } public void SetGazedAt(bool gazedAt) { if (inactiveMaterial != null && gazedAtMaterial != null) { GetComponent().material = gazedAt ? gazedAtMaterial : inactiveMaterial; return; } GetComponent().material.color = gazedAt ? Color.green : Color.red; } public void Reset() { transform.localPosition = startingPosition; } public void Recenter() { #if !UNITY_EDITOR GvrCardboardHelpers.Recenter(); #else GvrEditorEmulator emulator = FindObjectOfType(); if (emulator == null) { return; } emulator.Recenter(); #endif // !UNITY_EDITOR } public void TeleportRandomly() { Vector3 direction = Random.onUnitSphere; direction.y = Mathf.Clamp(direction.y, 0.5f, 1f); float distance = 2 * Random.value + 1.5f; transform.localPosition = direction * distance; } }

可以忽略代码的作用,但想引起注意的是public函数:

  • SetGazedAt()
  • Reset()
  • Recenter()
  • TeleportRandomly()

这些在哪里被调用?好吧,如果回顾Cube中的事件触发器,设置了3种事件类型:

  • Pointer Enter
  • Pointer Exit
  • Pointer Click

然后,无论何时这些事件发生,都会调用public函数。

在这个例子中,当看着立方体时,会触发Pointer Enter事件,并调用SetGazedAt()函数,变量gazedAt为true。

当看向别处时,会触发Pointer Exit事件,并调用SetGazedAt()函数,gazedAt为false。

最后,如果点击立方体,会触发Pointer Click事件,并调用TeleportRandomly()将立方体移动到新位置。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485