HTC Vive Unity 教程

HTC Vive 是一个虚拟现实头盔,由 HTC 和 Valve 公司制造。它提供一种在虚拟世界中的浸入式体验,而不是屏幕头像。

如果你是一个 Unity 开发者,在虚拟现实游戏中使用 HTC Vive 非常简单——你可以认为 HTC Vive 和 Unity 是天生一对。

在这篇 HTC Vive 教程中,你会学习如何在 Unity 游戏中集成 HTC Vive。包括:

  • 下载和配置 StreamVR
  • 处理控制器输入
  • 在 VR 中和物理对象交互
  • 创建一支激光笔
  • 瞬移

注:每个人在戴着头戴式显示器都会对运动和旋转产生不同的反应。如果你是第一此穿戴此类设备,当感觉不适时请放松并深呼吸。大部分人很快就会适应 VR。开头几次如果你不适应请不要着急——它很快就会过去。

开始

在正式开始学习之前,你必须拥有下列条件:

  • 一台支持 VR 的 Windows PC。
  • 在机器上安装有 Unity 5.5 或更高版本。
  • 一套完整的 HTC Vive 硬件,并配置和升级好软件。
  • 安装 Steam 和 SteamVR。请参考这份指南,它将指引你完成硬件安装,并提供 Steam 和 SteamVR 的下载链接。
  • 熟悉基本的 Unity 使用:[Introduction to Unity: Getting Started](Introduction to Unity: Getting Started)。
  • 熟悉基本的脚本:Introduction To Unity Scripting。

确认 HTC Vive 已经打开并连接!

下载开始项目。解压缩到任意目录并用 Unity 打开。在项目窗口中看一眼文件夹:

这里不会有太多内容,因为场景中还没有加入 VR 控制。你需要将 SteamVR 添加到项目中,以便将 Vive 连接到 Unity。

设置 StreamVR

SteamVR SDK 是一个由 Valve 提供的官方库,以简化 Vive 开发。当前在 Asset 商店中是免费的,它同时支持 Oculus Rift 和 HTC Vive。

打开 Asset 商店,在顶部工具栏中选择 Window > Asset Store:

点击 Download 按钮,然后静静等待。等下载完成,你看到导入包对话框。

点击右下角的 Import,导入包:

打开这个文件夹,看一眼内容。我们会从 Prefabs 文件中添加一个 VR GameObjects 到场景中。

[SteamVR] 负责几件事情。它在玩家打开系统菜单并将物理刷新率和绘图系统进行同步时让游戏自动暂停。它还负责处理“房间规模 VR 动作”的平滑。在检视器面板中查看属性:

从结构视图中删除主摄像,因为这会干扰 [CameraRig] 和它的相机。

打开手柄,查看屏幕。拿起手柄,四处移动。你会看到在场景视图中看到虚拟手柄也会随之移动:

现在——继续在场景视图中——从结构视图中选择 Camera(eye),小心地拿起你的头盔显示器的顶部皮带,移动并微微旋转,同时观察场景视图:

Touchpad 既是可以做模拟摇杆也可以当做按钮。当移动或旋转手柄时,手柄会有速度和旋转速度感应,当和物体交互时这会非常有用。

我们在这里进行了如下操作:

  1. 对正在被跟踪的对象进行一个引用。在这里,也就是一只手柄。
  2. Device 属性能够很方便地访问到这个手柄。通过所跟踪的对象的索引来访问控制器的 input,并返回这个 input。

头盔和手柄都是被跟踪的对象——他们在真实事件中的移动和旋转都会被 HTC Vive 跟踪到并传递到虚拟世界。

在 Update() 方法上方添加方法:

当脚本加载时,trackedObj 会被赋值为 SteamVR_TrackedObject 对象,这个对象和手柄是关联的:

  1. 获取手指在 touchpad 上的位置并输出到控制台。
  2. 当你按下扳机时,这会打印到控制台。扳机有一个专门的方法用于判断它是否被按下:GetHairTrigger(), GetHairTriggerDown() 和 GetHairTriggerUp()。
  3. 如果松开扳机,这会打印到控制台。
  4. 如果按下抓取(grip)键,这会打印到控制台。GetPressDown 方法是用于判断某个按钮已经被按下的标准方法。
  5. 如果释放抓取键,这会打印到控制台。GetPressUp 方法是用于判断某个按钮是否已经被释放的标准方法。

按下按钮,扳机并在 touchpad 上滑动,你会看到控制台会输出每个我们注册的动作:

为两个手柄添加一个盒子碰撞体 (Add Component > Physics > Box Collider) 并勾上 Is Trigger。

