虚拟现实(VR)技术近年来取得了飞速的发展,其中Google Cardboard因其低成本和易用性而受到广泛关注。在本文中,将一起探索如何在Unity中设置和使用Google的VR SDK,以便开发基于Google Cardboard的VR应用。
今天的目标是设置Unity以支持Google Cardboard,并浏览Unity的教程,以便更好地理解VR开发的基本流程。
将按照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。
现在一切都配置好了,可以正式开始浏览Google的SDK基础知识。
在浏览SDK基础知识的同时,也浏览了GVRDemo场景。在新项目中,前往Assets > GoogleVR > Demos > Scenes并打开GVRDemo。
Google提供了预制件和脚本,这些将为处理VR功能。这些都位于Assets > GoogleVR > Prefab和Scripts。以下是它们以及附加到它们上的脚本的作用:
还有很多其他的预制件和脚本,但在高层次上,这些是制作VR游戏所需的基础知识。
当打开GvrDemo时,这是所看到的:
建议在场景中四处探索,看看层次结构中的对象,但在高层次的总结中,这是层次结构中与Google Cardboard相关的相关内容(因为它也有Daydream资产):
这个游戏的主要目的是点击游戏中出现的立方体。当点击立方体时,它将被随机移动到游戏中的其他地方。
所有这些有趣的部分是如何通过视线触发代码。
事件触发系统是Unity识别对注册了事件触发器的游戏对象上采取的任何行动的一种方式。
一个动作可能是:
在例子中,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函数:
这些在哪里被调用?好吧,如果回顾Cube中的事件触发器,设置了3种事件类型:
然后,无论何时这些事件发生,都会调用public函数。
在这个例子中,当看着立方体时,会触发Pointer Enter事件,并调用SetGazedAt()函数,变量gazedAt为true。
当看向别处时,会触发Pointer Exit事件,并调用SetGazedAt()函数,gazedAt为false。
最后,如果点击立方体,会触发Pointer Click事件,并调用TeleportRandomly()将立方体移动到新位置。