以 Pirate Cove 为例:如何将 Steam*VR 集成至 Unity*

本文的目标受众是谁?

本文主要面向希望将 Steam*VR 集成至场景之中的 Unity* 开发人员。我将假设读者已安装 HTC Vive* 且能够正常运行。如果没有,请访问 SteamVR 网站查看具体说明。

我为何创建 Pirate Cove VR 场景?

我的工作重点随时变化,需要逐渐倾斜至虚拟现实 (VR),使其融于 Unity 环境之中。我想将 SteamVR 集成至 Unity 之中、设计场景,并支持远距传动以便在场景之中灵活移动。

本文主要介绍我在 VR 集成过程中所积累的经验,并展示如何实现 VR 和场景的有机结合。本文的重点不是如何设计场景以及如何使用 Unity 实现一切正常运行,而是介绍如何将 VR 集成至场景之中。

我的创建目标是什么?

我尝试创建虚拟现实视觉体验。尽管使用 Unity 来创建体验,但它不是游戏本身。我创建的视觉体验模拟以海盗为主题的小型热带岛屿。我选择对我有利的事物;毕竟我生活在雨水充沛的太平洋西北地区。所以我希望我的体验带有一些热带风情。

我使用的工具有哪些?

我使用 Unity* 5.6。我从 Unity 资产商店购买了一些资产。资产的选择均围绕如何设置生活着大量海盗的热带岛屿:

  • Pirates Island
  • SteamVR
  • Hessburg Navel Cutter
  • Aquas

还有一些其他的免费零星物品。

我为创建该项目积累了哪些知识?

我曾使用过 Unity,以及英特尔® 实感™ 技术。我们的 SDK 包含英特尔实感 Unity 插件,而且我编写过插件,并创建了有关该插件的培训示例。

到目前为止我没有真正尝试过在 Unity 中设计第一人称类型的游戏,也从不担心性能、每秒帧数 (FPS) 等相关问题。使用英特尔实感技术和其他简单支持工具时编写过脚本。但没有设计过大型项目或场景,也没有处理过与此相关的问题。

该项目的终极目标是什么?

我希望通过项目创建更好地了解 Unity 以及如何打造 VR 场景。我希望了解正常运行 VR 的难度。如果成功将会有哪些收获?性能是否可接受?如果存在帧速率低的问题,我是否能够保持稳定,继续创建该项目?

以及从中获得乐趣。我希望从该项目创建过程中获得乐趣,并积累经验,这也是我为何选择创建以海盗为主题的热带岛屿的原因。我个人对从前的加勒比海盗时代非常着迷。

我对此存在哪些误解?

如前所述,在使用 Unity 方面,经验并不丰富。

第一个误解是关于渲染对象和渲染时机。这是什么意思?由于某种原因,我假设地形中包含譬如 3D 模型(比如巨大的悬崖),如果仅将悬崖的一半放在地形之上,Unity 不会尝试渲染不可见部分。我认为是某种类型的渲染算法阻止了 Unity 渲染处于地形之下的对象。显然不是这样。Unity 仍然渲染整个 3D 悬崖模型。

这种相同的概念适用于两个不同的 3D 悬崖模型。例如,如果有两个悬崖游戏对象,我假设将其中一座悬崖推入另一座悬崖之中,以创造出一座巨大悬崖的幻象,那么任何不可见的几何体或纹理将不会被渲染。同样不是这么回事。

显然,如果有几何体和纹理,无论是否隐藏在其他对象之中,Unity 都会将其渲染。我们需要考虑到这一点。这对我的工作没有多大影响,也没有找到解决办法,我只是在正常使用 Unity 的过程中发现了这一问题。

性能

性能是我积累最多经验的一个方面。使用 Unity 的地形工具来设计场景非常简单。添加资产也非常简单。并不是说能够非常简单地设计出色的场景,只是说你可以轻松地明白如何设计场景中的对象。尽管我自己认为 Pirates Cove 场景十分漂亮,但其他人可能会嗤之以鼻。但这是我第一次设计场景,而且我并不是尝试创建第一人称射击游戏。它是一种虚拟的视觉体验。

FPS: 与他人探讨 VR 时我了解到适用于 VR 的 FPS 是 90。我一开始尝试使用 Unity Stats 窗口。在 Unity 论坛上与他人交谈时我发现该窗口并不是能够达到真正 FPS 性能的最佳工具。别人建议我使用 FPS Display 脚本。显然这种方法比较准确。

遮挡剔除: 这种情况十分有趣。我正尝试解决一个完全不相关的问题时,一个同事过来帮忙。我们谈到 FPS 和可以帮助解决渲染问题的技巧,他介绍我使用遮挡剔除。他向我展示了一种人工操作方法:如何确定盒子的大小和形状。我必须承认,我只是简单地打开 Unity 的遮挡剔除窗口,让它自己算出遮蔽范围。这似乎帮助我解决了性能问题。

植被:我没有意识到为地形添加草地会对场景产生巨大的影响。我看过在其他场景中大片草丛在风中摇曳。因此我非常兴奋;将 FPS 将至 0,Unity 因此超载。我没有解决这一问题,而是简单地移除草丛,并使用三叶草纹理让场景看起来比较美观,但没有任何绘制调用。

如何让 Vive* 在场景中运行

我在文章开头提过,假设读者的工作站设置并运行 Vive。这是我找到的现有文章的浓缩版 HTC Vive Tutorial for Unity。我不打算深入介绍控制器条目,因为本文将介绍重点远距传动。我修改了远距传动版本,改动较小,因为我认为适度更好,更确切地说是在操作的过程中有所发现。

在进行 HTC Vive* 开发之前,必须下载和导入 SteamVR 插件。以 Pirate Cove 为例:如何将 Steam*VR 集成至 Unity*
导入插件后,项目中将出现以下文件结构:以 Pirate Cove 为例:如何将 Steam*VR 集成至 Unity*
在项目中,我在名为 VR 的层级结构中创建了根文件夹。在这里我拷贝了 SteamVR 和 CameraRig 预制件。你无需创建 VR 文件夹;我这里只是为了便于项目整理。以 Pirate Cove 为例:如何将 Steam*VR 集成至 Unity*
只需将 SteamVR 插件添加至项目层级结构,无需进行额外操作;看 CameraRig,

我将 CameraRig 放在场景中我希望一开始启动的地方。以 Pirate Cove 为例:如何将 Steam*VR 集成至 Unity*
放置 SteamVR CamerRig 预制件后,我需要删除主摄像头,以避免冲突。这时我可以启动场景,四处观察。我不能移动,但可以从静止的点四处观察,可以看到手中的控制器。不能随意走动,但至少可以看到任何地方。

查看全文


了解更多相关内容,请关注****英特尔开发专区