默认的碰撞体有点大,我们需要重新指定大小和位置。设置中心为 (X:0, Y:-0.04, Z:0.02),大小为 (X:0.14, Y:0.07, Z:0.05)。这里需要将值精确到两位数,否则都会影响到手柄的最终效果。

不编写脚本,碰撞体仅仅是一个无用的方块——在 Scripts 文件夹中创建一个新脚本,取名为 ControllerGrabObject 然后打开它。、

删除 Start() 方法并在这里添加这段你已经熟悉的代码:

这段代码和你在输入测试中的代码是一样的。这里获取了手柄,然后保存到一个变量中以备后用。

在 trackedObj 下面添加变量:

这两个变量的作用分别是:

  1. 一个 GameObject,用于保存当前与之碰撞的触发器(trigger),这样你才能抓住这个对象。
  2. 一个 GameObject,用于保存玩家当前抓住的对象。

在 Awake() 方法后添加:

这个方法接受一个碰撞体作为参数,并将它的 GameObject 保存到 collidingObject 变量,以便抓住和释放这个对象。同时:

  1. 如果玩家已经抓着某些东西了,或者这个对象没有一个刚性体,则不要将这个 GameObject 作为可以抓取目标。
  2. 将这个对象作为可以抓取的目标。

现在,添加触发器方法:

当触发器碰撞体进入、退出另一个碰撞体时,这些方法将被触发。

  1. 当触发器碰撞体进入另一个碰撞体时,将另一个碰撞体作为可以抓取的目标。
  2. 和第一段类似(第一段注释 //1),但不同的是玩家已经将手柄放在一个对象上并持续一段时间。如果没有这段代码,碰撞会失败或者会导致异常。
  3. 当碰撞体退出一个对象,放弃目标,这段代码会将 collidingObject 设为 null 以删除目标对象。

下面的代码用于抓住一个对象:

在这里,我们:

  1. 在玩家手中的 GameObject 转移到 objectInHand 中,将 collidingObject 中保存的 GameObject 移除。
  2. 添加一个连接对象,调用下面的 FixedJoint 方法将手柄和 GameObject 连接起来。
  3. 创建一个固定连接并加到手柄中,并设置连接属性,使它坚固,不那么容易断裂。最后返回这个连接。

被抓住的东西也要能够被放下。下面的代码放下一个物体:

这段代码将被抓对象的固定连接删除,并在玩家扔出去时控制它的速度和角度。这里关键的是手柄的速度。如果没有这个,扔出的东西会直直地往下掉,不管你用多大的力扔它。相信我,这绝对是错误的。

代码解释如下:

  1. 确定控制器上一定有一个固定连接。
  2. 删除这个连接上所连的对象,然后销毁这个连接。
  3. 将玩家放开物体时手柄的速度和角度赋给这个物体,这样会形成了一个完美的抛物线。
  4. 将 objectInHand 变量置空。

最后,在 Update() 方法中添加代码以处理手柄的输入:

  1. 当玩家按下扳机,同时手上有一个可以抓取的对象,则将对象抓住。
  2. 当玩家松开扳机,同时手柄上连接着一个物体,则放开这个物体。

在结构视图中选中手柄,将新脚本拖到检视器中将它添加为一个组件。

你不得不佩服你自己——你真的很棒!但我觉得你应该让你的 VR 体验变得更好!

制作一只激光笔

因为种种原因,激光笔在 VR 世界中非常有用。你可以用它们去戳破虚拟气球,做瞄准具使用或者调戏虚拟猫咪。

创建激光笔非常简单。只需要一个方块和一个脚本。在结构视图中创建一个方块 (Create > 3D Object > Cube)。

激光不可能有阴影,它们只会有一种颜色,因此我们可以用一个不反光材质实现这个效果。

在 Materials 文件夹下创建一个新材质,取名为 Laser,修改它的着色器为 Unlit/Color ,设置它的 Main Color 为大红色:

最后,将 Laser 拖到 Prefabs 文件夹,然后从结构视图中删掉 Laser 对象。

HTC Vive Unity 教程

现在,在 Scripts 文件夹下创建一个新脚本,名为 LaserPointer,并打开它。添加你早已熟悉的代码:

在 trackedObj 下面添加变量:

  1. 这个变量用于引用 Laser 预制件。
  2. 这个变量用于引用一个 Laser 实例。
  3. 一个 Transform 组件,方便后面适用。
  4. 激光击中的位置。

用这个方法显示一束激光:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年3月4日
下一篇 2017年3月4日

相关推荐