原文:
zh.annas-archive.org/md5/3F4ADC3F92B633551D2F5B3D47CE968D
译者:飞龙
前言
虚拟现实不仅仅是我们在二十世纪喜爱的媒体在立体眼镜中的呈现。它远不止于此。虚拟现实不仅仅是以立体 3D 的方式向我们展示周围世界的图像。从字面上说,没错,它确实是这样,但这有点像说音乐只是让我们的耳朵周围的空气动一动。从技术上讲是对的,但这样的解释太过简单,无法让我们理解它。虚拟现实通过与我们的感官互动,与我们认为我们理解世界的认知机制共舞。要理解虚拟现实并学习如何为其创建,我们必须接受它是一种全新的媒体,我们对它的语言、规则和方法所不知道的远远超过我们所知道的。这是强大的东西,毫无疑问,虚拟现实或类似的技术很可能成为二十一世纪的定义艺术形式。
你对这种说法持怀疑态度是正确的。鉴于技术和行业的现状,需要一些想象力才能看到我们现在所处的地平线之外。而且你可能已经看到,公众的期望与技术和艺术形式的实际状态相比,有时滞后,有时超前。因此,对于虚拟现实的意见各不相同。如果我们处于技术迈出重要一步的阶段,人们会对可能性感到惊讶和兴奋,而充满激情的博客则宣称世界已经改变。如果我们处于期望超前的阶段,突然间每个人都对他们的第一代 Oculus Rift 没有一夜之间变成全息甲板感到失望,我们会在博客上看到很多幻灭。在你阅读这篇文章时,很难预测钟摆在摆动时会在哪个方向。
然而,这是一个现实,也是为什么我们相信现在值得学习这种媒体的原因:虚拟现实即将到来,这是不可避免的,它将改变一切,即使从第一代技术的初级状态来看,这一点还不明显。这种媒体具有改变我们学习、玩耍、参与虚拟世界等方方面面的潜力。但这需要时间和想象力。
虚拟现实是一个处于十字路口的媒体。我们现在做出的决策将深远影响未来。在这个媒体中工作的开发人员将成为下一代塑造其语言和方法的人。在虚拟现实领域工作是在一个前沿工作,这是一个令人兴奋的地方。
在这本书中,我们打算为你提供一套坚实的工具,以便开始在这个领域上工作。本书采用实践性、动手操作的方法,教你如何使用虚幻引擎构建虚拟现实游戏和应用程序。每一章都会逐步引导你构建虚拟现实应用程序的基本构建模块,并配以深入的解释,说明你按照这些步骤进行时实际发生了什么,以及为什么要这样做。这就是为什么很重要的原因。理解底层系统和思想的工作原理对于你在完成这些教程后自己的工作至关重要,在这本书中,我们试图给你两者都提供——构建虚拟现实应用程序的方法和你在虚拟现实领域工作所需的背景知识。
你应该从这本书中获得对虚拟现实应用程序的构建有坚实的理解,以及构建它们所需的关于虚幻引擎的具体知识和理解。我们希望我们在这里一起完成的工作能够让你在这个新的领域中自由探索。
这本书适合谁阅读
如果你对创建 VR 游戏或应用程序感兴趣,对于看看 VR 如何能够增强你在当前领域的工作,或者只是对探索 VR 并看看它能做什么感兴趣,本书适合你。你不需要成为一名有经验的工程师,甚至对虚幻引擎有深入的了解,都可以从本书中获益;我们会在进行解释。对于完全不熟悉虚幻引擎的读者来说,在开始阅读本书之前,跟着 Epic 的入门教程走一遍会很有帮助,这样你就知道一切在哪里,但本书完全适合那些需要了解虚幻引擎如何与 VR 配合使用的有经验的虚幻用户,以及刚刚开始探索虚幻引擎的新用户。
无论你是完全新手,对 VR 开发和虚幻引擎都不熟悉,还是已经在其他引擎中进行 VR 开发,或者对虚幻引擎很熟悉但对 VR 还不熟悉,本书都能为你提供很多价值。(我们也希望那些已经熟悉使用虚幻引擎进行 VR 创作的人能够找到一些有趣的新视角和技巧。)
本书内容包括:
第一章,在 VR 中思考,介绍了 VR 作为一种媒介,并讨论了它在许多领域中的应用方式。我们讨论了沉浸和存在感的关键概念,并概述了设计和构建有效的 VR 体验的实践方法。
第二章,设置开发环境,带你了解设置虚幻引擎和移动 VR 开发环境的过程,并介绍了学习使用虚幻引擎和获取帮助的途径。对于那些对使用 C++感兴趣的人来说,本章还展示了如何设置开发环境来构建 C++项目和从源代码构建虚幻引擎。
第三章,你的第一个 VR 项目:Hello World,向你展示如何从头开始创建一个新的 VR 项目,创建 VR 时要使用的设置以及为什么要使用它们,以及如果你要为移动 VR 构建时需要做的不同之处。本章还教你如何将内容导入项目并与之一起工作,以及如何设置一些基本的蓝图,这些蓝图在 VR 开发中需要用到。
第四章,在虚拟世界中移动,教你如何创建和优化角色运动的导航网格,如何构建玩家控制的角色并设置输入处理,然后展示如何构建基于传送的运动方案以及如何实现无缝移动,以获得更沉浸式的虚拟现实体验。
第五章,与虚拟世界互动-第一部分,向你展示如何为玩家控制的角色添加手部,并使用手持动作控制器来驱动它们。
第六章,与虚拟世界互动-第二部分,展示如何设置动画蓝图以响应输入来动画化玩家的手部,并使玩家能够拾取和操作世界中的物体。
第七章,在 VR 中创建用户界面,向你展示如何为 VR 创建交互式的 3D 用户界面,并介绍了一个由该界面控制的 AI 伴侣角色。
第八章,构建虚拟世界并优化 VR,教你如何使用虚幻引擎编辑器的 VR 模式在 VR 中构建环境,以及如何找到环境中的性能瓶颈并修复它们。
第九章,在 VR 中显示媒体,教您如何在 VR 空间中在虚拟屏幕上显示视频媒体,包括单眼和立体。您将学习如何将 2D 和 3D 电影放在传统的虚拟屏幕上,如何将玩家包围在 360 度单眼和立体视频中,以及如何创建媒体管理器来控制其播放。
第十章,在 VR 中创建多人体验,教您关于虚幻的客户端-服务器网络模型,并向您展示如何从服务器复制角色、变量和函数调用到连接的客户端,如何设置玩家角色以在其所有者和其他玩家之间显示不同,以及如何设置远程过程调用以触发服务器上的事件。
第十一章,进一步的 VR-扩展虚幻引擎,向您展示如何安装和构建插件以扩展引擎的功能,并介绍如何使用蓝图强大的调试工具来深入了解陌生代码。
第十二章,接下来去哪里,向您展示了在深入进行 VR 开发时如何获取更多信息。
附录 A,有用的心智技巧,为您提供了一些有用的心智技巧,使您的开发更加高效。
附录 B,研究和进一步阅读,为您的搜索提供了一些有用的起点,这将逐渐帮助您加快学习速度。
为了充分利用本书
您不需要成为一名专业的虚幻引擎开发者才能从本书中受益,但了解事物的位置是有帮助的。如果您还没有安装虚幻引擎,不用担心-我们将在第二章中介绍这个,设置开发环境,但如果您以前从未使用过它,那么在重新开始阅读本书之前,可能有必要花些时间运行虚幻引擎的入门教程,以便了解一切的位置。
本书中的所有项目都经过设计,可以与 Oculus Rift 和 HTC Vive 的最低规格配合使用,因此无论您使用台式机还是笔记本电脑,只要您的系统符合这些最低规格,都应该可以正常运行。当然,您应该有一个 VR 头盔,并且如果您计划开发移动 VR,建议您也有一个台式机 VR 头盔,因为这将大大简化测试过程。本书中您将使用的所有软件都可以在网上免费获取,我们将指导您下载和安装,因此在开始之前,您不需要安装任何特殊的软件。
本书主要是为 PC 开发者编写的,但如果您在 Mac 上工作,您的开发环境设置将有所不同,但我们在引擎中所做的一切都是相同的。
就是这样。如果您有一个 VR 头盔、一个可以运行它的系统和互联网访问权限(因为我们将下载引擎和示例内容),您就拥有了所需的一切。
下载示例代码文件
您可以从您在www.packt.com上的账户中下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packt.com/support并注册,以便直接通过电子邮件接收文件。
您可以按照以下步骤下载代码文件:
-
在www.packt.com上登录或注册。
-
选择“支持”选项卡。
-
点击“代码下载和勘误”。
-
在搜索框中输入书名,然后按照屏幕上的说明进行操作。
下载完成后,请确保使用最新版本的解压软件解压文件夹:
-
Windows 用户请使用 WinRAR/7-Zip
-
Mac 用户请使用 Zipeg/iZip/UnRarX
-
7-Zip/PeaZip for Linux
本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Unreal-Engine-4-Virtual-Reality-Projects
。如果代码有更新,将在现有的 GitHub 存储库上进行更新。
我们还有其他代码包,来自我们丰富的图书和视频目录,可在github.com/PacktPublishing/
上找到。请查看!
下载彩色图像
我们还提供了一个 PDF 文件,其中包含本书中使用的彩色图像的截图/图表。您可以在这里下载:www.packtpub.com/sites/default/files/downloads/9781789132878_ColorImages.pdf
。
使用的约定
本书中使用了许多文本约定。
CodeInText
:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。以下是一个示例:“我们还应该快速查看一下您项目的.uproject
文件。”
代码块设置如下:
html, body, #map {
height: 100%;
margin: 0;
padding: 0
}
当我们希望引起您对代码块的特定部分的注意时,相关的行或项目将以粗体显示:
[default]
exten => s,1,Dial(Zap/1|30)
exten => s,2,Voicemail(u100)
exten => s,102,Voicemail(b100)
exten => i,1,Voicemail(s0)
任何命令行输入或输出都以以下方式编写:
UE4Editor.exe ProjectName ServerIP -game
粗体:表示新术语、重要单词或屏幕上显示的单词。例如,菜单或对话框中的单词会以这种方式出现在文本中。以下是一个示例:“选择窗口|开发者工具|设备配置文件以打开设备配置文件窗口。”
警告或重要提示会以这种方式出现。
技巧和诀窍会以这种方式出现。
第一章:在虚拟现实中思考
“所有的现实都是虚拟的。”
这是一个强有力的陈述,如果你以前没有考虑过,那么它并不明显,所以我会再说一遍——我们所经历的现实是我们头脑中的一种构造,基于高度不完整的数据。从进化的角度来看,它通常与现实世界很匹配,这并不奇怪,但它并不是对现实的字面反映——它只是对世界最可能状态的推断,根据我们在任何时候所知道的。
- Michael Abrash,Oculus 首席科学家
“关于一项技术最重要的事情是它如何改变人们。”
- Jaron Lanier,VPL 研究创始人,虚拟现实先驱,微软研究跨学科科学家
欢迎来到虚拟世界。(它在内部更大。)
在本书中,我们将探索使用虚幻引擎 4 创建虚拟现实应用程序、游戏和体验的过程。我们将花一些时间来研究虚拟现实是什么,以及我们可以如何有效地为这种媒介进行设计,然后,从那里开始,我们将使用虚幻引擎深入地演示这些概念,以制作展示和探索这些技术和思想的虚拟现实项目。
每一章都将围绕一个实践项目展开,从基础开始,如设置开发环境和创建第一个虚拟现实测试应用程序,然后深入探讨在虚拟现实中可以做什么以及如何使用虚幻引擎 4 来实现。在每个项目中,我们将引导您完成构建一个展示虚拟现实特定主题的项目的过程,并解释所使用的方法,并在某些情况下演示一些替代方法。对我们来说,重要的是,当您构建这些项目时,您不仅要知道如何做我们描述的事情,还要知道为什么要以这种方式做,这样您就可以将所学到的知识用作计划和执行自己工作的起点。
在本章中,我们将介绍虚拟现实是什么,以及它目前在各个领域中的许多用途。我们将讨论虚拟现实中最重要的两个概念:沉浸感和存在感,以及了解这些概念以及它们的工作原理将如何帮助您为用户提供更好的体验。我们将提出一系列开发沉浸式和引人入胜的虚拟现实体验的最佳实践,并讨论虚拟现实开发所面临的一些独特挑战。最后,我们将整合这些知识,并深入探讨规划和执行虚拟现实项目设计的方法。
简而言之,本章将带领我们了解以下主题:
-
什么是虚拟现实?
-
在虚拟现实中我们可以做什么?
-
沉浸感和存在感
-
虚拟现实的最佳实践
-
规划您的虚拟现实项目
什么是虚拟现实?
让我们从头开始,谈谈虚拟现实本身。在最基本的层面上,虚拟现实是一种将用户沉浸到模拟世界中的媒介,使他们能够看到、听到并与环境以及环境中的事物进行交互,而这些事物在现实世界中并不存在。用户完全沉浸在这种体验中,这种效果被虚拟现实开发者称为“沉浸感”。沉浸在一个空间中的用户可以四处看看,通常可以移动和互动,而不会破坏他们实际存在的幻觉。沉浸感,正如我们很快将看到的,是虚拟现实工作的基础。
Rob Ruud 使用 HTC Vive 头戴式显示器测试 Ludicrous Speed 的早期版本
虚拟现实中的沉浸感是用来描述虚拟现实系统将用户置于模拟世界中的能力。他们可以四处看看,并且在许多情况下,可以像真的在那里一样移动和互动,因为头戴式显示器屏蔽了实际环境,所以他们很少有冲突的线索来提醒他们他们并不在那里。
虚拟现实硬件
沉浸用户的最常见方式,也是本书将要讨论的方式,是通过使用头戴式显示器(HMD),通常简称为头戴式显示器。 (当然还有其他的 VR 方式,比如在墙上投影图像,但在本书中,我们专注于头戴式 VR。)用户的头戴式显示器显示虚拟世界,并跟踪他们的头部运动来旋转和移动视角,以营造他们实际上正在环顾四周和在物理空间中移动的错觉。一些头戴式显示器,尽管不是所有的都包括耳机,通过启用称为空间化音频的过程,使环境中的声音听起来好像来自虚拟世界中的源头。
在本书和其他关于 VR 的写作中,你会看到HMD和头戴式显示器这两个术语互换使用。它们都指的是同一样东西。
有些头戴式显示器只能跟踪用户的视线方向,而其他一些还可以跟踪用户的位置变化。如果你使用的是只能跟踪旋转而不能跟踪位置的头戴式显示器,并且你向前倾斜以便更仔细地观察一个物体,什么都不会发生。当你试图靠近物体时,物体看起来好像离你越来越远。如果你在一个能够跟踪位置的头戴式显示器上这样做,你的虚拟头部会靠近物体。我们使用术语自由度(DoF)来描述物体在空间中的运动方式。(是的,发音为doff是可以的,所有开发者都这样发音。)请看以下几点:
-
3DoF:只跟踪旋转而不跟踪位置的设备通常被称为 3DoF 设备,因为它只跟踪描述旋转的三个自由度:设备向一侧倾斜的程度(横滚),向前倾斜(俯仰)或向一侧转动(偏航)。直到最近,所有移动 VR 头戴式显示器都是 3DoF 设备,因为它们使用类似于手机中的惯性测量单元(IMUs)来检测旋转,但无法知道它们在空间中的位置。Oculus Go 和三星 Gear 头戴式显示器就是 3DoF 设备的例子。
-
6DoF:既可以跟踪位置也可以跟踪旋转的设备是 6DoF 设备,因为它跟踪了全部六个自由度——横滚、俯仰和偏航,还有上下、左右和前后运动。在空间中跟踪物体的位置需要你有一个固定的参考点,从这个参考点可以描述物体的运动。大多数第一代系统需要额外的硬件来实现这一点。HTC Vive 的 Lighthouse 基站或 Oculus Rift 的 Constellation 摄像头为桌面系统提供了这种位置跟踪。Windows 混合现实头戴式显示器和独立头戴式显示器,如 Oculus Quest 和 Vive Focus,使用头戴式显示器上的摄像头阵列来跟踪头戴式显示器在房间中的位置(我们称之为内部跟踪),因此它们不需要外部摄像头或基站。HTC Vive、Oculus Rift、HTC Vive Focus、Oculus Quest 和 Windows 混合现实头戴式显示器都是 6DoF 设备。
3DoF 设备只能跟踪旋转,所以用户只能环顾四周或指向某个方向,但不能从一侧移动到另一侧。6DoF 设备不仅可以跟踪旋转,还可以跟踪位置,所以用户不仅可以环顾四周,还可以移动。
头戴式显示器可以连接到计算机上,如 Oculus Rift 和 HTC Vive,这样可以利用连接的计算机的全部计算能力来驱动视觉效果;或者它们可以是独立设备,如三星 Gear、Oculus Go、Oculus Quest 和 HTC Vive Focus。在撰写本文时,无线连接 PC 和 VR 头戴式显示器开始进入市场。
大多数头盔还配备了输入设备,允许用户与虚拟世界进行交互,可以充当指针或手。手持设备和头盔一样,可以在三个或六个自由度上进行跟踪。3DoF 设备(如 Oculus Go 的控制器)本质上是指针,用户可以瞄准它们,但无法伸手抓取物体。6DoF 设备更像是虚拟手,允许用户以更多种方式与世界进行交互。
虚拟现实不仅仅是硬件
当新开发者首次接触虚拟现实时,他们经常犯的一个重大错误是试图将他们在 2D 空间中习惯创建的传统设计应用到虚拟现实空间中,但在大多数情况下,这是行不通的。虚拟现实是一种独立的媒介,它不遵循之前的媒体所遵循的相同规则。值得花一点时间来看看这意味着什么。
当大多数人第一次考虑虚拟现实时,他们看到头盔并认为它主要是一种视觉体验——传统的平面媒体以立体方式展示。这样看起来是可以理解的,但他们的感知忽略了重点。是的,虚拟现实头盔(取决于是否包含集成音频)主要或完全是一种显示设备,但它为用户创造的体验与传统平面屏幕创造的体验非常不同。
让我们想象一下,你正在看一张照片或一个俯瞰高楼边缘的 2D 视频。你看到远处的街道,但它们并没有真正让你感觉到它们离你很远。它们只是图像中的小部分。现在拿同样的图像,通过虚拟现实头盔以立体方式呈现,你可能会感到眩晕。为什么会这样呢?看一下下面的截图:
非沉浸式媒体,无论多么庞大或详细,仍然让观众感到周围有提醒他们场景并不真实的东西。而沉浸式媒体则似乎完全包围用户。(场景:Epic Games 的 Soul:City 环境包)
首先,正如我们刚才提到的,你被沉浸在体验中。周围的世界没有任何其他东西提醒你这不是真实的。让我们回到之前的例子——你电视上的建筑边缘——转过身来看看你身后。哦。你只是在你的客厅里。即使你直接看着它,你可能购买到的最大的电视仍然会让你有很多周围视野来提醒你你在那里看到的不是真实的。平面屏幕上的一切,即使是 3D 屏幕,都发生在窗户的另一边。你在观看,但你并不真正在那里。在虚拟现实中,窗户消失了。当你向右看时,世界仍然在那里。向后看,你仍然在其中。你的感知完全被一个成为环境而不仅仅是你所看到的画面的体验所占据。
其次,立体图像创造了真实深度的感觉。你可以看到下面的陡峭有多深。街道上的汽车不仅仅是小,它们也很远。在允许运动跟踪的 6DoF 头盔中,你在现实世界中的动作在虚拟世界中得到了反映。你可以倾斜到边缘上或者后退。这种沉浸感、真实深度感知和对你动作的自然反应结合在一起,使你的身体相信你所感知的是真实的。我们称之为“存在感”,这是一种主要通过身体感受到的感觉。
虚拟现实中的“存在感”指的是用户感觉自己实际上身处于虚拟世界中,对环境作出反应,就像他们真的在那里并经历这些事情一样。创造存在感的体验是虚拟现实的全部意义——这是它能做到而其他媒体无法做到的主要事情。
沉浸的机制和由此产生的体验是虚拟现实独有的。其他媒体无法做到这一点。
在阅读有关虚拟现实的文章时,有时会看到“存在感”和“沉浸感”这两个术语被互换使用,但通常更清楚的是将“存在感”视为目标-即您试图在用户中创造的感觉,而将“沉浸感”视为实现这一目标的机制。
实现存在感是困难的
在谈到存在感时,值得指出的是,它是一种脆弱的现象,当前虚拟现实技术仍面临一些挑战,无法完全可靠地创造出存在感。其中一些问题源于硬件,随着技术的进步,这些问题几乎肯定会消失。例如,用户可以感觉到头戴式设备压在脸上,对于有线头戴式设备,他们可以感觉到从头戴式设备延伸出来的电缆。当前一代头戴式设备的视野太窄,无法提供外围视觉(桌面设备的视野为 110°,而你的眼睛可以感知到两倍宽的视野)。显示分辨率还不够高,用户仍然能够看到单个像素(虚拟现实用户称之为“屏门效应”),而且棘手的光学系统如果没有完美对准,会使用户的视野模糊。这意味着在实践中,很难在虚拟现实头盔上阅读小字,而且当用户不得不调整头盔以重新进入镜片的“甜蜜区域”时,他们有时会想起硬件的存在。
然而,从事物的现状来看,很明显这些硬件挑战不会持续太久。自包含和无线头戴式设备正在迅速进入市场,具有越来越可靠的跟踪技术,不再依赖外部设备。显示屏变得更宽,分辨率变得更高,光学波导显示技术显示出更轻、更广的焦点区域的巨大潜力。虚拟现实已经非常出色,很容易看出它将继续改进。
还有一些其他事情可能会破坏存在感,我们对此无能为力-例如意外用控制器撞到桌子,或者撞到家具,失去跟踪,或者听到来自体验之外的声音。当我们能够控制用户的空间时,我们可以处理这些问题,但在我们无法控制的情况下,我们无能为力。
尽管存在这些限制,但想象一下当前一代虚拟现实技术能够给用户带来多么强烈的存在感,并意识到它只会变得更好。用户在虚拟现实中所经历的体验,相信程度远远超过其他媒体。他们以一种其他方式无法实现的方式进行探索和学习。他们比以任何其他方式更深入地与人和地方产生共鸣和联系,除了亲身在那里,其他方式都无法达到这种程度。没有其他东西能够达到这种深度。而我们只是刚刚开始。
我们可以用虚拟现实做什么?
那么,我们可以用虚拟现实做什么呢?让我们来探索一下,但在开始之前,值得指出的是,这种媒介仍处于起步阶段。在撰写本文时,我们正处于消费者虚拟现实硬件的第一代,绝大多数人甚至还没有见过虚拟现实头盔,更不用说体验过了。试试这个:下次你在餐厅或公共场所时,问问自己周围的人中有多少人可能见过虚拟现实头盔-最多只有几个人。现在,他们中有多少人看过电影(一个有百年历史的媒介),看过电视(有三分之二世纪的历史),或者玩过电子游戏(接近半个世纪)?虚拟现实就是这么新。我们还远远没有发现我们可以用它做什么。
因此,请将这些想法作为当前事物状态的指南和一些创意的素材,但请意识到我们还有很多很多尚未想到的东西。为什么不让自己成为发现新事物的人呢?
虚拟现实游戏
正如我们刚才讨论的,VR 的核心是创造一种存在感的体验。如果你正在开发一款 VR 游戏,这意味着专注于给玩家一种“身临其境”的设计是中等候选者。《上古卷轴 VR》和《辐射 4 VR》非常成功地让玩家感觉自己真的身处于这些广阔的世界中。类似《迷失之境》的游戏将玩家置身于一个可以探索和操纵的空间中,也能很好地发挥作用。
模拟手部动作的运动控制器的加入,例如 HTC Vive、Oculus Rift 和 Oculus Quest 提供的控制器,使开发人员能够创建具有复杂交互的模拟,例如《职业模拟器》和《Vinyl Reality》,这是使用传统游戏控制器无法实现的。而 Tender Claws 的《虚拟虚拟现实》则是一个很好的例子,它使用 Oculus Go 的 3DoF 控制器实现了类似 6DoF 的控制。
VR 的沉浸感意味着将你包围在体验中的游戏,如《太空海盗训练师》,效果很好,因为玩家可以与周围的角色互动,而不仅仅是面前的东西。这种需要四面八方观察的设计可以成为你的设计重点。
VR 中引起玩家运动感的感觉将快节奏的游戏,如《Thumper》和《Ludicrous Speed》,转变为身体参与的体验,而《节奏光剑》等游戏则利用玩家的身体动作将游戏变成了健身工具。
然而,VR 中的游戏也面临一些挑战。这种存在感和身体运动的体验使得体验非常吸引人,但并不意味着每种游戏设计都适合 VR。简单地将 2D 游戏移植到 VR 中可能行不通。在 VR 中,放置在 2D 空间中的 HUD(通常缩写为 HUD)不起作用,因为没有 2D 平面可以放置它。在 2D 中可能完全正常的快速移动在 VR 中可能会让玩家晕动。选择为 VR 制作游戏需要是一个有意识的选择,并且你需要考虑到这种媒介的优势和挑战进行设计。
当考虑将游戏或游戏设计从 2D 转移到 VR 时,需要考虑几个特定的方面:移动方案在 VR 中是否有效?如何设计 UI 以适应 VR 中的世界?游戏是否符合 VR 的性能限制?将这个游戏放入 VR 中是否提高了游戏体验?我们将在后面的章节中讨论所有这些考虑因素——移动、UI 和性能。
交互式 VR
交互式 VR 体验不仅仅局限于游戏。例如《Tilt Brush》这样的 3D 绘画应用程序允许用户在房间尺度的 3D 空间中雕刻和绘画,并与其他用户分享他们的作品。《Google Earth VR》允许用户探索地球,其中大部分是以 3D 形式呈现的。交互式叙事体验,如《Colosse》、《Allumette》、《Coco VR》等,将用户沉浸在一个故事中,并允许他们与世界和角色进行互动。交互式 VR 应用程序和体验可以用于生产力或娱乐,并且可以采用几乎任何想象得到的形式。
在考虑创建交互式 VR 应用程序时,有几个考虑因素值得记住。在 VR 中,鼠标和键盘通常不可用-用户无法看到这些设备以使用它们,因此交互通常最好围绕 VR 系统提供的控制器进行设计。在 VR 中阅读文本可能会很困难-显示分辨率正在提高,但仍然很低,小字体可能无法阅读。缺乏 2D HUD 意味着传统菜单不容易使用-通常,这些菜单需要构建到世界中或附加到玩家的虚拟手上(参见《Tilt Brush》的一个很好的例子)。
输入和输出是交互式虚拟现实的主要考虑因素-用户如何将输入信息传达给系统,以及他们如何从系统中获取信息?在这两种情况下,您必须根据系统的优势和劣势进行设计。您没有 2D 的 HUD 或鼠标,但您可以在空间中移动和操作物体。虚拟现实显示器的分辨率还无法接近桌面显示器,因此阅读大量文本可能行不通。在虚拟现实中成功的设计将这些因素考虑在内,并将其转化为有意识的设计选择。
交互式虚拟现实为全新的探索和互动方式提供了令人难以置信的可能性,我们可能还没有看到全部的可能性范围。
虚拟现实电影 - 电影、纪录片和新闻报道
虚拟现实之所以非常适合某些类型的游戏,是因为它能够创造出存在感,这也使其成为纪录片和新闻报道应用的强大媒介。虚拟现实能够将用户沉浸在一种情境或环境中,并通过让观众共享深刻的体验来唤起共鸣。虚拟现实先驱电影制片人 Chris Milk 将虚拟现实称为“终极共鸣机器”,我们认为这是一个公正的描述。Alejandro Iñárritu 的《CARNE y ARENA》在 2017 年获得了奥斯卡特别奖,以表彰它对这种媒介的强大运用,以深入讲述故事。虚拟现实通过沉浸创造存在感的能力使得一些在平面屏幕上无法实现的事情成为可能。
玩家在洛杉矶县艺术博物馆体验 Alejandro Iñárritu 的《CARNE y ARENA》
虚拟现实中的电影和视频可以以几种方式呈现,这些方式通常归结为图像呈现的虚拟屏幕的形状以及这些图像是以单眼 2D 还是立体 3D 呈现的。平面或弯曲的表面通常用于呈现传统电影或电视中的媒体,而圆顶、全景或球体可以用于将观众包围在更沉浸式的 2D 或 3D 体验中。
单声道 360°视频环绕着观众,但缺乏深度-它只是映射到玩家周围的一个球体上。这样做的优点是更容易制作,需要更少的存储空间和更便宜的设备,并且对于许多场景来说,这与真正的立体声之间的区别可能很难察觉。大多数早期的虚拟现实视频都是以这种方式制作的。立体声 360°视频同样映射到玩家周围的球体上(我们将在后面的章节中学习如何做到这一点),但对每只眼睛显示不同的图像以实现真正的立体声深度(我们也将学习如何做到这一点)。使用光场、光探测与测距(LIDAR)和摄影测量法将真实环境映射到真正的 3D 虚拟环境中的体积视频的新方法开始出现,并且随着技术的成熟和处理能力的增加,这些方法可能会变得更加普遍。截至目前,它们仍然相对较新,通常昂贵,并且仍然主要局限于高端专业人员和学术界。
纪录片和新闻报道通常以单声道或立体声的 360°摄像机或设备拍摄的实景视频形式呈现,使观众能够环顾四周并沉浸在一个无缝的感官环境中。360°电影通常旨在提供直接、沉浸和引人入胜的体验,但通常不具有互动性。观众通常不能自由地在场景中移动,除非触发切换到新场景,并且通常不能影响场景中发生的事件。
在规划一个电影式虚拟现实体验时,需要做出两个主要选择:体验是以单声道还是立体声呈现,以及虚拟屏幕的形状是什么?
在电影制作中,VR 是另一个领域,仅仅将平面屏幕的语言移植过来是不够的。360°电影中没有帧的概念,也没有特写或远景的概念。VR 电影制作者必须非常小心地移动摄像机,因为移动或抖动的摄像机很容易让观众感到恶心。VR 电影制作仍处于起步阶段,我们开始了解这种语言与传统电影或电视的语法之间的差异,但在完全理解这种新媒体的语言之前,我们还有很长的路要走。
这并没有阻止像 Alejandro Innaritu、Nonny de la Pena、Chris Milk 和 Felix and Paul 这样的电影制作者在 VR 中创造令人惊叹和有力的电影体验,这凸显了参与创造和发现一种强大而全新的艺术形式的时代是多么令人兴奋。
VR 电影的变体包括以下内容:
-
叙事故事
-
纪录片
-
新闻报道
-
音乐会和活动
-
体育
-
虚拟旅游
建筑、工程和建筑(AEC)以及房地产
VR 非常适合建筑、工程和建筑规划,因为它允许设计师快速探索和迭代设计,并且它是设计师和客户之间的优秀沟通工具。VR 提供了一种沉浸式体验,使用户能够以真实世界的比例探索和审查空间,这是通过其他任何媒介都无法实现的。
建筑、工程和建筑行业通常被统称为 AEC。
出于与 AEC 相同的原因,VR 对于房地产应用同样有用,为潜在买家提供了远程参观房屋的机会,或者在建造之前体验空间。没有任何媒介比 VR 更好地代表空间和比例。
正如我们将看到的,虚幻引擎特别适用于建筑应用,因为它基于物理的材料和光照工作流使得可以创建看起来真实并对光线做出响应的表面,就像它们的真实世界对应物一样。
除了提供逼真的光照和阴影模型,非常适合实现空间的逼真表现外,Epic Games(虚幻引擎的制作商)还提供了一套专为非游戏用途设计的工具,如建筑可视化。其中最重要的是一个名为“Datasmith”的工具包,它允许将高细节场景从建筑计算机辅助设计(CAD)和 3D 软件包导入到虚幻引擎中,几乎不需要修改就可以重现原始来源的对象放置、光照和阴影。
建筑可视化通常缩写为 archvis 或 archviz。
在实际工作流程方面,用于 VR 的工程和建筑环境通常从 CAD 或 3D 数字内容创建(DCC)工具开始,然后通过手动或使用 Datasmith 工作流程将其引入虚幻引擎,从而可以将其制作成可以在 VR 中探索的环境。
对于房地产应用,环境可以完全建模为 3D,也可以拍摄为 360°球体或全景图,这样提供的互动性较少,但制作起来更容易、更便宜。尽管它限制了用户的移动,但 360°摄影仍然可以提供一种沉浸式的空间感,用户在其他情况下无法体验到。
工程和设计
与建筑规划一样,VR 可以成为工程和其他设计应用的非常有效的工具。设计可以在虚拟环境中进行深入测试和迭代,无需建造物理原型,并可以放置在允许在上下文中进行评估的虚拟环境中。设计师可以使用 VR 来探索设计,看看零件如何拼装在一起,并与利益相关者进行沟通,这种体验与实际处理和互动对象的体验非常相似。
教育和培训
可以说,VR 在教育领域开始其生命,早在 1929 年,埃德温·林克(Edwin Link)就使用早期的沉浸式模拟器创建了林克训练器(Link Trainer)来培训飞行员。沉浸和互动的结合使得 VR 成为教育、学习和探索的强大工具。从本质上讲,VR 能够提供比其他媒体更具体和体验性的对主题的理解。大多数其他媒体传达的是思想,而 VR 传达的是直接的体验。
传统教育通常侧重向学生传达事实,但如果学生还没有足够的背景知识来了解他们首先需要这些事实,那么孤立的事实可能会让他们感到无聊或不知所措。相比之下,VR 可以让学生通过直接使用材料和概念的表达来发现和学习概念,实践真实的技能,将抽象的想法转化为经验。沉浸式学习自然而然地带来了上下文,而 VR 唤起存在感的能力可以在学习的主题中创造出物理、社交或情感框架。这可能使学生以其他方式无法实现的方式使其有意义或可理解,并允许学生探索复杂系统的各个部分如何相互配合。
VR 还可以帮助集中注意力,因为它将学生的感官与不相关的干扰隔离开来,并且可以有效地创建虚拟社交学习环境,如虚拟教室。
教育性的 VR 可以(也应该)易于使用、沉浸式和引人入胜,并对学生有意义,可以让学生按照自己的节奏学习,并利用其互动来推动自己的探索和发现。
商业、广告和零售
在商业领域中(有时使用“虚拟商务”这个昵称来描述),VR 为顾客提供了一系列体验产品的新方式,并可以创造机会将顾客与他们可能不会遇到的产品联系起来。例如,汽车买家可以在虚拟汽车配置器中探索颜色选择和选项,以体验他们选择的选项在他们周围的外观和感觉。这种体验也可以在将理想购买从想象转化为真实感的过程中起到重要作用。
对于零售商来说,虚拟现实(VR)提供了一种能够接触到无法亲自到店的顾客的方式,增加了可访问性和销售的可能性。顾客可以更清楚地在上下文中看到产品,减少困惑和退货。即使产品可能太大、太远或太复杂以至于无法通过其他方式有效展示,VR 也可以让顾客有机会在购买前试用。例如,虚拟展厅可以让顾客将家具放在虚拟环境中,看到这些家具如何搭配以及它们在自己的空间中如何适应。
VR 还可以用于促进与品牌的情感联系,将顾客置于支持品牌情感空间的虚拟环境或体验中,例如山顶或时装秀。
医学和心理健康
VR 在心理学、医学、神经科学以及物理和职业治疗方面也提供了有希望的机会。例如,VR 可以通过“减慢时间”在物理疗法中使用,让患者缓慢而重复地执行动作,并且在疼痛管理方面取得了成功。VR 还可以为医学和紧急情况培训提供模拟的虚拟患者。
在心理和行为健康领域,VR 在评估、培训和治疗与压力相关的疾病方面具有强大的应用。患者可以接触到复杂的刺激,以帮助评估和康复中风、创伤性脑损伤和类似的神经系统疾病的认知功能。
还有很多其他的东西
所描述的虚拟现实(VR)的所有用途都有一个共同点,那就是 VR 在传达背景和通过存在感创造意义方面特别有效,并且可以让人们与物体进行复杂的物理互动,这是平面屏幕无法实现的。毫无疑问,还有更多有价值的 VR 用途尚未被发现或考虑到。唯一的限制就是我们的想象力。
沉浸感和存在感
现在我们已经对 VR 是什么以及我们可以用它做什么有了一些背景了。让我们开始动手学习以下内容:
-
VR 的工作原理
-
可能会破坏沉浸感的因素
-
作为开发人员,我们需要做的是确保我们构建的 VR 体验能够成功地运行
为此,让我们先列出一些 VR 的最佳实践,然后我们将深入讨论它们。
我们将首先讨论我们试图创造的体验。
沉浸感
正如我们之前讨论过的,当 VR 起作用时,它通过我们称之为“沉浸”的过程起作用,我们之前将其描述为在虚拟世界中感觉到身体存在的体验。要实现沉浸式体验,需要满足一些条件。
利用所有感官
首先,它必须涵盖用户感官的足够范围,以防止来自 VR 体验之外的竞争感官将用户拉回到虚拟空间之外。实际上,这就是为什么 VR 头戴设备被设计成阻挡所有其他光线的原因,以及为什么它们通常包括耳机或内置音频的原因。我们看到或听到的任何与 VR 体验无关的东西都可能破坏沉浸感。
虽然视觉和声音很容易通过眼睛和耳朵传达,但物理感觉更难以产生。在 VR 中,我们将物理感觉称为“触觉”。几十年的研究已经致力于找出如何重现物理感觉,但实际上,这是一个难题。在当前一代 VR 硬件中,触觉以玩家手柄中的震动装置的形式存在,它会在适当的时候震动手柄。虽然它仅限于握持手柄的手部,但即使在设计中使用这种基本的触觉反馈,仍然可以令人惊讶地有效地在虚拟空间中创造出一种物理感。当用户的虚拟手接触到物体时,稍微震动一下可以大大增强物体的存在感,并让用户感知其边界并知道何时与之接触。
记住要利用所有感官来创造沉浸式体验,不仅仅是视觉。使用声音让耳朵参与体验,并使用控制器上的触觉反馈来创造物理线索。
确保感官输入相互匹配并符合用户的期望
感官需要符合用户的期望,并且它们需要相互匹配,以使沉浸式体验感觉真实。当用户转动头部时,他们所看的物体应该在他们的视野中移动,就像它们在物理世界中的位置一样。这部分工作在 Unreal 引擎和 VR 硬件中已经很好地为您处理了,但接下来的声音部分通常被开发人员忽视。
产生声音的物体应使用空间化音频,以确保声音似乎来自物体所在的位置。正如我们刚才提到的,当用户似乎触摸到物体时,物理物体应使用触觉反馈产生触觉反应。
HMD 和虚幻引擎已经为您处理了视觉对象的行为,但请确保使用空间化音频将声音定位到其表面源,并尝试使用触觉反馈使物理动作更加真实。
尽量降低延迟
视觉和音频体验的质量对于沉浸感非常重要,而推动这种质量的最重要因素是体验的流畅性和响应性。对于开发人员来说,这意味着在 VR 中,帧率比其他任何考虑因素都更重要。VR 开发人员使用术语延迟来描述 VR 应用的响应性,即用户执行动作(例如转动头部)和看到视觉结果(在本例中,世界似乎围绕他们旋转)之间的时间。开发人员称之为运动到光子时间,这很重要。如果用户转动头部而世界滞后,它将不会感觉真实,甚至更糟,可能会让他们感到恶心。当前的 VR 头显在硬件和软件方面已经做了很多工作来最小化和掩盖延迟,但作为开发人员,您也必须尽力降低延迟。
延迟是指 VR 应用对用户的视觉反应速度,对于沉浸式体验至关重要。研究表明,您可以容忍的最高延迟是 20 毫秒,但您应该争取更低的延迟。
实际上,这意味着当您必须在场景细节和帧率之间进行选择时(作为开发人员,您将经常面临这个选择),请选择速度。用户更容易原谅较低分辨率的纹理,而不是丢失帧率。在 VR 开发中,您的大部分工作将集中在使场景以可接受的帧率运行上,我们将在虚幻引擎中详细讨论如何做到这一点。现在,请确保记住:保持低延迟对于沉浸式 VR 至关重要,您在设计和开发 VR 应用时必须考虑到这一点。
当面临图像质量和帧率之间的选择时,请始终选择帧率。如果帧率下降,精美的纹理、高多边形模型和动态阴影都无法给用户带来令人信服的体验。与此同时,用户在体验流畅时会在自己的思维中填充大量细节,而如果延迟过高,他们将完全不相信,甚至会感到恶心。
确保与世界的互动合理
与物体的互动应保持一致,并且应合乎常理。由于 VR 的沉浸性特性,用户对物体的期望会增加,他们希望物体的行为与现实生活中的行为相同。在传统媒体中,用户通过平面屏幕观看并受限于画面,他们的眼睛和大脑会不断提醒他们正在看一个不真实的平面图像,他们会原谅很多。但在 VR 中,世界已经包围着他们,似乎是真实的,他们期望它的行为也像真实一样。
在现实世界中不按照预期行为或响应的事物会打破用户的体验和沉浸感。在实践中有一个限制:当然,您不能使世界中的每个物体都可以互动,但在可能的程度上,您应该关注用户的期望,并尽量满足它们。如果您在场景中放置一个看起来可以拿起来的物体,那么请期望用户会试图拿起它,并且要明白如果它的行为与他们的期望不符,那么您将会破坏沉浸感。尽量使场景中的物体看起来互动,并且如果它们不能互动,考虑将它们移出游戏区域或改变它们的外观以管理用户的期望。这是另一个需要判断的领域-并非所有事物都可以互动,而且根据您尝试创建的体验类型,您可能并不总是希望它们互动。在决定您的世界中的物体应该如何行为时,您应该有意识地选择以沉浸感为重点,并且这些选择在世界空间内应该感觉一致而不是随意的。
用户会试图触摸看起来可以触摸的物体,并试图移动它们。在您能够满足他们期望的地方,请尽量满足他们的期望,或者设计场景以使这些互动不被期望。
探索 VR(尤其是带手柄的 6DoF VR)为互动提供的独特机会。在以前的媒体中,用户主要使用鼠标、按钮和操纵杆进行互动,但在 VR 中,用户的手与世界直接互动,这使得一系列全新的互动变得可能。在传统游戏中,浇水壶可能通过按下按钮来使用,但在 VR 中,用户可以挤压控制器握把来拿起它并翻转手掌来使用它。思考在您的世界中什么是合理的,以及当用户的手进入画面时会发生什么,并设计以利用这些机会。界面不再只是由按钮组成。
用户对互动的期望会因您所创建的体验类型而异。如果您正在制作一个模拟身临其境的游戏,沉浸感非常重要。另一方面,如果您正在制作一个电影观众,用户可能并不在乎附近桌子上的虚拟咖啡杯是否可以拿起来,因为这不是他们的目的。您需要了解对用户来说什么是重要的,什么不重要,并满足这些期望。
您如何呈现用户的手也会影响他们的行为期望。如果它们被建模为手,用户可能自然地期望他们可以拿起物体并移动它们。如果您显示的是控制器、调色板、武器或其他工具的模型,那么您就在暗示一种不同类型的互动。用户会试图做他们看起来可以做的事情。
构建一个一致的世界
正如我们之前在关于互动的讨论中提到的,整个体验应该在逻辑上合理。用户应该能够根据您在世界中给予他们的东西构建一个现实模型,即使它是一个抽象的或完全是幻想的。您正在构建的地方应该感觉像一个地方,有自己的语言和规则。
你在虚拟世界中投入的细节会对此产生影响。体验越沉浸,沉浸感就越脆弱。增加细节和沉浸元素会产生对其他世界中的一切都能达到同样标准的期望,并且如果某些事物与世界表面规则不一致,会使用户退出沉浸状态。在许多情况下,你可能希望以更加风格化的方式呈现你的世界,以管理用户的期望。沉浸并不要求虚拟现实体验与现实世界完全相同,而是要求体验在自身内部保持一致。
小心不要与用户对自身身体的感知相矛盾。
小心添加与玩家对自身身体的感知相矛盾的沉浸元素。我们都对自己的身体在哪里以及在做什么有一种自然的感知。这被称为“本体感”,它是一种即使你不看它们也能告诉你手臂和腿在哪里的感觉。以不符合这种感觉的方式呈现用户的身体会破坏沉浸感。
通常渲染用户的手部效果很好,因为动作控制器可以准确告诉我们手的位置,但渲染其他部位可能不是一个好主意,因为我们无法得知其他部位的真实动作。如果你猜测并且猜错了,用户会感觉不对劲,打破沉浸感。最好的方法往往是不要猜测,只渲染手到手腕的部分,让手臂、腿和身体保持想象。有趣的是,用户似乎更喜欢这样。他们往往不会注意到身体是看不见的,直到有人指出来,而渲染错误的身体会引起注意。
出于类似的原因,如果逼真的肉质手部与用户的真实手部不匹配,用户可能会感到不舒服。如果手部被风格化为半透明、卡通或机器人样式,用户会感觉更好,因为他们不会觉得自己在试图模拟现实并且做错了。
动画师通常提到一个称为“诡异山谷”的现象,当模拟接近人类外貌时,会触发观众对其所有不正确之处的本能意识。为了使模拟工作,它要么需要足够风格化以使观众不期望真实感,要么需要完美地实现真实感。介于两者之间的任何东西都会让人感到毛骨悚然。同样的原则也适用于虚拟现实中对用户自身身体的呈现。不要几乎做对,要么完美,要么风格化。
决定你的应用的沉浸程度,并相应地进行设计。
最后,并不是每个虚拟现实的使用都需要同样的沉浸感。你在这方面的选择取决于你的应用的目的。如果它是一个用于可视化工程模型的工具,你可能最感兴趣的是虚拟现实的能力,让用户轻松操作模型,而他们是否真的相信自己身处另一个地方可能并不重要。另一方面,如果你正在创建一个沉浸式的游戏或电影体验,这些选择将至关重要。你需要弄清楚对于你的特定应用来说,哪些规则最重要。
身临其境
沉浸在虚拟现实中的目标是创造用户身临其境的体验。身临其境,正如我们之前所定义的,是一种身处某个地方的感觉,这在很大程度上是一种身体上感知到的现象。很多时候,用户会对世界中的事物,比如高度或飞向他们的物体,做出身体上的反应。身体在很大程度上相信在虚拟现实中所感知到的,并做出相应的反应。如果你主要从生理学角度来考虑身临其境,你会更容易理解用户的体验。这种体验会让用户感受到什么?
理解沉浸感的关键是要理解,虚拟现实并不是通过试图准确模拟环境来工作,而是通过触发和欺骗我们用来感知世界的一系列系统。这就是为什么如果我们正确地移动世界并保持延迟低,我们可以在纹理上获得低细节,而我们的感知系统对运动比对细节更敏感的原因之一。虚拟现实不需要欺骗所有感官,只需要以正确的方式欺骗正确的感官。
模拟器晕动病
在虚拟现实中,你将经常遇到的一个重要因素是模拟器晕动病。这是一种常见于虚拟现实中的由视觉引起的晕动病,你将经常处理这种情况。
作为人类,我们大部分时间都是直立行走,这需要极其复杂的协调才能实现,然而我们却可以毫不费力地做到。我们通过内耳中的一个结构,称为前庭系统,来协调运动和保持平衡。这个系统非常敏感,它与我们的视觉和我们对身体的感知(本体感觉)一起工作,以理解我们的运动方式。
你会听到虚拟现实开发者经常谈论前庭系统或内耳。对于我们来说,由于前庭系统位于内耳中,我们在使用这些术语时指的是同一件事。这是告诉我们是否在移动以及如何保持平衡的三个系统之一。另外两个是我们的视觉系统和我们的本体感觉(我们对身体位置的自然感知)。当这三个系统的信号不一致时,问题就会出现。
当视觉信息告诉身体它在移动,但内耳无法感受到这种运动时,就会产生问题。(研究人员称之为感觉冲突理论。)晕船和晕车也是出于同样的原因。当来自内耳前庭系统的视觉运动线索和运动线索不匹配时,身体可能会触发恶心、出汗和其他反应。(研究人员尚未就此达成一致意见,但有一种理论认为,当感觉不匹配时,身体可能会认为自己中毒了。)
虚拟现实的挑战在于它非常成功地模拟了运动。用户的大脑自然地接受他们看到的运动是真实发生的,并在内耳的信号无法证实这一点时出现问题。开发者需要意识到这个挑战并处理它。我们将在下一节讨论如何做到这一点。(请注意,相反的情况也是如此——如果用户转头,始终在头戴设备中显示运动。)
模拟器晕动病,有时缩写为晕动病,是一种可能在虚拟现实中发生的晕动病。(有时也会缩写为VIMS,代表视觉引起的晕动病。)模拟器晕动病最常见的原因是设计不良的运动方式。第二个最常见的原因是延迟高。用户在世界中移动的方式,以及世界对他们的运动如何平稳和一致地响应,是解决模拟器晕动病的关键因素。
安全
另一个重要的考虑因素是安全。由于虚拟现实完全压倒用户的感官,有可能使用户陷入不安全的情况中,作为开发者,你需要尽量避免这种情况发生。例如,如果你倾斜地平线,很有可能你的用户会失去平衡。如果你设计了一个需要大幅度身体动作的体验,比如挥动剑或棒球棒,要注意用户无法看到周围环境,很容易撞到现实世界中的物体。同时,还要注意可能导致眼部疲劳的因素,比如强迫用户专注于离摄像头太近的用户界面元素,以及可能由闪光灯引发的光敏性癫痫发作。
在考虑这些因素的基础上,让我们具体介绍一些最佳实践,以帮助保持用户的舒适和安全。
VR 最佳实践
现在我们已经谈了一些关于沉浸感和存在感的内容,让我们来看一些具体的实践方法,以保持用户的舒适并避免破坏沉浸感。不要认为这些都是铁板钉钉的(除了保持帧率和不要控制用户的头部之外)- VR 仍然是一种非常新的媒介,还有很多可以尝试和发现新的有效方法的空间。仅仅因为有人说某件事做不到并不意味着它真的做不到。话虽如此,以下建议通常代表了我们目前对 VR 中有效方法的最佳理解,遵循它们通常是个好主意。
保持帧率
你是否察觉到了一个模式?你必须维持帧率。高延迟会让用户完全脱离沉浸感,这是引发模拟器晕眩的主要原因之一。考虑一下在 VR 中渲染器需要做的工作,你会发现这是一个相当大的挑战。HTC Vive Pro 显示 2,880 x 1,600 的图像(每眼 1,400 x 1,600),而原版 Vive 和 Oculus Rift 显示 2,160 x 1,200 的图像(每眼 1,080 x 1,200),它们都要求每秒发生 90 次这样的渲染,给渲染器留下 11 毫秒的时间来准备每一帧。Oculus Go 每秒显示 2,560 x 1,440 像素(每眼 1,280 x 1,440),意味着渲染器大约有 13 毫秒的时间来呈现每一帧。虚幻引擎的渲染速度非常快,但即便如此,这仍然是一个很大的渲染量,而且时间非常有限。你需要做出一些妥协来达到你的目标。我们将在本书中讨论如何做到这一点。
以下是目前市场上的头戴设备及其渲染需求的列表。
有线头戴设备
HMD 设备 | 分辨率 | 目标帧率 |
---|---|---|
Oculus Rift | 2,160 x 1,200 (每眼 1,080 x 1,200) | 90 FPS (11 毫秒) |
HTC Vive | 2,160 x 1,200 (每眼 1,080 x 1,200) | 90 FPS (11 毫秒) |
HTC Vive Pro | 2,880 x 1,600 (每眼 1,400 x 1,600) | 90 FPS (11 毫秒) |
Windows Mixed Reality | 不同的设备有所不同,大多数显示 2,880 x 1,440 (每眼 1,440 x 1,440) | 90 FPS (11 毫秒) |
独立式头戴设备
HMD 设备 | 分辨率 | 目标帧率 |
---|---|---|
Gear VR | 根据使用的手机而有所不同。 | 60 FPS (16 毫秒) |
Oculus Go | 2,560 x 1,440 (每眼 1,280 x 1,440) | 72 FPS (13 毫秒) |
Oculus Quest | 3,200 x 1,440 (每眼 1,600 x 1,440) | 72 FPS (13 毫秒) |
还要记住,你应该以稍高于这些目标的帧率为目标,这样即使出现卡顿也不会造成严重的不适。
如果帧率下降,新的帧无法在头戴设备需要显示时进行渲染,VR 硬件会做一些工作来减少感知延迟,但这是通过一些技巧来实现的。在这些情况下,硬件会重新渲染上一帧并调整它以适应用户当前的头部运动,所以用户看到的不是完全正确的帧,而是比完全丢帧要好一些。(Oculus 称此过程为异步时间扭曲(ATW),在 Vive 上称为异步重投影。)不过,不要将时间扭曲或重投影作为救命稻草,它们的作用是在应用程序出现卡顿时让用户感到舒适,但对用户来说仍然是一种降级的体验。不要让你的应用程序长时间错过目标帧率。
还要确保在你打算支持的最低规格硬件上测试你的应用程序,并为用户提供调整渲染需求的方法,以便他们能够在他们所使用的硬件上达到帧率目标。
绝对不能控制用户的头部
除了丢帧之外,模拟器晕动病的另一个最常见原因是我们之前提到的感官冲突——视觉上感知到的运动与内耳感受到的运动不匹配。在 VR 中,你需要适应两种主要类型的运动:
-
玩家角色的移动(四处走动、传送或驾驶车辆)
-
玩家头部相对于他们的角色的移动
玩家角色的移动由你为体验实现的运动系统来处理。在这里你真的没有选择——你将不得不创建在现实生活中不存在的移动,但有一些事情你可以做,以减少这个问题,我们很快会讨论它们。
单词“avatar”起源于梵语,指的是神在人类形式中的具体化。在当前的用法中,它将这个隐喻扩展到指代一个虚拟世界中由人类玩家控制的角色。它的伴随术语“agent”指的是由 AI 程序控制的角色。
然而,你不应该干涉玩家头部的移动。
在实践中,这意味着:永远不要以用户自己的行为之外的方式移动摄像机。如果你正在制作一个游戏,用户的角色死亡时,不要让摄像机固定在头部上,而身体却掉落下来。如果你这样做,几乎肯定会让用户感到不适。相反,考虑切换到第三人称视角或以其他方式处理动作。永远不要移动摄像机来强迫用户在电影中四处观看,也不要应用“行走晃动”或摄像机抖动。用户应该始终控制他们的头部。
永远不要将摄像机与用户的头部分开移动,也永远不要在用户的头部移动时不移动摄像机。你应该始终保持头部移动与相对于用户角色的摄像机移动之间的 1:1 关系。
这个原则适用于双向。如果玩家移动头部,摄像机必须移动,即使游戏暂停或加载。永远不要停止跟踪。
如果你需要将用户传送到一个新的位置或出于任何原因改变摄像机,考虑使用快速的黑色或白色淡入淡出来覆盖过渡。人们在快速转动头部时本能地眨眼,模仿这种行为是一个好主意。
在游戏中的剧情场景在 VR 中需要与传统平面屏幕上的处理方式不同,原因也是相同的。通常,在制作剧情场景时,你会控制摄像机,移动和切换不同的镜头,但在 VR 中你无法做到这一点。你无法控制用户会看向哪里,而且你需要小心地移动他们。这给你留下了几个选择。首先,如果你的场景是预渲染的,那么你真的没有选择,只能将它们映射到虚拟环境中的屏幕上。这会破坏沉浸感,但对用户来说并不比在现实生活中观看电影更困难。如果你在引擎中进行剧情场景制作,你需要考虑如何处理玩家的视角。
对于第一人称视角,最好的方式是将电影场景设置在用户周围,并允许他们自由地观看和移动。在这种情况下,你不能切换到另一个镜头,也不能保证用户在关键时刻看向你想要他们看的地方,但这是最沉浸式的方法。
剧情场景也可以以第三人称的方式处理,即将用户的视角从他们的身体中拉出来,让他们观看场景的展开,但你需要小心处理——超脱体验可能会让玩家感到迷失方向,削弱沉浸感和玩家对角色的认同。
在虚拟现实中制作电影时,非常小的移动可能会引起恶心。用户更容易容忍前进的运动,而不是左右或旋转的运动,如果运动是由可见的车辆或其他解释方式来解释的,用户似乎更容易容忍运动。
在虚拟现实中考虑如何使用相机不仅仅是为了管理用户的不适感。这是一个新的领域,你从电影和游戏中学到的规则在这里不同。你设计的是重现用户的眼睛,而不是相机,这对你的构图有深远的影响。用户如何移动?他们知道你希望他们看什么吗?当他们看自己的手时会看到什么?镜子呢?将用户置于一个世界中(而不是让他们通过窗户观看)会如何改变他们与之的关系?在开发工作时,所有这些因素都需要有意识地进行选择。
不要在相机上加速或减速。
根据你正在创建的应用程序的类型,你可能需要为用户提供一种改变位置的方式,无论是通过传送还是平滑移动。(我们将在后面的章节中深入探讨这个问题。)然而,如果你选择实现平滑的移动方法,请不要在玩家开始和停止移动时加速或减速。以最高速度开始移动,或者如果你选择平滑你的开始和停止,保持它们非常短暂。(当然,永远不要做一个控制用户相机的开始移动或停止移动的动画。)
不要覆盖视野,操纵景深或使用动态模糊。
我们刚才提到,虚拟现实模拟的是用户的眼睛,而不是相机。因此,在模拟中不要做眼睛在现实生活中不会做的事情。不要改变相机镜头的焦距或景深。眼睛的焦距不会像电影变焦镜头那样改变,如果你改变这个,很可能会让用户感到恶心。
在当前一代虚拟现实中,操纵景深不是一个好主意,因为我们还没有一种可靠的方法来知道用户实际上在视野中看什么。在未来,随着眼动追踪的改进,这可能会发生变化,但目前不要为用户做出这个选择。
运动模糊不应该应用于相机或场景中的物体。这是电影在固定时间内拍摄静止画面时产生的一种伪像,模糊了该画面内的运动,但这不是眼睛的工作方式,在虚拟现实中看起来不自然。
顺便说一下,避免使用其他模拟相机效果,如镜头光晕和胶片颗粒。同样,这些效果模仿的是电影的行为,而不是眼睛,我们不是在虚拟现实中模仿电影。这些胶片效果也可能导致用户产生不良的身体反应,如果效果在眼睛之间不一致,还会导致模拟器晕动症,并且会消耗宝贵的帧时间来渲染。不要使用它们。
最小化视觉错觉。
你是否曾经坐在静止的汽车窗前,看着一辆大货车或公共汽车移动,感觉自己实际上是朝相反方向移动的?这种现象被称为视觉错觉,它指的是由光流模式产生的自我运动的错觉。如果你的视野中有大部分区域在移动,这可能会在你的身体中产生运动感觉,正如我们之前讨论的,与内耳信号不匹配的运动感觉可能会引发模拟器晕动症。
视觉错觉是当你的视野中的大部分区域移动时产生的运动错觉。光流是指视野中内容的运动模式,正是这些运动模式引起了视觉错觉。
实际上,这意味着如果用户的视野中有大块移动,就有可能引发模拟器晕动症。我们已经讨论过关于移动用户头部的问题(不要这样做),并且我们已经提到了一些处理这个问题的方法,但你还需要注意其他可能引起视觉错觉的情况。
要注意填满画面大部分区域的移动模式-无论它们是否是你的运动系统的一部分,它们仍然可以产生运动错觉,这可能对用户造成问题。
一些游戏和应用程序尝试使用“隧道视觉”效果来减少在用户需要快速移动环境时的视觉错觉-当玩家的角色奔跑时,视野边缘会逐渐闭合,减少外围视觉。
用户似乎对前进运动比对侧向运动更容忍。这可能部分是因为在现实生活中,我们前进的次数远远超过侧向移动的次数,但也可能是因为用户在前进时所看到的光流仍然具有相对固定的中心点,而在侧向移动中,视野中的一切都在移动。
当你试图确定 VR 中的特定移动是否可能引起模拟器晕动时,思考该移动将产生的视觉流动类型可能会有所帮助。相对固定参考点的视觉流动,比如向前奔跑时的地平线,可能没问题,而移动视野中的一切,比如侧向移动,可能不行。
旋转玩家的视角尤其有问题。它会使视野中的几乎所有东西都移动,而前庭系统特别适应检测旋转。在这里要非常小心。平滑的旋转通常不是一个好主意,但开发者发现将用户快速转向一个新的角度可以重新定位用户而不会让他们晕动。事实证明,大脑非常擅长填补感知中的中断,因此在大幅度移动期间快速转向或“眨眼”视野可以非常有效地干扰运动感知而不会分散用户注意力。
许多开发者还发现,给用户一个可见的随着他们移动的交通工具,比如飞机座舱,可以减轻旋转时的视觉错觉。这是否适合你取决于你所创建的体验类型,但重点是用户似乎在视野中给予固定参考点时更不容易出现模拟器晕动症。在适当的情况下,考虑将其纳入设计中;在不适当的情况下,考虑其他方式来打破视觉流动,比如眨眼或快速移动。
避免使用楼梯
如果你允许用户在环境中平稳移动,要注意当用户在其中导航时,环境的某些特征可能引发模拟器晕动症。楼梯尤其糟糕。为每一步提供碰撞的楼梯会在用户导航时使视野弹跳,更糟糕。这些在穿越时会产生垂直运动感的环境特征可能很困难,因为内耳对高度变化非常敏感。
如果可以的话,尽量避免使用楼梯。如果无法避免,要注意楼梯的陡峭程度以及用户在其上移动的速度。你需要进行一些测试来找到合适的方法。
使用比通常更暗淡的灯光和颜色
在场景中使用明亮的灯光和强烈的对比要小心。明亮的灯光会导致一些用户出现模拟器晕动症,而强烈的对比会增加用户在世界移动时的运动感。此外,使用当前硬件,明亮的灯光通常会在头盔的菲涅耳透镜上产生光晕,这会提醒用户他们正在佩戴硬件,从而破坏沉浸感。一般来说,建议您使用比平常更冷的色调和更暗的灯光。
保持世界的尺度准确
VR以一种平面屏幕无法做到的方式传达了世界中物体的尺度。我们每个人通过一对距离固定的眼睛以立体视觉看世界。这个距离被称为瞳孔间距(IPD),它影响了我们对世界中物体大小的感知。大多数 VR 头盔可以调整到与用户的瞳孔间距相匹配,并且应该正确调整以减少眼部疲劳。
用户眼睛瞳孔之间的距离被称为瞳孔间距,它是用户对世界中物体大小感知的主要因素。
作为开发者,这意味着您的世界中物体的尺度很重要。在平面屏幕上,用户只能通过将一个物体的大小与另一个物体进行比较来确定其大小,但在 VR 中,用户的瞳孔间距决定了绝对的尺度感。在平面屏幕上,一个物体如果独自出现,无论它是太大还是太小,看起来都是正常的。但是在 VR 中,即使没有其他物体可以进行比较,同样的物体在立体 3D 中看起来会让观众感到不对劲。
如果世界的尺度感觉不对,一些用户可能容易出现模拟器晕动症,即使那些没有出现这种情况的用户也可能会觉得世界感觉“不对”,而不一定知道原因。
确保您的世界中的物体尺度正确。在虚幻引擎中,默认情况下,一个虚幻单位(UU)等于一厘米。
注意身体动作
在 VR 中,您的用户在现实世界中四处移动,戴着电动眼罩。尊重这一点,并小心在 VR 中要求他们做什么。当要求用户挥动手臂、奔跑或横移时要小心,因为他们很容易在现实世界中撞到障碍物或墙壁。对于带有电缆的头盔,不要要求用户反复向同一方向转动并缠住电缆。还要注意要求用户够到地板上或超出他们正常够到范围之外的物体-这在他们的真实物理环境中可能并不容易或可能。正如前面提到的,避免以可能导致用户失去平衡的方式改变地平线。记住,当用户在 VR 中时,他们对世界的几乎所有信息都来自于 VR 模拟-要意识到这些信息如何与周围的无形物理世界相吻合或相矛盾。
管理眼部疲劳
眼睛使用肌肉来对焦物体和定位眼睛,这些肌肉和其他肌肉一样会疲劳。我们称之为眼部疲劳。眼部疲劳的症状包括头痛、疲劳、模糊或重影。作为设计师,您可以采取一些措施来减少用户的眼部疲劳,了解一些导致眼部疲劳的原因将有助于您做到这一点。
首先,眼部疲劳可能是由闪烁引起的。我们已经谈论了保持低延迟的重要性-这是保持低延迟优先级的另一个原因。不要创造故意闪烁的内容,因为这可能导致眼部疲劳,还可能引发光敏性癫痫发作。
高延迟引起的闪烁会导致眼部疲劳。保持低延迟。
其次,眼睛需要在 3D 空间中对物体进行一些物理工作。它们必须调整其透镜的形状以对物体进行聚焦(这称为调节),并且它们需要将自己对准,使其视线在物体上汇聚(这称为汇聚)。我们自然地有一种将这两个动作相互关联的反射,因此眼睛自然地希望汇聚到与其透镜聚焦的深度平面相匹配的深度,并且透镜自然地希望以与眼睛汇聚的深度相匹配的方式进行聚焦。问题出现在虚拟现实中,眼睛实际上看到的图像是固定距离的,但这些图像的内容存在于各种虚拟深度平面上,因此眼睛仍然必须旋转,使其汇聚在它们正在观察的物体上。这会产生冲突,因为透镜正在适应的焦距与眼睛汇聚的深度不匹配,这可能导致眼部疲劳。
在虚拟现实中,眼部疲劳可能由两个因素引起:闪烁,可以通过保持低延迟来管理,以及眼睛的透镜需要聚焦以看到头戴式显示屏的固定距离,以及它们需要汇聚以看到立体深度中的物体的距离的变化之间的冲突。这通常被称为汇聚-调节冲突,您可以通过将重要物体放在虚拟世界中约 1 米远的位置来管理,以使汇聚和调节的需求基本上保持一致。
在设计世界时,您可以通过牢记这两个要求来管理这个问题。HMD 上的菲涅耳透镜使头戴式显示屏看起来离眼睛约 1 米远,使透镜能够适应约 1 米远的焦平面。然后,用户的眼睛自然会更容易集中注意力于虚拟世界中看起来大约在那个距离的物体上。实际上,物体在 0.75 米到 3.5 米的范围内最容易被观察到,其中 1 米似乎是理想的距离。避免让用户长时间盯着离眼睛不到半米的物体。
将您知道用户将长时间注视的物体至少放在离相机半米远的地方,最好在 1 米左右,以减少眼部疲劳。
不要强迫用户成为一个眼球扭曲者来查看您的用户界面。通常将 GUI 附加到用户的脸上是一个坏主意-当他们转动头部查看 UI 元素时,它会“逃离”,因为它附着在试图查看它的同一个头部上,所以用户必须单独转动眼球来专注于它。不要这样对待他们。这对用户来说是令人恼火的、令人疲劳的,并且在现实世界中没有类似的情况。将您的用户界面放在世界中,以便用户可以从舒适的视角和舒适的距离专注于它。将用户界面元素附加到用户的身体上,例如手腕,可以很好地工作,因为它允许用户在想要与之交互时将其带入视野。将 GUI 元素放入驾驶舱或车辆中也可以很好地工作。当用户看向它们时,可以将用户界面元素放置在世界各地并显示出来。
如果您确实将其附加到用户的头部,请将 GUI 元素保持在我们讨论的理想范围内,并以允许无需努力阅读的角度放置。
尽量避免创建迫使用户频繁改变焦距的情况。例如,如果您正在制作一款射击游戏,将关键信息放在附近的用户界面元素上,而敌人则在远处,那么您可能正在创建一种迫使用户频繁改变焦点以检查用户界面并专注于战场上的敌人的情况。在平面游戏中,这不是问题,但在虚拟现实中,这会使他们感到疲劳。设计您的用户界面,使用户可以在不专注于它的情况下获取关键信息,例如易于阅读的图形元素,或者考虑将用户界面元素放在敌人头顶上。
GUI 元素可能会被世界中比 UI 元素更接近相机的物体遮挡。不要试图使用 2D 游戏空间的技巧来改变这一点。在 2D 游戏设计中,通常会在 3D 元素上绘制 UI 元素,即使该元素实际上会阻挡玩家对其的视野。然而,在 VR 中这样做会创建一个令人困惑的立体图像,看起来一点也不舒服。接受这样一个事实,即你的 UI 存在于世界中,遵循与其他物体相同的规则。
有意识地选择体验的内容和强度
当 VR 实现存在感时,会产生强烈的反应。这是一种亲密的体验,一种直观的体验,有时也是一种引起恐惧的体验。在制作体验时要意识到自己在做什么——你可以很容易地引发某些用户的战斗或逃跑反应。这可能正是你的意图,我们并不建议你回避你试图创造的任何东西。但要意识到你在这里玩强大的东西,并做出有意识的选择。与其平面屏幕的前辈相比,VR 更有可能引发恐惧症,因为用户沉浸在空间中,而不是被他们的外围视觉不断提醒他们所看到的不是真实的。要注意可能引发眩晕、幽闭恐惧症、黑暗恐惧症、蛇、蜘蛛或其他恐惧症的情况。还要记住,用户对其个人空间内的威胁会有更强烈的反应。
对于那些故意在 VR 中制造恐惧、制作恐怖体验或治疗创伤后应激障碍的体验的人来说,电影和 VR 之间存在着有意义的区别——用户始终存在于 VR 中,而在电影中并非如此。他们对个人空间有一种本能的感知,你可以利用这一点产生巨大的效果。电影也没有这个。在电影中,一个看起来很近的物体只是在屏幕上很大,但它离用户的距离仍然是屏幕实际距离。在 VR 中,这个空间是真实存在的。在 VR 中,“它就在你身后”真的意味着它就在你身后。
让玩家自行管理他们的会话持续时间
VR 对用户的身体、眼睛和思维提出了其他媒体所没有的要求。他们戴着头戴设备,通常是站立或移动的。设计你的体验,让他们可以随时退出或需要时稍后继续。让他们根据需要休息。
保持加载时间短
与平面屏幕上的游戏和应用程序不同,VR 中的用户在等待应用程序加载时无法做其他事情。优化以保持加载时间短。同时要记住,即使在加载过程中,你的应用程序也必须对用户的头部跟踪做出响应。
质疑我们刚才告诉你的一切
VR 作为一种媒介和艺术形式还处于初级阶段。现在假装我们知道它的规则将会变成什么样还为时过早。在电影的早期,演员总是被全景拍摄,因为当时的常识是观众不会为了看到“半个演员”而付费。同样,你也应该愿意质疑在 VR 设计中收到的指导和建议。这些代表了目前对似乎有效的最佳理解,但这并不意味着没有其他未经尝试的方法来做事情。对它们持开放态度。这也是为什么这些指南每个都附有关于它们存在的原因的信息——这样你就可以理解它们的来龙去脉,做出自己的选择并尝试自己的实验。你是 VR 的开拓者,是全新沟通方式的创造者的一部分。不要害怕探索。
规划你的 VR 项目
我们已经在抽象层面上讨论了很多关于虚拟现实的内容-我们可以用它做什么,以及我们目前对它的工作原理和在其中有效的方法的了解。从现在开始,这本书将变得非常实际和实践,并且我们希望,当我们通过这些项目并学习如何在虚幻引擎中构建虚拟现实体验时,我们刚刚讨论的原则能够留在您的脑海中并指导您的选择。
在我们开始动手之前,还有一个主题需要探讨,那就是如何将一个想法变成您实际可以制作的东西。
明确您想要做什么
在开发设计时,首先要做的是决定它的用途。这听起来很明显,但开发人员往往会直接开始项目的构建,而没有先退后一步,弄清楚他们真正想要做什么以及为谁做。结果往往是要么体验不集中,无法真正实现预期目标,因为各个部分没有共同支持一个共同目标,要么项目需要很长时间才能完成。这浪费了很多工作,因为开发人员发现需要更改的事物,并不得不放弃现有的工作来进行更改。在开始构建软件之前,花一些时间进行计划,可以节省很多努力,并增加项目成功的可能性。
设计中要记住的第一件事是,您建造的越多,更改就越困难和昂贵,因此尽量在过程的早期做出这些决策。您可以制作的最便宜的原型是在您自己的头脑中。第二便宜的是在纸上。一旦开始构建软件,从您需要使项目运行所需的最低限度开始-一个灰色盒子环境或简单的原型,并进行测试以查看它需要如何更改。您几乎可以保证会发现一些您没有预料到的事情,而这正是发现这些事情并进行必要更改的时候。一旦您经历了这个过程,发现了真正有效和无效的内容,并根据您所学到的内容调整了设计,现在您可以开始将昂贵的艺术和修饰品加入到工作中。太多的开发人员倒过来努力,试图一开始就制作出最终产品,他们会被困在本来可以更容易改变的决策中,如果他们首先做了这些准备工作。
在这个基础上,首先要考虑的是项目是为谁以及为什么而制作。这是一个游戏还是娱乐体验?您希望用户有什么感受?他们在玩游戏或参与体验时会做什么?同样的问题也适用于电影式虚拟现实-这个体验是关于什么的?您想要讲述什么故事?花一点时间写下来。
如果您正在制作一个学习体验,用户需要学到什么?最好的教学方法是什么?
如果您正在制作建筑或设计可视化应用程序,对最终用户来说什么最重要?建筑师或工程师可能希望能够查看墙壁和结构内部,以查看电气和管道设计,而房地产买家可能更关心空间中的光线质量。
弄清楚您的用户是谁,对他们来说什么最重要,并明确您想要创造什么以及对您来说什么最重要。这应该在纸上完成。模糊的设计元素很容易隐藏在您的心智模型中,只有在您开始将它们写下来时才会暴露出漏洞或意外的问题。
这适合虚拟现实吗?为什么?
一旦您明确了 VR 项目的设计意图,几乎下一件事就是考虑它在 VR 中的适应性。
从 VR 所能提供的功能角度来思考你的项目。它是否依赖于沉浸感和强烈的存在感来运作?它是利用 VR 模拟身体或为信息提供背景的能力吗?为什么你的项目在 VR 中比在平面屏幕上更好?你的用户可以做什么或体验到什么,而在传统媒体中无法实现?
同时也要考虑 VR 带来的挑战。正如我们在最佳实践中所提到的,VR 带来的挑战与传统媒体有很大不同。模拟器晕动症是一个主要问题 - 你的项目是否要求你以对用户来说不舒服的方式移动摄像机?它是否依赖于用户以在 VR 中可能困难或不可能的方式移动?你是否要求用户阅读大量可能在当前头戴式显示器上不可读的小字体?思考我们概述的最佳实践,并评估其中是否有任何挑战与你的设计相冲突。这并不一定意味着你的设计不能在 VR 中工作,但这意味着你需要进行一些额外的设计思考来解决这些挑战。
你选择将你的项目放入 VR 中应该是经过深思熟虑的。你应该能够描述为什么你的项目在 VR 中比在传统媒体中更好,并且你计划如何应对 VR 带来的挑战。这也应该以书面形式进行。你可能会发现一些之前没有意识到的机会,以及一些你需要克服的挑战。将它们写下来将帮助你理解你的项目的重要性和成功所需的步骤。
对于项目的工作来说,什么是重要的 - 什么是必须存在的?(MVP)
现在,你已经明确了你的项目面向的用户,你打算做什么,以及为什么在 VR 中进行这个项目是有意义的,你准备开始弄清楚构建它所需的真正步骤。以最小可行产品(MVP)的方式来弄清楚这一点是有帮助的。简单来说,MVP 是产品的一个版本,它只包含满足其意图所需的内容。例如,一个建筑可视化项目需要将观众放入正确比例的建筑物中,并给用户一些移动和从不同角度观看的方式。你作为设计师可以选择 MVP 的内容,但你应该清楚你所说的东西是你需要的还是你想要的。如果项目如果不能包含某个特定功能而就不值得做,那么它就是一个必需的功能,应该包含在你的 MVP 中。如果它可以提高体验,但用户仍然可以在没有它的情况下得到他们所需的,那么它不是 MVP 的一部分。
MVP 是指项目的一个版本,它只包含满足其目标所需的内容,几乎没有其他内容。明确你的 MVP 可以帮助你理解你的项目的核心是什么,告诉你应该优先考虑什么,并为你评估你的项目是否成功地实现了它的目标提供一个基准。
不同类型的项目的 MVP 内容会有很大的不同 - 电影式 VR 体验的需求与工程可视化应用的需求大不相同,但作为设计师,你应该知道它们是什么,并将它们写下来。你不需要在这里写一本书或一篇文章 - 一个项目要点的列表应该足够了,但对于列表上的每一项,问问自己,如果没有它,项目是否仍然能够实现它的目标,并明确你的答案。想要,即使是强烈的想要,也不是需求。这里的重点是知道你的底线在哪里。
同时也要留意你可能错过的事情。想象一下你的用户在使用你的项目时,从一刻到另一刻,从他们启动应用程序的那一刻到关闭它的那一刻,他们想要做什么?利用这个练习来发现你可能错过的项目,并确定它们是想要还是需要的,并将它们加入到清单中。
拆解它
如果你已经完成了前面的练习,你应该清楚你的项目是为了什么,为什么它在 VR 中有效,以及为了使其有效而需要什么。现在你可以开始思考如何实现它了。
对于你的 MVP 中的项目,你需要什么来使它们存在?你需要一个 UI 元素来向用户显示信息吗?你需要一种让用户移动的方式吗?用户需要能够加载或保存信息,或者连接到服务器吗?
对于清单中的每一项,弄清楚那项实际上需要你构建什么,并将其写下来。通过这个练习,你应该能够清楚地拆解出你需要做的事情。
拆解是一个列出你需要做或构建的事情的清单,以便完成你的项目。将其作为一个工具,以确保你没有错过必需的元素,或低估了风险,并查看你尝试构建的项目是否在你拥有的时间和资源内实际可行。这是一个早期发现问题的工具,当你还有机会修复它们时,然后在构建过程中跟踪你的进展。
浏览一下这个清单——哪些是重要的任务,哪些是重大风险?你能够在你拥有的时间和资源内完成所有这些吗?如果范围开始看起来太大,你需要重新评估吗?请记住,做好少数事情通常比试图做所有事情并且做得不好要好得多。在这个阶段,发现项目范围超出你实际能够做好的范围是很常见的,这是一件好事。现在发现这一点的时机是最好的,因为它还只是纸上的计划,你可以重新组织工作,将项目从 MVP 中移除,或者改变你的进度或资源。如果你在开始阶段发现这些问题,你有机会解决它们,而如果你在软件开发进行了几个月后才发现这些问题,你可能会发现自己陷入了困境。在你还有灵活性的时候,通过纸上的计划为自己的成功做好准备。
按正确的顺序解决问题
拆解清单中的一些项目会比其他项目更容易完成,也会更有趣。当你确定应该按照什么顺序做事情时,要根据自己的判断。一般来说,先解决风险较高的事情是个好主意。如果某个事情足够重要,存在着可能会延期或根本无法完成的风险,通常最好是尽早解决它。这样做可以让你有时间在处理其他事情的同时迭代一个风险项目,或者在最坏的情况下,如果你发现一个你依赖的事情无法完成,你仍然处于项目的早期阶段,你可能能够退回到另一个计划。不要把高风险、高优先级的事情留到最后,如果出现问题,你会陷入困境。
寻找项目之间的依赖关系。如果某件事在另一件事之前无法完成——例如,一个角色在构建和装配之前无法进行动画,那么确保这些依赖关系纳入你的计划中。计划按照一定的顺序进行事情是没有好处的,如果发现某个事情所依赖的东西还没有准备好,你就无法按照计划进行。
在计划如何完成你的分解时,寻找涉及风险或不确定性的事项,需要很长时间的事项以及依赖于其他事项的事项。将这些因素纳入你的计划中。一般来说,如果可能的话,尽早在项目中处理重要性高、风险高的工作,这样如果出现问题,你就有时间处理。
关于项目管理的一点说明——关于规划和跟踪项目的文献很多,深入讨论超出了本书的范围。广义上来说,这些可以分为两个主要的思维流派:瀑布式和敏捷式。瀑布式项目管理方法按照一定的顺序列出任务,假设一项任务完成后,下一项任务就可以开始。这在做事情明确定义且风险不大的情况下效果很好,比如粉刷房子,但 VR 设计和开发很少能按照这种方式进行。你可能根本不知道一个功能是否完成,直到你看到它与其他系统一起运行,然后你可能需要回头改变或完全重做一些东西。敏捷方法,比如 Scrum,考虑到了这一现实,并适用于设计和开发项目,因为在项目发展过程中会需要重新审视并获得新的信息。总的来说,敏捷方法在软件开发方面比瀑布计划更有效。
根据项目的范围,你可能不需要应用正式的项目管理方法,但即使你的计划不太具体,仍然应该有一个计划,并确保计划适应你需要回头迭代功能和设计的现实,有些事项会依赖于其他事项,有些事情会比你想象的时间更长。
尽早、经常进行测试。
尽早测试你的设计。尤其是 VR 是一种非常新的媒介,人们对它的反应各不相同。尽早测试,尽可能多地测试不同类型的受试者,这样你就可以在相对容易更改的时候发现需要改变的事物。
还要记住,VR 开发者不适合作为测试对象。我们比其他用户更频繁地使用 VR,并且对 VR 界面更加熟悉,对模拟器晕动症的抵抗力也更强。与对这种媒介不熟悉的用户以及对这种媒介感到舒适的用户一起进行 VR 测试。
尽可能多地测试不同类型的人群。VR 以前的媒介无法像 VR 那样将用户融入其中,这对你的用户很重要。对你来说看起来很好的手可能对手型不同的用户来说感觉很陌生。确保你的测试人群不仅限于和你相似的人。
尽早在流程中寻找测试机会。即使在达到 MVP 之前,也要测试可能需要设计迭代的元素,比如运动系统。将用户置于一个灰盒环境中,并让他们在其中导航,观察他们的行为和困惑的地方。你做的测试越多,你的项目就会越好,而且你越早测试,就越容易根据你所学到的知识采取行动。
设计是迭代的。
很多人认为成品是由天才设计师或开发者的头脑中完整形成的。事实并非如此。任何值得制作的东西都需要经过迭代才能完成。
现在要为你的设计的第一次迭代做好准备,它不会完全符合你的期望,这就是重点。任何事物的第一稿的目的是展示你正在构建的事物中真正重要的内容以及它们如何相互配合。要为此做好计划。设计是一个过程,时间和迭代是这个过程的关键元素。
这就是为什么我们强烈建议首先在纸上进行设计,并尽早在软件中测试原型。每次您给自己一个有形的东西来回应,您都会发现一些关于它的东西,并可能发现一种改进的方法。
总结
在本章中,我们探讨了 VR 是什么以及它在现实世界中的一些应用方式。我们对沉浸感和存在感进行了相当多的讨论。让我们在这里简要回顾一下。
我们说过,存在感是一种生理上的感觉,即存在于某个地方,这实际上是 VR 的目的。我们创造 VR 是为了创造存在感。沉浸感是实现存在感的手段,它涉及完全占据用户的感官,以至于他们开始相信周围的虚拟世界。
我们讨论了一些当前被广泛认可的创建优质 VR 的最佳实践。其中最重要的是尽可能降低延迟,并且需要非常小心地处理用户视角的移动。模拟器晕动病主要是由于视觉感知的运动与内耳感觉的缺乏之间的冲突。为了让用户在体验中感到舒适,我们需要分解运动并了解最容易引发模拟器晕动的运动类型。我们还谈到了安全性,需要注意您要求用户执行的运动类型,避免眼部疲劳,并小心触发光敏性癫痫。
最后,我们概述了一个规划 VR 项目并在设计上进行迭代的过程,以使项目达到您的预期并确保其成功。
在下一章中,我们将深入研究并开始使用虚幻引擎,从此以后,本书的其余部分将是实践操作。我们希望本章中概述的思想能够伴随您的发展,并帮助您成功,不仅仅是制作运行的 VR 应用程序,而是制作出优秀的应用程序。
现在,让我们开始工作吧。
第二章:设置开发环境
本章的目标是让您准备好在虚幻引擎中进行开发。即使您已经安装并开始在引擎中工作,您可能仍然会发现浏览本章是有价值的,因为安装过程中有一些细节可能对您有用。
我们还将研究 Epic Games 启动器。习惯上,我们只将其视为更新引擎和启动项目的方式,但那里还有大量有用的学习和开发资源。忽视它将是一个错误。
对于计划在 Oculus Go 或三星 Gear 上开发移动 VR 的人,我们将为您介绍设置 Android SDK 和设置项目以部署到设备的过程,对于那些对 C++开发感兴趣的人,我们将向您展示如何设置 Visual Studio 2017 以与虚幻引擎一起使用,对于那些对最前沿技术感兴趣的人,我们将向您展示如何下载虚幻引擎源代码并自行构建。
在本章的过程中,我们将学习以下主题:
-
使用 Epic Games 启动器安装虚幻引擎
-
设置开发环境以构建移动 VR 项目
-
了解更多关于虚幻引擎的信息,以及获取帮助的途径
-
设置开发环境以构建 C++项目
-
从源代码下载和构建虚幻引擎
先决条件-VR 硬件
如果您计划开发桌面 VR 硬件,例如 Oculus Rift 或 HTC Vive,我们假设您已经设置好了头显并确保其正常工作。如果还没有,请现在进行设置。前往www.vive.com/eu/setup/
或www.oculus.com/setup/
,并按照指导进行安装和设置操作。
请记住,使用头显时,您的 VR 头显驱动程序软件(Oculus Home 或 Steam VR)需要运行。
如果您计划开发独立的移动 VR 应用程序,您的设置过程将涉及一些其他步骤,我们将在安装虚幻引擎后为您介绍。我们建议即使对于那些开发移动 VR 的人,您也应该准备一个桌面 VR 头显。能够直接将软件启动到头显中,而无需每次都进行烹饪和部署,可以大大加快调试速度。这不是必需的,但您会发现它很有帮助。
无论如何,测试一下您的头显,确保它正常工作,然后让我们准备好开发环境。
设置虚幻引擎
如果您要使用虚幻引擎开发 VR 应用程序,首先需要的当然是引擎。让我们一起来设置它。
费用
在考虑虚幻引擎时,一个自然的问题是费用。好消息是,虚幻引擎可以免费下载和使用,如果您在商业上使用它,条款也是合理的。
当您下载引擎时,将要求您同意两个许可协议之一,具体取决于您将用它做什么。如果您是游戏开发者,并使用虚幻引擎制作游戏或应用程序并出售,您将按照每个日历季度超过 3,000 美元的总销售额支付 5%的版税。如果您不出售游戏或应用程序,或者每个季度的收入低于该金额,可以免费使用虚幻引擎。
如果您使用 Unreal 进行的工作不打算向公众销售(培训模拟、建筑可视化或其他任何内容),根据企业许可协议的条款,Unreal 完全免费。对于大多数企业来说,标准的企业最终用户许可协议(EULA)就足够了,但如果您确实需要进行更改,您可以联系 Epic 在此处设置具有不同条款的企业许可证:www.unrealengine.com/en-US/enterprise/contact-us
。 Epic 将与您合作。
目前的情况是,您可以免费下载 Unreal 并使用它,如果您开始用它赚钱,条款是合理和清晰的。
顺便提一下,值得一提的是,当您下载引擎时,您获得的 Unreal 版本与专业开发人员使用的版本相同,包括 Epic 的开发人员。没有“专业”版本和其他版本之间的分割:一切都包含在内,一切都开启。
创建 Epic Games 帐户
那么,让我们开始吧。我们将首先前往www.unrealengine.com
并点击下载链接。如果您已经在 Epic 创建了一个帐户,请在此处登录。如果没有,请现在创建一个。
注册或登录后,您将被要求同意您需要同意的许可证-游戏开发者许可证或企业许可证。选择适合您情况的许可证。接下来,选择您要下载的 Windows 或 Mac 版本,下载适当的 Epic 安装程序并运行它。
这将安装 Epic Games 启动器,您将使用它作为管理引擎版本、插件、库内容和学习资源的中心。这里有一些有用的东西。
Epic Games 启动器
下载并安装启动器后,打开它。它会要求您使用刚刚用于登录 Epic 网站的相同帐户进行登录。(启动器也可以离线使用,所以即使没有互联网连接,您仍然可以运行引擎,但是如果您在线上,当然会有更多有用的东西可供您使用。)
登录后,查看启动器左侧边缘的选项卡集。有一个用于 Unreal Engine 的选项卡,然后是一系列用于 Epic 商店、游戏库和好友的选项卡。选择 UNREAL ENGINE 选项卡。我们将在这里花费所有的时间:
Epic Games 启动器的版本为 4.22;其布局经常变化,但原则保持不变。
在 Unreal Engine 选项卡的顶部,您会找到四个额外的选项卡:
-
虚幻引擎
-
学习
-
市场
-
库
我们将在一会儿查看这些选项卡,但首先,请找到它们右侧的 Install Engine 按钮。默认情况下,此按钮会安装引擎的最新稳定版本。让我们这样做。
安装引擎
当您点击安装按钮时,如果尚未选择 Library 选项卡,启动器将切换到 Library 选项卡,并要求您选择安装位置。默认位置通常是一个不错的选择,但如果您想在其他位置安装引擎,可以浏览到新位置。
此页面还有一个选项按钮,我们应该花点时间讨论一下它提供的选择:
安装选项允许您确定在您的计算机上设置哪些 Unreal Engine 组件。
-
核心组件必须安装-这是运行编辑器所需的最低要求。
-
入门内容包括一些有用的资产,供您开始使用,包括一些材料和模型以及高级照明贴图。我们将在本书的项目中使用这些资产,所以您应该安装它。
-
模板和功能包为你提供了一系列优秀的项目,可以作为你的游戏项目的起点,包括 VR 模板,在本书中我们将在几个项目中使用它。你也应该安装这个。
-
引擎源码是使虚幻引擎与其他引擎不同的一点:虚幻引擎为引擎提供了完整的 C++源代码。这是学习 C++的好方法,当你真正需要了解某个功能的工作原理或者需要弄清楚为什么某个功能的行为出乎意料时,它可以帮你解救。你不需要安装引擎源码,是否安装取决于你自己,但它不会占用很多空间,所以没有理由不安装。如果你预计要进行任何 C++开发,你应该安装它。一旦安装完成,你会在安装引擎版本的目录下的
\Engine\Source
文件夹中找到源代码。 -
调试时需要编辑器符号,如果你计划在 C++中进行调试。如果没有它,你将无法在引擎源代码中设置断点或跟踪执行过程。不过,这些编辑器符号占用了很多空间,所以如果你不打算使用 Visual Studio 进行 C++开发或调试,你可以跳过它,如果你意识到需要它,随时可以安装它。
这些选项在安装引擎版本后可以更改,所以如果你改变主意是否要安装某个选项,这不是个问题。你可以随时添加或删除任何选项。此外,如果你保留了旧版本的引擎,开发人员通常会这样做,如果他们在维护一个遗留项目,使用选项卸载除了核心组件以外的所有内容可以节省空间。
对于本书中的项目,默认选项是可以的——核心组件、起始内容、模板和引擎源码。如果你预计要进行 C++开发或调试,请安装编辑器符号。
在设置完选项后,点击应用并安装引擎。这需要一些时间。(如果你想在等待期间跳到了解虚幻部分,你可以在安装完成后回到这里。)
编辑 Vault 缓存位置
根据你的系统设置,你可能想要更改虚幻存储 Vault 缓存的位置。Vault 缓存存储了你从市场下载的资产,如项目和资产包。默认情况下,它位于C:\Program Files (x86)\Epic Games\Launcher\VaultCache
。你应该知道它可能会变得非常大,所以如果你的系统驱动器空间不足,你可能想把它放在其他地方。
如果你想这样做,从 Epic Games 启动器中,选择设置|编辑 Vault 缓存位置,选择一个新位置,然后点击应用。然后,退出设置并退出 Epic Games 启动器(在系统托盘中找到其图标,右键单击它,选择退出——仅仅关闭启动器窗口会将其最小化而不是退出)。当你重新启动启动器时,它将在新位置创建缓存。记得删除旧位置的VaultCache
目录。(虽然你可以将缓存复制到新位置,但通常最好强制系统创建一个新的缓存,因为这样可以消除你可能不再使用的很多残留文件。)
设置派生数据缓存(DDC)
还有一个额外的设置我们建议你做。当你使用编辑器时,虚幻会将资产编译成适用于本地机器硬件的形式。与其每次都强制引擎这样做,不如给它一个地方来存放这些已编译的资产,这样在第一次构建之后,所有东西加载得更快。
你不一定要这样做,但这是个好主意。特别是材质,如果你这样做,编译速度会快得多。如果你看到以下消息,你肯定要设置一个 DDC:
如果您看到此警告,请确保按照此处的指示设置您的 DDC。这将产生很大的影响。
虚幻称此功能为共享数据缓存(SDC)或派生数据缓存(DDC)。(这是一个与刚才提到的保险库缓存不同的缓存。)DDC 中的所有内容都是生成的,这意味着随时可以清除其内容。新数据将生成在其位置上。如果更改了您的显卡,最好清空您的 DDC,因为它将包含为旧卡编译的大量资源。
在设置 DDC 时,您有两个选项:如果您在工作室环境中工作,可以在网络可访问的位置设置一个共享 DDC。要做到这一点,请按照此处的说明操作:docs.unrealengine.com/en-us/Engine/Basics/DerivedDataCache
。
我们要讨论的是另一种选择:为独立开发设置本地 DDC。如果您所在的工作室已经设置了共享 DDC,您可以跳过本地设置。
设置本地 DDC
打开 Windows 控制面板 | 系统和安全 | 系统,然后点击高级系统设置链接:
您还可以通过在任何 Windows 资源管理器窗格上右键单击“此电脑”,然后选择“属性”来到这里。
在系统控制面板的左侧找到高级系统设置链接
在高级系统设置窗格中,点击环境变量按钮:
环境变量按钮位于系统属性 | 高级中。您需要管理员权限才能进行编辑。
在出现的编辑环境变量对话框中,点击新建以在用户变量或系统变量部分创建一个新的系统变量。(如果使用前者,DDC 将适用于您的登录,但不适用于其他登录到同一台机器的用户。如果将变量放在系统变量中,它将适用于所有用户。)
将 UE-SharedDataCachePath 输入为变量名,并为其值浏览到您想要存储派生数据的目录。如果您正在构建具有大量艺术内容的项目,您的 DDC 可能会占用超过 10 GB 的空间,因此请将其放在有足够空间的驱动器上:
创建一个名为 UE-SharedDataCachePath 的变量,并将其设置为您想要存储 DDC 的位置。
点击确定保存。在此生效之前,您需要重新启动计算机。
如果您的 DDC 开始积累许多您不再使用的项目的杂散资源,或者如果您更改了视频硬件,可以安全地清除其内容;编辑器将重新生成缓存。
启动引擎
引擎安装完成后,让我们启动它以验证一切是否正常工作。
在 Epic Games 启动器的左侧点击启动按钮,或在库选项卡的 ENGINE VERSIONS 中点击启动按钮:
库选项卡显示已安装的引擎版本、项目、插件和资产包。
如果您以前从未在计算机上启动过虚幻引擎,它可能会要求您允许安装一些先决条件。请允许。引擎还可能要求获得通过 Windows 防火墙进行通信的权限。也请允许。
如果一切正常运行,您应该会看到一个类似于这样的窗口:
未指定要加载的项目时,每次启动引擎时都会出现虚幻项目浏览器。
让我们创建一个空的蓝图项目,只是为了确保一切正常工作。(我们将在下一章中深入讨论创建项目的内容,但现在我们只是想测试一切。)
选择新项目选项卡。在蓝图选项卡下,选择空白,并将所有选项保持默认。选择一个合理的位置,然后点击创建项目。
编辑器应该打开您的新项目,您应该准备好了。
如果您正在为桌面 VR 开发(而不是移动设备),让我们进行一个快速测试以确保一切正常。如果您正在为移动 VR 开发,我们将在下一节中介绍。
在编辑器工具栏中,找到播放按钮右侧的下拉菜单。将其拉下并选择 VR 预览:
一旦您选择了播放模式,这将成为播放按钮的默认行为,直到您更改它。
如果 VR 预览被禁用,请检查您的头显是否正确连接,并且 Oculus 或 Steam VR 软件是否正在运行且没有显示任何警告或错误。
一旦您在 VR 中启动,您应该在头显中看到您的场景。它可能不是世界上最令人兴奋的场景,而且您会意外地漂浮在地板上方(我们将在下一章中学习如何正确设置 VR 场景),但您应该在其中。恭喜!一切正常!
为移动 VR 做准备
移动 VR 头显(如三星 Gear 和 Oculus Go)是与您的 PC 分开的设备,因此您不能像使用桌面头显那样简单地进入 VR 预览。相反,您需要打包项目并将其部署到设备上,以便直接在头显上运行。您需要设置一些东西才能实现这一点。
创建或加入 Oculus 开发者组织
首先,如果您要开发基于 Oculus 的移动 VR 平台,您需要在 Oculus 上注册为开发者。我们假设您已经创建了一个 Oculus 账户,因为您必须这样做才能使用头显。如果您还没有这样做,请先注册并登录。
现在,导航到dashboard.oculus.com/organizations/create/
并按照注册开发者的步骤进行操作。如果您加入的是现有组织而不是创建自己的组织,请联系管理员将您添加到注册开发者列表中。
在 Oculus Go 上将您的 VR 头显设置为开发者模式
一旦您注册为开发者,您将能够使用 Oculus 移动应用程序将您的头显设置为开发者模式。在将自己的项目部署到设备之前,您需要这样做。
在应用程序中,导航到设置 | [您的头显] | 更多设置 | 开发者模式,并打开开发者模式。
如果您无法执行此操作,请确认您的 Oculus 账户是否与开发者组织相关联。
安装 Android 调试桥(ADB)
三星 Gear 和 Oculus Go 都运行在谷歌的 Android 操作系统上。您需要安装驱动程序才能让您的 PC 与 Android 设备通信。为此,我们将安装 Android 调试桥(ADB)驱动程序。
导航到 ADB 2.0 下载页面,网址为developer.oculus.com/downloads/package/oculus-go-adb-drivers/
,下载并解压.zip
文件,然后右键单击android_winusb.inf
并选择安装。
有关 ADB 以及如何使用它与 Oculus Go 和三星 Gear 头显进行通信的更多信息,请参阅:developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-adb/#mobile-android-debug-intro
。
让安装完成,然后我们将安装 Android SDK。
设置 NVIDIA CodeWorks for Android
为了开发 Android 软件,您需要安装一些软件开发工具包(SDK)和其他资源,并将它们配置为相互配合。幸运的是,使用 NVIDIA 的CodeWorks for Android安装程序可以轻松完成此操作。
Epic 在您的引擎安装中包含了所需的安装程序。导航到您安装 Unreal Engine 的目录,找到Engine\Extras\AndroidWorks\Win64
。运行找到的 CodeWorksforAndroid 安装程序:
C:\Program Files\Epic Games\UE_4.21\Engine\Extras\AndroidWorks\Win64\CodeWorksforAndroid-1R6u1-windows.exe
接受默认选项,并在完成后重新启动计算机。
验证 HMD 是否能与您的 PC 通信
在计算机重新启动后返回,我们要检查您的 PC 是否能与 Android 头戴设备通信。
导航到刚刚安装 Android SDK 的位置。默认情况下,这将是C:\NVPACK\android-sdk-windows
。查找platform-tools
目录。
在此目录中,Shift +右键单击以打开包含Open PowerShell 窗口
命令的上下文菜单。如果您在不按住Shift的情况下右键单击,则上下文菜单不会包含 PowerShell。如果您使用的是较旧版本的 Windows 10,或者已禁用 PowerShell,则Shift +右键单击将打开一个命令行。
在 PowerShell 中,键入./adb devices
。
如果您使用的是 PowerShell,则必须在启动程序之前加上./
。 (在 Unix 系统上,要求在可执行调用之前加上./
是一项安全功能,以防止您意外启动可执行文件。Windows 现在也遵循此约定。)如果您使用的是传统命令提示符,则只需键入可执行文件的名称:adb devices
。最好养成使用 PowerShell 而不是传统命令提示符的习惯。它更安全,而且功能更强大。
看一下下面的屏幕截图:
adb devices 命令列出当前连接的 Android 设备。
如果 Go 或 Gear 显示为未经授权,这意味着您的 PC 能够看到它,但头戴设备尚未允许 PC 与其通信。戴上头戴设备并接受应该出现的确认对话框。再次运行adb devices
并确认头戴设备现在显示为设备。
为三星 Gear 生成签名文件
您无需创建签名文件即可部署到 Oculus Go 或 Quest。
对于三星 Gear 设备,您需要创建一个Oculus 签名文件(osig)。
按照dashboard.oculus.com/tools/osig-generator/
上的说明,将生成的文件放置在 Unreal 安装目录下的\Engine\Build\Android\Java\assets
目录下。如果 assets 目录尚不存在,请创建它。
有关签名文件的更多信息,请查看此处:developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-submission-sig-file/
。
将测试项目部署到设备
现在,我们已经安装了所有必需的软件并验证了我们的 PC 能够看到我们的 Android 头戴设备,让我们创建一个项目并将其部署到设备上,以确保一切正常工作。
设置一个测试项目
从 Epic 启动器中启动 Unreal Engine,在项目浏览器中选择新项目。选择蓝图选项卡,空白模板,并将项目设置为 Mobile/Tablet,可扩展的 3D 或 2D,无起始内容。选择项目的位置并创建它:
您在此处设置的选项将确定项目的起始设置,但您可以稍后更改它们。
检查您的 OculusVR 插件是否已启用
项目启动后,选择“设置”|“插件”|“虚拟现实”,并验证“OculusVR”插件是否已启用。(它应该已经启用了。)
设置默认地图
由于我们将在 Gear 或 Go 上作为独立可执行文件运行此项目,我们需要告诉它在启动时打开哪个地图。保存编辑器启动时创建的“空地图”,并给它任何你想要的名字。
选择“设置”|“项目设置”|“项目”|“地图和模式”,并将刚保存的地图设置为“编辑器启动地图”和“游戏默认地图”。
清除默认的移动触摸界面
通常,移动应用程序假设您将触摸屏幕来操作它们,但当然在您的头盔中不会发生这种情况,所以我们需要从项目中清除这个默认设置。
从“项目设置”中,选择“引擎”|“输入”|“移动”,并从“默认触摸界面”下拉菜单中选择“清除”,将其设置为“无”。
设置 Android SDK 项目设置
现在,我们需要为我们的 Android 头盔配置项目。
在“平台”|“Android”|“APK 打包”下,点击“立即配置”,并接受 SDK 许可证(您只需要接受一次许可证):
点击“立即配置”按钮将在项目的 Build/Android 目录下写入一个 project.properties 文件。
我们还需要在这个类别下设置一些设置:
-
最低 SDK 版本:21
-
目标 SDK 版本:21
-
在 KitKat 及以上设备上启用全屏沉浸模式:True
您会看到一些旧的文档告诉您将最低和目标 SDK 版本设置为 19。这对于三星 Gear 是正确的,但对于 Oculus Go,您必须选择版本 21。
向下滚动到“高级 APK 打包”部分,并设置以下内容:
- 将 AndroidManifest 配置为部署到 Oculus Mobile:True
旧的步骤将把这个设置称为“配置 Android 清单以部署到 Gear VR”。它的名称已经改变了。
设置 Android SDK 位置
现在,选择“平台”|“Android SDK”,并设置以下内容(根据您安装 SDK 的位置进行调整):
-
Android SDK 的位置:
C:/NVPACK/android-sdk-windows
-
Android NDK 的位置:
C:/NVPACK/android-ndk-r12b
-
ANT 的位置:
C:/NVPACK/apache-ant-1.8.2
-
JAVA 的位置:
C:/NVPACK/jdk1.8.0_77
-
SDK API 级别:
latest
-
NDK API 级别:
android-21
参考以下截图:
确保你在这里指定的目录是你驱动器上实际存在的位置。
请注意,当您更新 Android SDK(每次更新引擎版本时都必须记住这样做)时,这些目录名称将会改变。在更新后确保您为每个目录指定了正确的目录,否则您将遇到一些令人难以理解的错误。
启动测试项目
关闭项目设置,并找到“启动”按钮旁边的下拉菜单。打开它,您应该能够看到您移动 VR 头盔的序列号:
这里列出的设备将根据您的项目支持的平台和找到的设备而有所不同。
选择要启动的头戴设备。编辑器在准备好之前短时间内变得无响应是完全正常的。请耐心等待。一旦编辑器再次响应,您应该会看到类似以下的内容:
Android 资源处理进度指示器
选择“窗口”|“开发者工具”|“输出日志”不是一个坏主意,这样你就可以看到它在做什么,但这不是必需的。点击“显示输出日志”链接将会做同样的事情。
养成观察输出日志的习惯。很多开发者忽视了这一点,但你不应该。通过观察日志,你可以了解引擎正在做什么。
第一次运行时需要一些时间,因为需要编译很多着色器。后续运行将更快。
资产编译完成后,虚幻将把它们复制到您的设备上:
部署时间可能会因需要传输的数据量而有所不同。
部署完成后,场景应该在您的设备上运行:
一旦此对话框指示项目在设备上运行,您就可以准备测试它了。
戴上头盔,您应该能够进入场景。恭喜!您刚刚将项目部署到了移动 VR 头盔上!
使用 Epic Games 启动器
在我们继续之前,让我们先看一下 Epic Games 启动器-这里有很多有用的材料,这应该是您学习的起点。花些时间四处看看,看看有哪些资源可用。很容易忽视这些资源,但如果您习惯了了解在需要时可以学习和找到信息的地方,您将能更快地取得进展。
启动器的虚幻引擎选项卡分为四个主要部分:
-
虚幻引擎
-
学习
-
市场
-
库
让我们逐个查看它们。
虚幻引擎选项卡
虚幻引擎选项卡显示了特色内容和项目,这些内容在您使用引擎的时间越长,对您来说就越有意义。作为新用户,特别注意主横幅下面的一排图标。这些是宝贵的资源:
虚幻引擎选项卡截至虚幻 4.22 版本
-
新闻链接是了解最新情况的好方法;它主要关注新功能、事件和引擎的有趣用途。随着您在引擎中花费的时间越来越多,这个链接对您来说会变得更有意义。
-
YouTube 链接将带您进入虚幻引擎的 YouTube 频道。这是寻找深入教程、功能亮点和项目重点的最佳地方之一。特别是在功能亮点视频中,有很多信息是您在其他地方找不到的。
-
AnswerHub 是开发者提问和回答问题的重要资源。几乎任何时候您有问题,都应该首先在这里搜索答案。您很有可能会找到您要找的内容。在提问之前,不要害羞,但请尽量搜索现有的问题和答案,以免重复提问。同时,尽量回答您知道答案的问题,这就是社区的运作方式。
-
论坛是讨论与引擎相关的所有主题的地方,也是了解最新情况的好地方。大多数插件开发者也在论坛上与用户保持联系。这里有一个专门讨论 VR 和 AR 开发的论坛:
forums.unrealengine.com/development-discussion/vr-ar-development
。 -
路线图链接将带您进入一个 Trello 页面,描述即将发布的内容以及更远的未来计划。在您的虚幻开发生涯早期,这可能对您来说并不那么有意义,但随着您深入了解引擎,即将到来的变化将变得重要起来。
学习
这是启动器上最重要的资源之一。您不会后悔在这里花费的时间。
让我们首先看一下顶部栏:
学习选项卡截至虚幻 4.22 版本
-
文档链接将带您进入虚幻引擎的文档主页
docs.unrealengine.com/en-us
。文档页面上的“开始使用 UE4”链接是学习艺术、关卡设计和编程流程基础知识的好地方。如果您是虚幻引擎的新手,我们建议您先学习这些基础知识,以便熟悉编辑器。如果您已经掌握了这些基础知识,那么在构建本书中的项目时,您将会更好地完成,并且能够更好地利用它们。在掌握了基础知识之后,您可以将这个文档页面视为您在引擎中使用新工具或系统时的标准参考。 -
视频教程链接将带您进入
academy.unrealengine.com/
,这是一个在线学习网站,提供大量关于特定行业、角色、工作流程和概念的详细视频教程。这些课程非常有价值,是了解引擎不同部分如何相互配合以满足您需求的好方法。 -
社区维基页面比其他页面更少用。正如我们之前提到的,该页面上的内容不能保证是最新的,甚至是正确的。了解它的存在是值得的,但通常在论坛和文档中搜索信息比在维基上搜索更好,因为论坛上的错误信息通常会被其他用户迅速纠正,而在维基上则可能滋生。
内容示例项目
在这个栏下面,我们有一些特色链接,可以快速开始指南和博客文章,以及一些引擎功能示例。其中最重要的是内容示例项目。这里的所有项目都值得查看特定主题,但内容示例应该是您的常规参考。现在让我们安装它。
点击内容示例项目以打开其详细页面,并点击页面上的“创建项目”链接:
内容示例项目详细页面
系统会询问您想要将项目放在哪里,以及您想要使用哪个引擎版本来创建它。将其放在一个合理的位置(维护一个专门用于虚幻参考项目的目录是个不错的主意),并选择最新的引擎版本。点击“创建”来创建项目。项目创建后会自动启动,以后您可以从库选项卡的“我的项目”部分访问它。让我们允许项目启动,或者在创建后从库选项卡中特定地启动它:
启动项目时,请注意虚幻编辑器的版本号和加载进度。
项目第一次启动时,初始化可能需要一些时间。虚幻引擎正在为您的计算机构建资源。如果在 45%或 95%处卡住了几分钟,不要担心,它并没有崩溃。它正在构建动画、着色器和其他资源。后续启动将会快得多。
项目打开后,点击“文件”|“打开关卡”(或按下 Ctrl + O)打开其中一个演示地图。点击播放按钮,并使用标准的 WASD 键盘控制来移动和查看示例:
其中一个演示关卡包含在内容示例项目中
花些时间浏览这个项目,熟悉编辑器,并了解虚幻引擎的功能。以后,当您想在项目中添加某些内容时,习惯性地检查一下“内容示例”中是否有示例可以帮助您弄清楚如何完成。
说真的,这是您可以使用的最有用但经常被忽视的资源之一。在“内容示例”项目中有很多好东西。
游戏概念和示例游戏
在学习页面的底部,有一系列展示特定游戏玩法概念和示例游戏的项目。这些是学习更高级主题和了解虚幻引擎中完成项目的宝贵资源。这些项目的内容往往更加高级,因为它们大多代表了可发布的完成游戏。在下载并开始探索之前,您可能需要在引擎中花些时间。现在,您应该知道它们的存在。如果您感到好奇并且想要提前了解,可以随意浏览。
市场
在本书中,我们将使用市场中的免费资源,所以您应该花些时间查看这个选项卡:
截至 Unreal 4.20 的市场内容
Epic 在市场中提供了大量高质量的免费素材。通常,如果 Epic 取消了其内部开发的游戏,它会将游戏素材免费提供给市场。在构建学习项目时,要充分利用这些资源。无尽之剑的素材对于 VR 项目尤其有用,因为它们最初是为移动游戏设计的,所以对于 VR 的严格要求进行了合理的优化。在接下来的章节中,我们将看到如何将市场内容添加到现有项目中。同时,也不要忽视市场上的付费素材。其中很多素材都非常优秀,可以极大地帮助您构建项目,无论是用于原型还是发布的作品。
库
库选项卡是您维护已安装的引擎版本、打开项目以及访问从学习选项卡和市场下载的插件和内容包的地方:
截至 Unreal 4.20 的库面板
使用“ENGINE VERSIONS”部分来更新已安装的引擎版本、安装新的引擎版本以及修改其选项。
关于引擎版本的一点说明:如果您看到已安装的引擎版本上出现指示器,表示可以进行更新,那么您应该进行更新。引擎版本的更新,例如从 4.20.2 到 4.20.3,通常是安全的,因为它们涉及错误修复,不会以可能破坏项目的方式改变任何工作方式。
除了更新当前安装的引擎版本外,您还可以使用“ENGINE VERSIONS”标签旁边的“+”号来添加其他已安装的版本。这样可以安装旧版本,以便打开尚未更新到当前版本的旧内容,或者安装预览版本,以便测试即将发布的内容。
在使用预览版本时要小心。它们旨在让您提前了解,但不能保证稳定性。不要在预览版本上进行关键任务。请在发布版本上工作,并使用预览版本来查看即将到来的内容,或者了解在切换到新版本时可能需要更新项目的方式。
My Projects 部分允许你启动你的项目。项目缩略图上标有当前设置的引擎版本号。你可以通过启动新版本并将该项目打开到新版本中来更新项目的引擎版本。在这样做时,会弹出一个对话框询问你是否要复制项目或在原地转换。在原地转换是危险的;建议你在复制的副本上进行更新,以确保项目中没有任何冲突。(这就是为什么原地转换选项被隐藏在“更多选项…”链接下的原因。)如果你有一个非常旧的项目,落后几个版本,通常最好一次转换一个版本,而不是尝试跳过几个版本。这样做可能会成功,但结果完全取决于你尝试跳过的版本数量和项目中的内容:
转换项目对话框提供了几个选项,以确定你希望如何处理引擎更新。
你不必使用 Epic Games Launcher 来启动你的项目;你可以直接导航到保存项目的位置,双击.uproject
文件来启动与其关联的引擎版本。
Vault 部分包含了你拥有的所有内容,包括学习项目、插件和内容包。你可以在现有项目中添加插件或内容,也可以在这里创建新项目。
大多数情况下,库选项卡将是默认选项卡,因为你将使用它来启动项目,但正如我们刚才提到的,不要忘记其他选项卡。
为 C++开发进行设置
这部分是完全可选的。本书中的项目都不需要你使用 C++进行开发,但是我们偶尔会强调一些原生代码的内容,以供那些对深入了解感兴趣的人参考。如果你不打算进行编码工作,或者如果代码页让你感到非常困惑,完全可以跳过这一部分和接下来的部分。
在开发虚幻引擎时,绝对不需要使用 C++。蓝图可视化脚本语言非常强大,几乎可以实现任何功能。大多数应用程序,包括相当高级的项目,都可以完全使用蓝图构建。许多新手虚幻引擎用户看到 C++支持后会担心必须学习这门语言才能使用引擎。其实不需要。(如果你有兴趣学习 C++,这也是一个很好的方式。)
还在这里吗?太好了。如果你计划使用 C++进行开发,首先需要一个编辑器和编译器来构建你的代码。这种应用程序被称为集成开发环境(IDE)。在 Windows 上开发虚幻引擎 4.20 及更高版本时,应该使用微软的Visual Studio 2017(VS2017)。Visual Studio 有几个版本,但是对于虚幻引擎的开发,你不需要任何专业版或企业版的功能。免费的社区版已经包含了你所需要的一切。
安装 Microsoft Visual Studio Community
前往Microsoft Visual Studio Community页面,visualstudio.microsoft.com/vs/community/
,下载安装程序。运行安装程序时,你将看到几个选项:
Visual Studio Community 2017 设置对话框确定你的安装将配置为处理哪些语言和开发任务。
在工作负载选项卡下,选择使用 C++进行游戏开发,然后在右侧的摘要侧边栏上确保你已经选中了以下内容:
-
虚幻引擎安装程序(必需)
-
Windows 10 SDK(必需,应该已经默认选中)
-
Windows 8.1 SDK(在 VS 2017 上是必需的,应该已经默认选中)
-
C++性能分析工具(可选但有用)
如果您要为三星 Gear 或 Oculus Go 开发,请确保还包括以下内容:
- Unreal Engine 的 Android 支持(Gear 或 Go 开发所需)
这将安装 Java 开发工具包和您需要与 Gear 和 Go 通信的 Android 工具:
Visual Studio 2017 安装详细信息面板允许您确定已安装的选项。
通过设置这些选项,您已经告诉 Visual Studio 包括 C++语言支持,并包括运行和开发 Unreal 所需的支持文件。
这些设置很重要。Visual Studio 2017 不再自动假设您将进行 C++开发,因此在安装时需要选择要支持的语言。如果您后来意识到错过了某些内容,请使用添加和删除程序控制面板修改您的 VS2017 安装选项。
推荐设置
在开始工作之前,您可能需要在 Visual Studio 中进行一些更改。这些不是必需的,但可以使其与 Unreal 更好地配合。详细文档在此处:docs.unrealengine.com/en-us/Programming/Development/VisualStudioSetup
。请按照此页面进行操作并进行推荐的更改。
以下是页面要求您进行的更改的快速概述:
-
增加标准工具栏上的解决方案配置控件的宽度,因为 Unreal 解决方案配置名称可能太长而无法阅读。
-
确保在标准工具栏上显示解决方案平台控件。默认情况下应该已经显示。
-
确保在工具|选项|项目和解决方案|构建完成后始终显示错误列表已关闭。
-
设置工具|选项|文本编辑器|C/C++|视图|显示非活动块为 False。
-
确保在工具|选项|文本编辑器|C/C++|高级下,您的 Intellisense 选项未被禁用。旧的说明会告诉您禁用 Intellisense,因为它在处理 Unreal 的源代码时效果不佳。现在情况已经不同了,告诉您关闭它的说明已经过时。如果您过去关闭了 Intellisense,请现在重新打开它。
UnrealVS 插件
现在您已经安装了 Unreal Engine 并设置了 Visual Studio,我们将要安装 UnrealVS 插件到 Visual Studio,以简化您在使用 Unreal 时在 Visual Studio 中执行的一些常见任务。
安装 UnrealVS 插件
确保关闭 Visual Studio,并导航到您安装当前 Unreal Engine 版本的位置,在Engine\Extras
下找到UnrealVS
目录。打开与您的 Visual Studio 版本对应的目录(在我们的情况下是 VS2017),运行UnrealVS.vsix
安装程序来安装插件。
对于 Unreal 4.20,将其安装在标准位置。例如,您可以在这里找到插件:
C:\Program Files\Epic Games\UE_4.20\Engine\Extras\UnrealVS\VS2017
。
打开 UnrealVS 工具栏
完成插件安装后,打开 Visual Studio,并在工具栏的空白区域右键单击以设置活动工具栏。打开UnrealVS
工具栏:
在 Visual Studio 2017 中右键单击空白工具栏区域,可以选择可见的工具栏。
有关配置和使用 UnrealVS 的其他文档,请参阅此处:docs.unrealengine.com/en-us/Programming/Development/VisualStudioSetup/UnrealVS
。通过安装并打开工具栏,您已经完成了一切所需的操作,但是浏览一下此页面可以了解 UnrealVS 为您提供了什么以及如何使用它。
Unreal 调试支持
在我们准备好之前,还有一件事情要做,那就是在 Visual Studio 中为 Unreal 安装一个调试支持文件。
导航到您的引擎安装目录,找到Engine\Extras\VisualStudioDebugging
。在那里找到UE4.natvis
文件并复制它。
将其粘贴到以下两个位置之一。
您可以将其安装到 Visual Studio 的安装位置,即以下路径(您需要在计算机上具有管理员权限才能执行此操作):
-
[VisualStudioInstallPath]\Common7\Packages\Debugger\Visualizers\UE4.natvis
-
示例:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Packages\Debugger\Visualizers
或者,您可以将其安装到个人的“文档”目录中。如果您在用户配置文件的“文档”目录中检查,应该会找到一个在安装 IDE 时自动创建的 Visual Studio 2017 目录。如果该目录中已经存在一个 visualizers 子目录,请将UE4.natvis
粘贴到其中。如果没有,请创建该目录并将 natvis 文件放在其中。
-
[UserProfile]\Documents\Visual Studio 2017/Visualizers/UE4.natvis
-
示例:
D:\OneDrive\Documents\Visual Studio 2017\Visualizers
.natvis
文件包含了帮助 Visual Studio 显示特定解决方案中定义的本地数据类型内容的指令。Unreal 定义了自己的自定义字符串类型(FString
)、自定义数组类型(TArray
)和其他许多类型。UE4.natvis
告诉 Visual Studio 在调试时如何以可读的方式显示这些类型中包含的数据。
测试一切是否正常
现在,我们准备验证是否已正确设置所有内容。从 Epic Games 启动器中启动当前的引擎版本。在新项目选项卡下,选择 C++。
如果您看到以下警告,请确保您已安装 Visual Studio 2017,并且已选择使用 C++进行游戏开发,并选择了推荐的设置:
如果您看到这个警告,要么您还没有安装 Visual Studio,要么您还没有设置所需的安装选项。
如果您已经安装了 VS2017 并且看到警告,这意味着您缺少我们刚刚提到的所需选项之一。使用“添加或删除程序”控制面板修改您的 VS2017 安装,并添加这些选项。
如果您没有看到任何警告,那么您可以准备创建一个快速测试项目。让我们在 C++选项卡下选择一个基本代码模板,使用默认选项,并选择一个位置和名称:
创建 C++项目的方式与创建蓝图项目类似。
点击创建项目,并允许工具为您创建一个新项目。稍等片刻。如果您已经正确设置了所有内容,Unreal 编辑器应该会打开您新创建的项目,而 Visual Studio 2017 应该会打开新创建的项目解决方案文件。现在让我们关闭 Unreal 编辑器,然后从 VS2017 中构建和启动新项目,看看如何操作。
在 Visual Studio 的解决方案资源管理器选项卡中,找到游戏树下的新项目解决方案。右键单击它并选择设置为启动项目:
左侧的解决方案资源管理器显示了项目中包含的文件。右侧的工作区显示了当前加载文件的内容。
再次右键单击它,选择 UnrealVS Quick Build | Win64 | DebugGame Editor。您的项目应该开始构建。
在使用 C++开发虚幻时,您通常会使用两个解决方案配置:DebugGame Editor和Development Editor。Visual Studio 是所谓的优化编译器,这意味着它在编译代码时会对代码进行一些修改,以使其运行更快。这有一个优点,即您可以编写易于阅读的代码,而在编译后仍然可以快速运行,但实际上这意味着如果您调试开发构建,不是每个数据位都可见,因为某些变量已经被优化掉了。
调试构建会保留您编写的所有内容,因此运行速度会稍慢一些,但您可以看到每个变量包含的确切内容。大多数情况下,您将希望使用 Development Editor 配置。
您会发现,除了 DebugGame Editor 和 Development Editor 之外,还有 DebugGame 和 Development 配置可用。在编辑器中工作时,您不会使用这些配置;它们不包括编辑器,并且需要将您的内容烹饪成发布就绪的格式。(我们稍后会讨论烹饪。)
对于这个示例,我们选择了一个 DebugGame Editor 配置,这样您就有机会看到编译器构建了一个尚未构建的配置。
一旦您的项目构建完成,请检查输出。如果看起来像这样,您就可以开始了:
1>Deploying BasicCodeTestEditor Win64 DebugGame...
1>Total build time: 45.92 seconds (Parallel executor: 27.81 seconds)
1>Done building project "BasicCodeTest.vcxproj".
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
现在,在标准工具栏上,使用解决方案配置控件选择刚刚构建的调试编辑器配置:
解决方案配置控件确定要创建的构建类型。
按下F5,或选择调试 | 启动调试,从 Visual Studio 启动编辑器。如果一切设置正确,您的项目应该启动,并且您的 Visual Studio 窗口应该看起来像这样:
在 Visual Studio Community 2017 中加载的虚幻 C++项目。底部的橙色条表示项目正在运行,并且 Visual Studio 的调试器已连接到它。
恭喜!您现在已经设置好了使用 C++进行开发。
让我们来看一个快速示例,说明为什么这样非常有用。在您的虚幻编辑器中自动创建的默认场景中,从世界大纲中选择 Floor。右键单击它:
您可以直接从虚幻编辑器中打开 C++文件。
地板是一个静态网格演员。选择打开StaticMeshActor.h
的选项。您将自动切换到 Visual Studio,并打开StaticMeshActor
头文件:
如果您无法打开StaticMeshActor.h
,请检查是否为您的引擎版本安装了引擎源代码。转到库选项卡,在引擎版本下找到您正在运行的版本,并从启动按钮右侧的下拉菜单中选择选项。如果您还没有添加引擎源代码,请添加。
StaticMeshActor 类的 C++头文件描述了该类并声明了其函数。
这是虚幻引擎的许多令人惊奇的事情之一 - Epic 为您提供了源代码 - 所有的源代码。对于编辑器中的任何对象、任何蓝图节点,您都可以查看其下面的源代码。没有黑盒子。再次强调,这绝不是您在虚幻中必须做的事情 - 文档非常好,但如果您面临一个谜团并且真的需要弄清楚发生了什么,能够阅读源代码可能会拯救您的生命。
从源代码构建虚幻
您绝对不需要下载源代码并从头构建引擎,几乎您在实际使用中需要做的任何事情都不需要。这一部分包含在这里,以便您有自由进行引擎更改,如果您有需要的话,但您可以安全地跳过这一部分。即使对于专业开发人员来说,从最新的源代码中工作也是罕见的。
下一部分比前面的部分更加可选。只有在您打算修改引擎本身的行为,或者想要使用尚未捆绑到任何发布版本中的新功能时,才需要执行此操作。这也是这个引擎的另一个美妙之处——如果您确实需要它执行某些尚未执行的操作,您可以自行进行更改。此外,如果您进行了改进引擎或可能对其他开发人员有用的更改,您可以使用 GitHub 将您的更改贡献给 Epic。许多开发人员都这样做,其结果是这个引擎以惊人的速度增长和改进。
如果您不需要它,您可以跳过这一部分。我们将在这里深入一点。
设置 GitHub 帐户并安装 Git
Unreal 引擎的源代码是通过一个名为 GitHub 的网站进行分发的。Git 是一个版本控制系统(用于管理代码修订并将其分发给用户的系统),而 GitHub 是一个集中存放和共享 Git 存储库的地方。要下载允许您自行构建引擎的 Unreal Engine 源代码,您将需要 Git 和 GitHub。
很多人将 Git 和 GitHub 混淆。它们并不是同一回事。Git 是一个版本控制系统,允许用户跟踪代码的变化、分发这些变化并以许多其他方式进行管理。GitHub 是一个允许用户存储和共享 Git 数据的网站。还有其他网站也可以做到这一点,尽管 GitHub 是最大的,或者您可以完全自己设置一个 Git 存储库。
设置或登录您的 GitHub 帐户
如果您计划深入研究 Unreal 开发的最前沿,您首先需要一个 GitHub 帐户。前往github.com/
并登录,或者如果您还没有帐户,请注册一个。
安装 Windows 版 Git
前往git-scm.com/
,下载适用于 Windows 的 Git。Git 是一个软件配置管理工具,允许您将本地的 Unreal 源代码仓库与 Epic 提供的源代码同步。
使用默认选项进行安装,只有一个例外:当安装程序询问您希望将什么作为 Git 的默认编辑器时,当前选择的选项将是 Vim。对于那些已经习惯使用 Vim 的人来说,Vim 非常好用,但对于其他人来说,它可能非常反直觉,因为它遵循与您使用过的几乎任何其他应用程序完全不同的一套约定。如果您还不是那些使用和喜欢 Vim 的人之一,您几乎肯定会想选择另一个文本编辑器:
在设置 Git 时,您可以选择首选的文本编辑器作为 Git 的默认编辑器。
无论如何,拥有一个强大的文本编辑器对于您的系统来说都是一个好主意,因为它可以用于编辑配置文件和大量其他任务。常见的选择有 Visual Studio Code、Sublime Text、Notepad++或 Atom。如果您有喜欢的,请随意使用。如果没有,Visual Studio Code 是一个不错的选择,因为它是免费的,并且遵循与 Visual Studio 相同的约定。如果需要,可以在这里获取:code.visualstudio.com/
。
安装 Git 大文件存储
接下来,您需要安装 Git 大文件存储(Git-LFS)。这允许 Git 管理 Unreal 生成的大型二进制文件等文件。
前往git-lfs.github.com/
,下载 Git-LFS 并安装它。
现在,您需要配置 Git 以使用 Git-LFS。为此,请执行以下操作:
- 打开 Git Bash——一个用于管理 Git 的命令行工具,它在您刚刚安装 Git for Windows 时已经安装了。在 Git Bash 中,输入
git lfs install
并按 Enter 键:
Git Bash 是一个专门用于与 Git 通信的终端窗口。
一旦看到 Git LFS 已初始化,你可以关闭 Git Bash。
安装 Git GUI
并不是必须使用 GUI 来操作 Git。许多开发者直接从命令行操作 Git。某些 Git 操作通过这种方式更容易执行。如果你想使用 GUI,以下说明适用。
前往desktop.github.com/
下载GitHub Desktop。还有许多其他的 Git GUI 应用程序;另一个流行的选择是Atlassian’s SourceTree,你可以在www.sourcetreeapp.com/
找到它,但为了简单起见,我们现在将继续使用 GitHub Desktop。在安装过程中,安装程序会要求你输入刚刚创建的 GitHub 账户的凭据。在这里输入它们。
安装完成后,GitHub Desktop 应该会启动,并且你应该看到一个类似于这样的窗口:
像 GitHub Desktop 这样的 Git GUI 并不是与 Git 通信所必需的,但在刚开始时可能会有所帮助。
将你的 GitHub 账户连接到你的 Epic Games 账户
导航到www.unrealengine.com
,如果你还没有登录,请现在登录。在页面的左下角找到你的用户名,将鼠标悬停在上面以显示下拉菜单。选择“管理账户”选项:
Unreal 4.22 版本的账户管理链接。这将在浏览器窗口中打开www.unrealengine.com/account/personal
。
请注意,Epic Games 启动器中的菜单经常变化。你也可以通过导航到www.unrealengine.com/account/personal
来完成此步骤。打开“Connected Accounts”选项卡,找到 GitHub 图标,点击“Connect”将你的 Epic 账户连接到 GitHub。如果需要,同意用户许可协议,并在需要时登录 GitHub。最后,如果授权工具询问,请点击“Authorize Epic Games”按钮。你应该会收到一封确认邮件。如果需要进一步帮助或遇到问题,请查阅www.unrealengine.com/en-US/ue4-on-github
上的文档。
通过导航到github.com/EpicGames/UnrealEngine
来确认一切设置正确。如果你能看到页面,说明你已经正确连接。如果没有,请确保你已经正确连接了你的账户并被授权查看 UnrealEngine 存储库。
关于 Git 的一点说明:Git 是一个非常有用的工具,但它所做的工作一开始可能看起来相当复杂。详细介绍 Git 的所有知识超出了本书的范围,但我们强烈建议你花些时间了解 Git 是什么以及它的工作原理,如果你打算使用它的话。这是一个很好的起点:git-scm.com/book/en/v2/Getting-Started-Git-Basics
。要了解 GitHub 如何与 Git 配合工作,请从这里开始:guides.github.com/activities/hello-world/
。
下载 Unreal Engine 源代码
现在,你可以开始拉取源代码了。让我们看看如何操作。导航到github.com/EpicGames/UnrealEngine
,并浏览一下页面。这个页面上也有一个ReadMe
文件。强烈建议你阅读一下。
选择你的源分支
请注意,Epic 维护了多个 Unreal Engine 存储库的分支:
-
发布分支包含经过测试的源代码,与使用 Epic Games 启动器下载引擎得到的源代码相同。
-
推广分支包含经过较少测试的代码,由 Epic 的设计师和艺术家在内部使用。它相当稳定,并且将包含比发布分支上的更新但也不太稳定的代码。
-
主分支是绝对的最新版本,包含 Epic 工程师提交的几乎即时更改。但是,不能保证这些更改是稳定的,甚至可以编译。如果您计划为引擎做出贡献,您应该使用此分支:
Epic Games / UnrealEngine GitHub 存储库的此视图允许您选择当前分支并下载其内容。
暂时使用发布分支。在左上角附近的 Branch 下拉菜单中选择它。
分叉存储库
我们将对此存储库进行分叉。分叉 Git 存储库会创建一个副本,允许您在不影响主存储库的情况下进行自己的更改。点击右上方的 Fork 按钮。这将为您创建一个包含刚刚分叉的源代码的个人存储库。
将存储库克隆到本地计算机
现在,您需要将其放在桌面上。点击页面右侧的绿色 Clone or download 按钮:
在克隆存储库时,您可以选择身份验证方法以及希望如何交付内容。
您在这里有几个选项。
选项 1 - 使用 GitHub Desktop 进行克隆
如果您使用 GitHub Desktop 作为 GUI,请选择 Open in Desktop 并允许页面启动 GitHub Desktop。GitHub Desktop 将询问您要将新存储库存储在何处。告诉它放在哪里并点击 Clone:
确保您选择的本地路径位置有足够的空间来容纳引擎及其内容。
选项 2 - 使用命令行进行克隆
如果您使用命令行,请点击存储库 URL 右侧的 Copy to Clipboard 按钮,然后打开 Windows 命令提示符并导航到您想要存储本地存储库的目录。到达目录后,键入git clone
,然后粘贴刚刚复制的 URL:
git clone https://github.com/yourusername/UnrealEngine_YourFork.git
源代码现在将下载到您指定的位置。
下载引擎二进制内容
导航到刚刚下载虚幻引擎源代码的位置,并在那里查找Setup.bat
文件。运行它:
虚幻引擎内容与源代码分开提供。在引擎工作之前,您必须运行此.bat 文件。
此批处理文件现在将检查缺失或需要更新的引擎二进制内容,并进行更新。第一次运行可能需要一些时间。
生成项目文件
接下来,在相同目录中找到GenerateProjectFiles.bat
并运行它。这将为 Visual Studio 创建UE4.sln
解决方案文件和 Unreal Engine 的每个子项目所需的项目文件。这应该运行得相当快。
打开并构建解决方案
在 Visual Studio 中打开新生成的UE4.sln
文件。确保设置为开发编辑器解决方案配置,并在解决方案资源管理器中右键单击Engine/UE4
项目。选择 UnrealVS Quick Build | Win64 | Development Editor:
快速构建命令允许您选择要构建的构建配置。大多数情况下,您只对开发编辑器或调试编辑器配置感兴趣。
此构建将比之前运行的构建时间长得多,因为我们现在正在构建整个引擎,而不仅仅是一个游戏。
构建完成后,请确保将 UE4 设置为启动项目(默认情况下应该是),然后按F5以在调试器中启动它。
恭喜!您现在已经完全从源代码下载并构建了虚幻引擎。
使用新更改更新您的分叉
Epic 将很快发布尚未在您的分支中出现的新更改。具体时间取决于您所在的分支。如果您在发布分支上,新更改将每隔几周出现一次。在推广分支上,它们将每天或每两天出现一次。在主分支上,它们将每隔几分钟出现一次。在所有这些情况下,您都需要更新您的分支以获取新的更改。
您可以通过查看分支选择器下方的条来了解需要合并的新更改。它显示自上次更新分支以来发生了多少次提交:
这是一个古老分支的示例,远远落后于当前版本。我们可以看到它落后了 52000 多个更改。那很旧了。恐龙在这段代码最后更新时还在地球上漫游。我们需要修复它。
选项 - 使用命令行同步更改
保持分支与上游分支的同步是那些更容易通过命令行完成的操作之一。我们建议您以这种方式进行操作。让我们为您介绍这个过程。
设置上游存储库
我们已经从虚幻引擎源存储库中分叉了自己的存储库,并将其克隆到了本地机器上。现在,我们需要告诉我们的分支如何从原始项目(我们将其称为上游存储库)中拉取更改。您只需要执行一次此操作。在 GitHub 上,打开原始的虚幻引擎存储库页面:github.com/EpicGames/UnrealEngine
,点击绿色的 Clone or download 按钮,然后点击 URL 右侧的 Copy to Clipboard 按钮。不要在桌面上打开它或下载 ZIP 文件。您只需要 URL。
打开 Windows 命令提示符(请注意,如果您熟悉 UNIX 命令,也可以使用 Git Bash 进行此操作,并且如果您将大量使用 Git,建议您这样做),并导航到您克隆存储库的目录。键入git remote -v
并按Enter。您应该在此处看到您的源存储库,但没有上游存储库。这就是我们接下来要设置的内容:
添加上游存储库之前的 git remote -v 命令的结果
现在,键入git remote add upstream
并粘贴您刚才复制的 URL:
git remote add upstream https://github.com/EpicGames/UnrealEngine.git
让我们通过再次键入git remote -v
来验证上游存储库是否已正确设置:
添加上游存储库后的 git remote -v 命令的结果
一切看起来都很好 - 我们的上游存储库已经设置好了。
有关分叉存储库并准备从上游仓库拉取更改的更多信息,请查看 GitHub 的文档:help.github.com/articles/fork-a-repo/
。
同步分支
从命令提示符或 Git Bash 中的存储库目录中,键入git fetch upstream
:
git fetch upstream 操作的输出
现在,通过键入git checkout
和分支名称来checkout您正在工作的任何分支。例如,对于发布分支,键入git checkout release
,对于推广分支,键入git checkout promoted
,对于主分支,键入git checkout master
。
接下来,通过键入git merge upstream/
,然后是您的分支名称,将上游分支的更改合并到本地分支中。同样,如果您在发布分支上,这将是git merge upstream/release
。
最后,您需要将本地机器上的更改推送回您的分支存储库在线。键入git push origin master
来执行此操作。
回顾我们刚刚使用的 Git 命令
回顾一下:每当您需要将分支与上游分支保持同步时,请使用以下命令:
-
git fetch upstream
-
git checkout [branch]
-
git merge upstream/[branch]
-
git push origin [branch]
请参考以下截图:
Git Bash 中的命令输出。
选项-使用 Web GUI 同步更改
如果您更喜欢在线同步您的分支而不是使用命令行,请按照以下步骤操作。
如果您使用命令行程序来同步您的分支,您可以跳过此部分,因为它执行相同的工作。
导航到 GitHub 上您的分支页面,并点击栏右侧的比较按钮。如果您在本地进行了更改,它们将显示在随后的比较窗口中。(为简单起见,假设我们没有进行更改,只是尝试从 Epic 获取新代码。)为此,首先点击比较页面上的切换基础链接。这将反转比较,所以我们不再寻找尚未传递到 Epic 的本地分支上的更改,而是寻找其他开发人员进行的尚未出现在我们的分支上的更改:
GitHub 上尚未合并到您的分支的更改列表
在这里,我们可以看到新的更改可以自动合并。这是预期的,因为我们没有进行任何引擎更改。(管理您自己的虚幻引擎分支和 Epic 分支之间合并的更改超出了本书的范围。)在我们的情况下,我们只想保持最新状态。
创建一个拉取请求
点击创建拉取请求按钮:
从上游分支合并更改的新拉取请求
给您的拉取请求命名,并再次点击创建拉取请求来创建它。
您的拉取请求现在已准备好进行审查。在这种情况下,由于您发起了请求,您可以直接接受它:
拉取请求确认对话框
合并拉取请求
点击合并拉取请求来执行合并,然后点击确认合并来实现它。
合并完成后,返回到您的分支,您将不再落后:
我们的分支与上游分支之间的比较。我们可以看到我们现在是同步的。
将原始版本拉到本地机器
现在,您需要更新您机器上的本地副本。
返回 GitHub Desktop,在您的虚幻引擎仓库中,寻找 Fetch origin 按钮。点击此按钮,指示 GitHub Desktop 查找您尚未在本地复制的远程仓库中的更改:
在我们从仓库中获取新的更改之前的 GitHub Desktop
在我们的情况下,我们有一些:
GitHub Desktop 准备将更改拉到我们的本地机器
现在是将这 52,000 个更改下载到我们的本地机器的时候了。点击 Pull origin 来执行此操作。GitHub Desktop 将检出这些更改,并将它们复制到本地机器。完成后,我们应该看到点击 Fetch origin 不再导致任何新文件需要拉取-我们是最新的。
重新同步您的引擎内容并重新生成项目文件
无论您是使用命令行还是 GUI 来更新您的分支,现在都需要更新您的解决方案文件和项目文件以反映您下载的新源代码。
如果您确定没有添加或删除源文件或资源,您可以跳过此部分。如果有疑问,请运行这些操作以确保您的资源是最新的,并且 Visual Studio 知道有关已更改的文件。
关闭 Visual Studio,从引擎目录中重新运行Setup.bat
文件以更新二进制内容,然后重新运行GenerateProjectFiles.bat
以更新 Visual Studio 文件。这些操作将比第一次运行快得多,因为它们只更新了已更改的内容。
打开解决方案,构建并运行。您应该回到当前代码的状态。
很多时候,当您重新生成项目文件时,您的启动项目会发生变化。如果发生变化,请右键单击您想要启动的项目,然后选择“设置为启动项目”进行重置。
在 GitHub 上进一步使用源代码
关于修改和构建引擎源代码,我们还可以谈论很多,但这超出了本书的范围。不过,您在这里学到的知识将使您能够下载 Epic 最新的 Unreal Engine 代码并构建引擎,如果您需要比当前版本更新的代码,或者需要修改引擎。
如果您计划从 GitHub 使用 Unreal 源代码,那么花时间了解它是值得的。它是一个强大的工具,但如果您不清楚它在做什么,可能会让人困惑。这里提供帮助:help.github.com/
。
再次强调,大多数用户不需要这样做,但有时候支持新的 VR 设备的代码会在推广或主分支上出现,而在发布分支和通过启动器的二进制发布渠道上出现之前很长一段时间。现在您应该已经了解足够的知识,以便在需要时使用最新和最好的工具。
其他有用的工具
在我们离开本章之前,让我们花点时间谈谈您可能想要设置的其他与 Unreal 一起工作的工具。这些工具不是本书项目所必需的,但了解它们是值得的,这样您需要时就知道去哪里找。
一个好的强大的文本编辑器
当您需要编辑大型文本文件或替换文件中的大量文本时,记事本就不够用了。我们建议您为此目的设置一个专用的文本编辑器。以下是几个选择:
-
Visual Studio Code (
code.visualstudio.com/
) 是一个功能强大、轻量级的文本编辑器,支持多种语言,并包含许多有用的文本编辑工具。它是免费的。 -
Sublime Text (
www.sublimetext.com/
) 是一个高度可定制的编辑器,具有各种语言的自定义集成。它售价 80 美元,有免费试用版。 -
Atom (
atom.io/
) 是由 GitHub 开发的一个相对较新的编辑器,支持大量的附加包安装程序,可以对文本页面进行几乎任何操作。由于它是由 GitHub 开发的,它的 Git 集成非常好。而且它是免费的。 -
Notepad++ (
notepad-plus-plus.org/
) 是一个快速轻巧的编辑器,比大多数其他编辑器更老,因此有一批忠实的用户。它也是免费的。 -
Vim (
www.vim.org/download.php
) 是一个独立的编辑器。它的用户界面约定与 Windows 中的任何其他东西都不相似,因此需要一些努力来学习它们。它的优点是一旦用户学会了操作它的按键,他们就可以以惊人的速度在文本文档中导航,而无需使用鼠标。它几乎可以在任何计算设备上运行。我们只建议您在已经使用并喜欢它,或者特别有兴趣学习它的情况下使用它。
这些或其他您熟悉和喜爱的文本编辑器都可以很好地工作。选择一个适合您的并坚持使用它。
3D 建模软件
Unreal 场景由 3D 模型组成,您需要在开发过程中的各个阶段修改、清理或从头开始创建它们。(您需要做多少取决于您正在创建什么、与谁合作以及您在多大程度上依赖市场或其他来源的现有艺术品。)无论如何,最好在系统上安装一个可以编辑 3D 网格的工具。
在行业中,您通常会听到将 3D 建模工具称为数字内容创建工具,通常缩写为DCC。如果您听到有人提到 DCC,他们通常是在谈论 Blender、Maya 或 3ds Max 等 3D 建模工具。
以下是几个选择:
-
Blender(
www.blender.org/
)是一款免费且开源的 3D 建模程序,广泛用于独立开发社区。有很多教程可以教您如何在 Blender 中创建资产并将其导入虚幻引擎。它是免费的。 -
Autodesk Maya(
www.autodesk.com/products/maya/overview
)是一款专业工具,专注于创建媒体和娱乐内容。过去十年中,您在任何电影或游戏中看到的几乎所有生物都可能是在 Maya 中建模和动画制作的。Maya 的订阅费用约为每年 1500 美元,但学生可以免费使用三年。 -
Autodesk 3ds Max(
www.autodesk.com/products/3ds-max/overview
)是一款专业的建模工具,专注于创建建筑、工程和建筑(AEC)以及产品设计的内容。它在媒体和娱乐领域也常被使用,但其动画工具比 Maya 的工具要有限得多。3ds Max 的定价与 Maya 相同,约为每年 1500 美元,并提供免费的学生许可证。 -
Modo(
www.foundry.com/products/modo#
)是一个较新的专业市场参与者,并且正在获得追随者。值得一看。Modo 的订阅费用为每年 600 美元。
您选择的 DCC 将取决于您的预算和计划使用它做什么。一般来说,如果您正在为娱乐而制作虚拟现实,Maya 将包含更多您所需的内容,但这绝不是绝对的。对于建筑和产品设计,3ds Max 可能是您所需要的。对于独立游戏开发,您也可以考虑使用 Blender。进行一些研究,找出最适合您特定需求的工具。
您在专业领域中还会看到其他一些工具。您通常不会看到初学者使用它们,但它们是强大的工具,您应该知道它们的存在,以便考虑它们是否可能是您尝试做某事的好解决方案:
-
ZBrush(
pixologic.com/
)是一款数字雕刻工具,用于创建高度详细的模型和表面。 -
Mudbox(
www.autodesk.com/products/mudbox/overview
)与 ZBrush 类似,是一款用于为模型添加细节的雕刻工具。 -
Houdini(
www.sidefx.com/
)是一款用于 3D 几何和特效的程序化创建工具。如果您需要创建一个充满建筑物的城市、一个充满藤蔓的森林或一个翻滚的火球,Houdini 可能是您正在寻找的工具。 -
Substance Painter(
www.allegorithmic.com/products/substance-painter
)是一款纹理绘制工具,允许艺术家直接在 3D 模型上绘制纹理。 -
Substance Designer(
www.allegorithmic.com/products/substance-designer
)是一款功能强大的材质创作工具,用于创建高度多样和逼真的基于物理的材质。
这些通常是专家和专业人士使用的工具,但了解它们的存在和功能是值得的。
图像编辑软件
您通常还需要编辑纹理和 2D 艺术。您需要一个工具来完成这个任务,实际上您有两个可以认真考虑的选择:
-
Adobe Photoshop(
www.adobe.com/products/photoshop.html
)是 2D 图像编辑的标准。它值得购买。关于 Photoshop 的定价有一个秘密:如果你订阅它作为独立应用程序,每月费用为 20.99 美元,但如果你订阅摄影套餐,你只需支付每月 9.99 美元。 -
GIMP(
www.gimp.org/
)是一个免费的开源图像编辑应用程序。它缺少很多 Photoshop 的功能,但如果你只是偶尔修改纹理,它可能就足够了。
你在 Photoshop 和 GIMP 之间的选择将取决于你的需求和预算。如果你是专业工作者,最好还是坚持使用 Photoshop,但如果你不需要 Photoshop 的所有功能,GIMP 可能就足够了。
音频编辑软件
你偶尔需要编辑游戏和应用程序的声音和音乐。在这里,你也有几个选择:
-
Audacity(
www.audacityteam.org/
)是一个免费的开源音频编辑解决方案,质量出奇的好。对于大部分你需要做的音频编辑工作,Audacity 可能就足够了。 -
Adobe Audition(
www.adobe.com/products/audition.html
)是一款专业的音频编辑工具。它相比 Audacity 的优势在于更高质量的效果和非破坏性的编辑工作流程,这意味着如果你对声音应用了滤镜或效果,然后想在以后进行更改,你仍然可以做到。Audition 可以按月订阅,或者可以作为 Adobe All Apps 订阅的一部分捆绑购买。 -
Avid Pro Tools(
www.avid.com/pro-tools
)是专业人士中最常用的音频编辑软件,有一个免费的 Pro Tools | First 版本,包含所有专业版本的功能,但限制了你可以使用的输入和音轨数量。这是否适合你取决于你预计要进行多少音频编辑以及你计划做什么。
我们提到的所有选项都涵盖了声音编辑,但对于声音创作,有很多工具和音频库可供选择。对它们进行分类超出了本书的范围,因为声音设计是一门独立的艺术,充满了深度。对于大多数在虚幻引擎中开发 VR 应用程序的用户来说,从 Audacity 开始,并在需要做特定工作时再进行其他选择是个不错的主意。
总结
在本章中,我们安装了虚幻引擎,并了解了在设置它时可用的各种选项。我们创建并启动了一个简单的测试项目来验证一切是否正常工作。此外,对于那些为移动 VR 开发的人来说,我们学会了如何设置所需的驱动程序和软件开发工具包,并设置了一个移动测试项目,将其部署到我们的设备上。
在这个过程中,我们学会了如何使用 Epic Games 启动器,不仅可以保持引擎版本的更新和启动项目,还可以作为重要的学习和支持资源。通过探索启动器,我们学会了如何从社区选项卡获取问题的答案,以及在学习选项卡中找到文档和视频教程。我们探索了非常有用的内容示例项目,并查看了其他项目,可以用来探索引擎中的特定主题。我们看到市场提供了大量免费和付费内容,可以加速我们的项目,并学会了如何使用库选项卡来维护我们的项目和引擎版本。
对于那些计划使用 C++进行开发的人,我们学习了如何设置我们的 Visual Studio 2017 开发环境,并配置它与虚幻引擎一起工作,然后我们创建了一个简单的测试项目,以确保我们能够在虚幻引擎中构建和运行我们自己的 C++代码。对于那些更加冒险的人,我们学习了如何从 GitHub 下载虚幻引擎源代码,并完全从头构建引擎。
最后,我们简要介绍了一些其他工具,这些工具对于构建虚幻引擎内容的开发人员可能会有用,包括各种免费和付费的解决方案,以满足不同的需求。
在下一章中,我们将为 VR 构建我们的第一个项目。(在本章中,我们设置的快速而简单的项目只是为了测试我们的开发环境是否正确设置,而不是专门为 VR 设计的。)现在,我们将学习如何正确设置 VR 项目。让我们开始吧!
第三章:你好世界 - 你的第一个 VR 项目
是时候开始构建了!在第一章中,我们学习了什么是 VR 以及它能做什么,我们还学习了一些关于 VR 设计的最佳实践。然后,在第二章中,我们设置了开发环境。现在我们准备好开始构建了。
在本章中,我们将从头开始在虚幻中构建一个 VR 项目。然而,我们将采取与大多数教程不同的方法。我们不仅仅给你一系列要遵循的步骤,对于我们所做的每一件事,我们都会谈一谈在幕后发生了什么,以及为什么我们要以这种方式做。这才是真正重要的。如果你对这些系统的工作原理有一些了解,你在构建自己的项目时将更加有能力知道该做什么。
在构建我们的第一个 VR 项目时,我们将了解一些关于其结构的知识,并了解适用于 VR 开发的特定项目设置。我们还将查看那些特别影响移动 VR 的设置和选择,并向您展示在这方面需要了解的内容。从这里开始,我们将在项目中引入一个详细的场景,并学习如何在项目之间安全地移动资产以及如何管理项目的内容。最后,我们将设置游戏模式和角色蓝图,以便运行 VR 项目。
本章将涵盖以下内容:
-
从零开始创建一个 VR 项目
-
了解在开始项目时需要做出的重要设置和选择
-
为移动 VR 设置项目
-
在项目之间安全地移动内容和管理项目内的内容
-
在虚幻中设置你在 VR 开发中所需的基本蓝图
创建一个新项目
好的,让我们开始创建!
我们需要做的第一件事是创建一个新项目。在上一章中,我们创建了一些快速的临时项目,只是为了确保一切正常工作,但现在我们准备好开始真正的构建了。
如果你的Epic Games Launcher还没有打开,请打开它,转到“库”选项卡,在“引擎版本”下找到你最新的引擎版本,点击“启动”。(你也可以从启动器左侧的启动按钮进行操作。)
虚幻项目浏览器将出现。选择“新项目”选项卡,让我们选择“蓝图”选项卡和“空白”模板来创建一个空的蓝图项目。
模板是虚幻引擎项目的非常有用的起点。它们包含了许多游戏类型的简单和有用的工作基础,当你开始一个新项目时,你通常会想要使用它们。我们从一个空白项目开始,这样你就可以看到每个元素的添加过程。对于大多数项目,你可能最常用的是第一人称、第三人称和 VR 模板作为起点。
在这个对话框上我们还有一些选择要做,并且我们应该了解它们的含义:
设置硬件目标
硬件目标选择器提供了两个选项:
-
桌面/主机
-
移动/平板
通常情况下,你应该选择适合目标平台的正确选项,但是在开发 VR 时,即使你是为桌面开发,选择移动/平板选项也是一个好主意,因为该选项会关闭一些在 VR 中可能很昂贵的渲染选项。
具体而言,选择移动目标而不是桌面目标将关闭以下渲染选项:
-
分离半透明度
-
泛光
-
环境遮蔽
设置图形目标
你需要做出的下一个选择是你的图形目标。同样,在这里你有两个选择:
-
最高质量
-
可扩展的 3D 或 2D
选择最高质量将打开 Unreal Engine 提供的所有默认高端渲染选项。然而,如前所述,在 VR 中,达到目标帧率比在场景中包含细节更重要。对于 VR 开发,选择可扩展选项总是一个好主意。
最好的做法是从关闭所有内容开始,根据需要逐渐打开它们。如果你从一开始就打开了所有内容,很难弄清楚是什么导致了帧率下降,并找出需要关闭的内容。最好的做法是从项目以合理的速度运行开始,并保持快速运行,而不是构建一个运行效果差的项目,并希望以后能够更快地运行。
设置摘要
对于我们的项目,我们将选择以下内容:
-
项目模板:蓝图-空白
-
硬件目标:移动设备/平板电脑
-
图形目标:可扩展的 2D 或 3D
-
没有起始内容
我们现在可以将 Starter Content 关闭,因为我们可以在需要时轻松添加这些内容。
选择你想保存项目的位置,然后点击创建项目来设置它。
快速查看项目的结构
我们现在创建了一个空项目。让我们花点时间来看看这实际上意味着什么。
如果你在 Windows 资源管理器中导航到保存项目的位置,你会看到 Unreal 在那里创建了一个带有项目名称和.uproject
扩展名的文件,以及四个目录:
-
Config:配置文件,如
DefaultEngine.ini
和DefaultGame.ini
,存放在这里,保存了引擎和项目的设置。 -
Content:这是你的项目的资产所在的地方,如模型、纹理、材质和蓝图。这是你项目的主要部分。
-
Intermediate:当编译项目资产时创建的临时文件存放在这里。这里的所有内容都是临时的,如果你删除它,它们将被重新生成。
-
Saved:日志文件、截图和保存的游戏存档保存在这个目录中。
如果你生成了一个 C++项目,你会看到另外三个目录:
-
Binaries:项目的构建可执行文件和支持文件存放在这里。当你在 Visual Studio 中构建项目时,生成的可执行文件就保存在这里。
-
Build:与特定目标构建相关的文件,如 Windows 64 或 Android,存放在这里。这些包括在构建过程中生成的日志,以及某些支持资源,如应用程序图标。你很少会接触到这个目录的内容。
-
Source:C++文件和管理构建它们的 C#脚本存放在这里。
内容目录
在大多数情况下,当你使用 Unreal 项目时,你将使用Content
目录和Config
目录中的内容。通常情况下,你应该在 Unreal Editor 中管理 Content 目录的所有内容,因为否则很容易破坏对象之间的引用关系。我们将很快讨论如何做到这一点。
配置目录
然而,我们应该花点时间来看一下Config
目录。
在这个目录中,包含了包含项目设置的配置文件。所有与引擎相关的项目设置,如渲染质量选择,都写入到DefaultEngine.ini
文件中。当你在创建项目对话框中选择硬件和图形目标时,实际上只是选择将默认选项写入该文件。同样,当你从编辑器中更改项目设置时,这些设置也会写入DefaultEngine.ini
(或DefaultGame.ini
用于某些与游戏相关的设置)。
你的Config
目录将始终包含以下两个文件:
-
DefaultEngine.ini
:这个文件包含了你的渲染设置、启动地图设置、物理设置和其他控制引擎运行方式的选项。 -
DefaultGame.ini
:大部分包含有关游戏和版权信息的内容,但也包含了关于应用程序在不同平台上发布时如何打包的信息
当您在编辑器中更改项目设置时,您主要是将更改写入这两个文件。
根据您在构建项目时更改的设置,可能会创建其他Config
文件:
-
DefaultInput.ini
:这包含与使用输入设备相关的输入映射和设置。 -
DefaultEditor.ini
:这包含了控制编辑器行为的设置。 -
DefaultDeviceProfiles.ini
:这包含了您可能发布应用程序的不同平台的特定设置。
您不必了解这些内容就可以使用引擎。完全可以在编辑器内部管理设置,但这也是虚幻引擎的另一个伟大之处之一-它不会将重要信息散布在奇怪的地方。如果您在某个时刻需要弄清楚您在哪里设置了什么,您知道该去哪里找。它将在这些文件中的一个中。
如果在 Windows 资源管理器中看不到.ini
等文件扩展名,请打开文件资源管理器选项控制面板,并关闭隐藏已知文件类型的扩展名。在 Windows 中,默认情况下是打开的,但在开发时会隐藏有用的信息。
源目录
如果您创建了一个 C++项目,您的项目目录还将包含一个Source
子目录。您的 C++源文件存放在这里。
项目文件
我们还应该快速查看一下项目的.uproject
文件。实际上,它只是一个包含有关项目的一些信息的简单文本文件,但如果您在资源管理器中右键单击它,您将获得三个有用的选项:
-
启动游戏:这只是在虚幻编辑器中打开您的项目。双击
.uproject
文件也可以做到这一点。 -
生成 Visual Studio 项目文件:仅适用于创建了 C++项目的情况。通常情况下,只有在清除了保存 VS 项目文件的 Intermediates 目录,或者从编辑器外部添加了新的源代码文件时,才需要执行此操作。
-
切换虚幻引擎版本:这会更改与您的项目关联的引擎版本。通常情况下,当您要切换到新的引擎版本时,最安全和最可取的方法是在启动器中复制并更新您的项目,但如果您已经知道可以安全执行此操作,您可以在此处切换。
一个虚幻项目结构的概述
现在我们已经快速了解了虚幻项目的结构,我们应该在工作时将其牢记在心。
同样,一个虚幻项目的最基本结构包括以下内容:
-
Project
目录: -
Project
文件 -
Content
目录 -
Config
目录 -
(仅限 C++)
Source
目录
如果您需要与他人共享基于蓝图的虚幻项目,您只需要共享.uproject
文件、Content
目录和Config
目录。其余的内容都是在项目运行时动态生成的。
根据您对项目的操作,可能会自动创建其他目录。
这就是我们在这里想要做的一切-只是快速查看一下并了解一下我们开始向项目中添加大量内容之前的情况。知道东西在哪里可以在以后让您的生活更轻松。
设置项目的 VR 设置
让我们回到编辑器中,继续设置我们的项目。在做其他任何事情之前,我们应该查看一下一些设置。
我们即将讨论的所有这些设置都会影响场景的渲染方式:
渲染是将场景中的 3D 几何图形通过虚拟摄像机观察并将该几何图形转换为可以在屏幕或头戴式显示器上显示的图像的过程。
正如我们在第一章中提到的,在 VR 中思考,与传统的平面屏幕渲染相比,VR 对渲染管线提出了更高的要求。即使是当前市场上分辨率最低的头戴设备也显示了相当多的像素,并且需要非常快速地更新。如果这还不够具有挑战性,我们还需要考虑到两只眼睛,它们看到的视图并不完全相同。这意味着我们要渲染两个独立的视图。这是一项相当繁重的任务,而时间却不多。
因此,对于 VR 开发人员来说,了解 Unreal 提供的渲染选项是很重要的。在这里做出良好的选择可以让您在实现既好看又快速的目标方面走得更远。
Instanced Stereo
还记得我们刚才提到过需要同时渲染两个独立视图吗?在不好的旧日子里(在 Unreal 4.11 之前),这是真的。引擎只是简单地运行整个渲染过程两次 - 每次为一个眼睛。这是非常浪费的,因为两个视图之间唯一的真正区别是眼睛位置的微小偏移。第二次渲染的全部成本都被用来绘制几乎与刚刚绘制的相同的东西。
Instanced Stereo渲染通过允许在单个传递中渲染场景来改进这一点。然后,渲染的视图与视频硬件一起传递,以及每个眼睛调整视图所需的信息。它比运行整个传递两次要快得多,您需要确保打开它。现在让我们来做这个。
如果您使用 VR 模板创建项目,Instanced Stereo 将已经为您打开,但如果您从头开始创建项目,或者修改现有项目以适应 VR,您需要记住自己执行此操作。
从编辑器中打开项目设置,可以通过点击编辑器工具栏上的设置按钮并选择项目设置…,或者选择编辑 | 项目设置来打开:
在项目设置中,找到引擎部分的渲染项。在渲染页面中,找到 VR 部分的 Instanced Stereo 选项并打开它:
在执行此操作后,将要求您重新启动引擎。这将需要一些时间,因为您的着色器将需要重新编译。
轮询遮挡
因为我们没有太多时间将帧传输到头戴设备上,所以我们不想浪费任何时间来绘制我们不需要绘制的东西。引擎通过一个称为剔除的过程选择要绘制的对象。它使用四种主要方法来进行剔除,按顺序从最快和最简单到最复杂:
-
距离剔除只是忽略相机距离一定距离之外的任何对象。这是廉价的。
-
视锥剔除会忽略不在相机当前视图中的对象。这比距离剔除更昂贵,但仍然相对便宜。
-
预计算可见性允许设计师设置体积,明确告诉引擎从某些位置可以看到什么,不能看到什么。例如,如果您知道房间内的玩家不可能看到外面的任何东西,您可以使用预计算可见性体积告诉引擎甚至不需要检查。
-
动态遮挡实时测试场景中的一个角色是否遮挡了另一个角色。这相对昂贵,因此只对那些没有被更便宜的方法剔除的对象进行测试。
对于 VR 项目,虚幻引擎提供了一种名为Round Robin Occlusion的优化动态遮挡剔除方法,每帧只测试一个眼睛的遮挡,而不是两个眼睛。这在有很多对象的场景中节省了大量时间,并且由于每只眼睛的视图几乎相同,所以效果很好。系统在每帧切换测试的眼睛,这就是名称的由来。
让我们打开它:
- 在项目设置 | 引擎 | 渲染 | VR 中,勾选 Round Robin Occlusion Queries:
前向渲染和延迟渲染
现在我们需要对我们项目中要使用的渲染方法做出重要选择。
广义上讲,绘制场景有两种方式,它们之间的区别主要取决于场景中的物体如何受光照。这两种方法被称为前向渲染和延迟渲染。
你有时会看到这些称为前向渲染和延迟渲染,或者你会听到人们谈论前向渲染器或延迟渲染器。Epic 在其文档中可互换使用这些术语,但它们都指的是同样的东西。在这里,我们将坚持使用术语前向渲染,因为这是编辑器中的选项名称,并且最准确地描述了这两种方法之间的真正区别。
着色是将光应用于几何体的过程。这包括高光、表面反射、阴影和光线击中材质时产生的各种效果:
前面的截图显示了相同的网格,没有应用着色,然后应用了着色。在左侧的图像中,你可以看到物体的形状和基本颜色(通常称为反射率),但没有阴影、反射或高光。右侧的图像已经着色,所以可以看到高光、阴影和反射。
在接下来的描述中,我们稍微简化了一些事情,但对于我们的目的来说,这是可以的。你真的不需要了解渲染管线的每个细节,以便做出关于如何使用它的正确选择。只需要了解足够的信息,以便为你需要做的事情做出正确的选择即可。
前向渲染是实时 3D 渲染历史上绘制 3D 场景的最初方式。在前向渲染中,场景中的每个几何对象在渲染时进行着色,并检查场景中的每个光源对其的影响。如果场景中有很多对象和很多光源,这将导致大量的操作。这就是为什么大多数光照倾向于嵌入到静态光照贴图中,而动态光照在 20 世纪 90 年代和 21 世纪初的游戏中很少见的原因。每个动态光源都会大大增加场景的成本。
另一方面,延迟渲染绘制视图中的每个对象,但不是立即进行光照和着色,而是写出一系列包含场景中材质信息、每个像素的深度以及其他影响场景光照的因素的图像。只有在所有这些信息被组装完毕后,才进行着色。这就是名称的由来——着色通道被推迟到基础通道完成之后。
这些缓冲区的集合被称为几何缓冲区,或者G 缓冲区,构建它们的过程被称为基础通道。如果你在虚幻引擎中使用延迟渲染(这是新项目的默认设置),你可以通过选择视图模式 | 缓冲区可视化 | 概览来查看 G 缓冲区的内容。
看一下下面的截图:
由于光照通道只发生一次,所以对于有很多动态光的场景来说,这比使用延迟渲染要快得多,而且还可以高效地处理屏幕空间效果,如环境遮蔽。然而,对于部分透明的物体来说,它的效果不如前向渲染好。
选择适合你项目的渲染方法
所以,听起来很简单,对吧?延迟渲染似乎提供了很多优势。对于非 VR 渲染来说,这基本上是正确的,在 2000 年代后期,延迟渲染成为了包括虚幻引擎在内的几乎所有游戏引擎的默认选择。
然而,在 VR 中情况就不同了。延迟渲染的问题在于,由于它处理信息的方式,很难关闭渲染过程的各个方面。在很大程度上,它是全有或全无的。这在平面屏幕上通常不是问题——开发者几乎总是希望使用延迟渲染器所提供的一切。然而,其中一些过程在 VR 中运行效率太低,或者在屏幕空间计算时看起来不匹配。在 VR 中,你通常会希望有自由关闭它们的能力。
当你听到术语“屏幕空间”时,这意味着计算不是在 3D 空间中的对象上进行,而是在包含该对象的场景的 2D 图像上进行(这个过程称为光栅化),然后在 2D 图像上执行计算。这在 VR 中可能会产生问题,因为许多屏幕空间计算在两只眼睛之间不匹配。你通常会希望避免在 VR 中使用屏幕空间效果。
在虚幻 4.14 中,Epic 添加了前向渲染作为专门为 VR 项目设计的选项。他们还引入了一种聚类系统,降低了基本通道中处理灯光的成本,所以它的成本不再像以前那样高昂。对于大多数 VR 项目来说,使用前向渲染是个好主意。
在某些情况下,如果你的场景需要支持大量可移动的灯光,或者你知道你将需要非常复杂的反射,你可能仍然希望坚持使用延迟渲染,但你应该认真考虑在大多数 VR 项目中使用前向渲染。
你几乎总是希望在 VR 项目中使用前向渲染。它可以让你更好地控制渲染过程中你想要做的部分和你想要跳过的部分;它更容易处理透明度,并支持更好的抗锯齿选项。
让我们在我们的项目中打开它。
从项目设置 | 引擎 | 渲染中,找到前向渲染器部分,打开前向渲染。你需要在这样做后重新启动编辑器:
当使用前向渲染时,许多昂贵的材质特性通常需要显式地打开。在 VR 中,这是一件好事,因为它让你可以自由地在只有在需要时使用昂贵的特性。我们稍后会讨论在为 VR 创建和修改材质时如何做到这一点。
虽然在项目开发的后期可以随时打开或关闭前向渲染,但你通常会希望做出一个选择并坚持下去,因为两种方法在项目的光照、材质和反射方面可能会有很大的差异。你不希望在开发的后期花费大量精力来开发你的外观,然后做出这样的改变。你最终会不得不重新做很多工作。
选择你的抗锯齿方法
使用前向渲染的一个主要优势是抗锯齿比使用延迟渲染要容易得多。让我们谈谈这意味着什么,以及为什么这对我们在 VR 中很重要。
当渲染器将场景绘制到平面屏幕上(无论是显示器还是 VR 头显)时,该显示实际上由一组称为像素(照片元素)的小方块组成,渲染器必须决定每个像素的颜色。当 3D 场景中的对象只部分填充 2D 空间中的像素时,这就成为一个问题。然后,渲染器必须决定像素应该填充对象的颜色还是背景的颜色。没有中间状态-它必须选择其中之一。实际上,这意味着对象可能会出现锯齿状边缘,特别是沿着跨越许多像素边界的对角线。我们称之为走样问题:
没有抗锯齿渲染的场景
请注意,没有抗锯齿渲染的场景中窗户周围的锯齿。它们在这里看起来很糟糕,在 VR 中看起来会更糟糕。
我们通过一个不出所料被称为抗锯齿的过程来解决这个问题。不同的抗锯齿方法使用各种技术来找到像素的正确颜色,以使其在前景色和背景色之间呈现混合效果,从而软化锯齿边缘。这样可以平滑锯齿边缘并消除对角线上的阶梯状线条:
使用多重采样抗锯齿(MSAA)渲染的场景
看看使用多重采样抗锯齿渲染时窗户看起来更加平滑的效果?
这在 VR 中尤为重要,因为头显的分辨率仍然相对有限,所以用户通常可以看到单个像素。在平面屏幕上可以接受的走样在 VR 中可能看起来很糟糕,因为用户在场景中观察时,锯齿状边缘会爬行和闪烁。您应该避免这种情况。
幸运的是,虚幻引擎提供了三种抗锯齿方法来解决这个问题:
-
FXAA代表快速近似抗锯齿。它寻找场景中的边缘并混合这些边缘的颜色,并且足够智能以避免处理没有对比较边缘的区域,因此看起来很棒并且运行速度相对较快。如果您在 VR 中使用延迟渲染,这应该是您的默认选择。
-
时域抗锯齿(TAA)通过查看前几帧来决定如何对当前帧进行抗锯齿处理。这通常使其在 VR 中成为一个糟糕的选择,因为用户的视图往往会移动很多,时域抗锯齿可能会在快速移动时产生“模糊”效果。即使在没有模糊的情况下,它在 VR 头显上可能看起来太模糊而无法接受。时域抗锯齿通常在平面屏幕上表现出色,但对于 VR 来说并不是一个很好的选择。
-
MSAA代表多重采样抗锯齿。此方法仅在使用正向渲染时可用,并且会比 FXAA 提供更清晰、更好的结果。如果您在项目中使用正向渲染(通常应该使用),这是您应该使用的抗锯齿方法。
让我们在项目中处理这个问题:
从项目设置 | 引擎 | 渲染中,找到默认设置部分,并将抗锯齿方法设置为 MSAA:
大多数情况下,您不需要改变抗锯齿方法的任何设置,但如果需要,继续阅读。
修改 MSAA 设置
这部分是可选的。调整抗锯齿设置是一个高级主题,对于大多数项目来说,您不需要这样做。如果您确实需要调整 MSAA 设置,以下是一个很好的方法:
选择窗口 | 开发者工具 | 设备配置文件以打开设备配置文件窗口:
从此面板中,点击 Windows 行中的 CVars 按钮。
在生成的对话框中,打开控制台变量|渲染。从这里,您可以看到您当前指定的所有与渲染相关的控制台变量。如果您点击 Rendering 旁边的+号,您可以在出现的搜索窗口中键入msaa
,并为 r.MSAACount 添加一个值。默认情况下,此值设置为 4。将其减少到 3 或 2 将降低抗锯齿的质量,但会加快速度。将其设置为 1 将关闭抗锯齿。将其设置为 0 将关闭抗锯齿并回退到时间抗锯齿:
如果您在这里进行了更改,请在设备配置窗口上点击“保存为默认值”以保存这些设置。它们将被写入项目的Configs
目录中的一个名为DefaultDeviceProfiles.ini
的新配置文件中。
再次更改这些值是一个高级主题。我们建议您在确保理解其功能之前不要修改这些值。
在 VR 中开始
告诉我们的项目在运行时启动 VR 也很重要。如果您想构建一个既可以在 VR 中运行又可以在平面屏幕上运行的项目,您可以选择关闭此选项,并在启动时使用-vr
命令行参数。但是,我们的项目只能在 VR 中运行,所以我们想打开它。
转到项目设置|项目|描述|设置,并将“在 VR 中启动”设置为 True**。**
关闭其他不需要的杂项设置
在您的渲染|默认设置中,关闭环境遮挡静态分数。环境遮挡是一种用于创建物体接触处出现的微妙阴影的方法,但是计算它们的成本很高,并且在 VR 中可能看起来很糟糕,因为它们是在屏幕空间中计算的。我们不会在这里深入讨论这个主题。当您将项目设置为移动、可扩展的 2D/3D 时,您已经关闭了环境遮挡,所以这只是一个您应该清除的杂项设置。
关闭默认触摸界面(Oculus Go/Samsung Gear)
如果您正在开发 Oculus Go 或 Samsung Gear 的应用程序,您需要关闭默认的触摸界面。移动应用程序通常假设您将通过触摸屏幕来操作它们,但是在头戴式显示器中当然不会发生这种情况。
导航到项目设置|引擎|输入,并从移动部分中获取 Default Touch Interface 旁边的下拉菜单并清除它:
为 Android 配置您的项目(Oculus Go/Samsung Gear)
现在,我们需要配置项目使用 Android SDK。我们在上一章中已经完成了这个过程,我们只需要为这个项目设置相同的设置。这里是我们需要做的事情的快速提醒。
从项目设置|平台|Android 中,找到 APK 打包部分,然后点击“立即配置”。如果您在上一章中已经接受了 SDK 许可证,那么该按钮将被禁用-您只需要接受一次:
然后设置这些设置(正如我们在上一章中提到的,大多数指南会告诉您将 SDK 版本 19 作为最低版本。这对于 Samsung Gear 来说是可以的,但对于 Go,请使用版本 21)
-
最低 SDK 版本:21
-
目标 SDK 版本:21
-
在 KitKat 及以上设备上启用全屏沉浸式:True
向下滚动到高级 APK 打包部分,并设置如下:
- 将 AndroidManifest 配置为部署到 Oculus Mobile 的 True。
验证您的 SDK 位置
选择项目设置|平台|Android SDK,并确保正确设置 SDK 位置。如果您按照上一章的说明进行操作,它们应该已经设置好了。如果没有,请返回那里并进行设置。
确保关闭移动 HDR(Oculus Go/Samsung Gear)
检查您的项目设置|引擎|渲染|移动,并确保关闭移动 HDR。
移动多视图(Oculus Go/Samsung Gear)
还记得在关于实例化立体渲染的部分中,我们讨论了为每只眼睛渲染整个场景是多么浪费吗?移动头戴设备也有一个解决方案,称为移动多视图。移动多视图的工作原理与实例化立体渲染基本相同-先为左眼渲染场景,然后将图像移动和调整为右眼。我们想要打开它。
在项目设置 | 引擎 | 渲染 | VR 中,将移动多视图设置为 true,并同时打开移动多视图直接选项。Oculus 不建议或支持在没有直接选项的情况下使用移动多视图。将它们都打开:
单眼远场渲染(Oculus Go / Samsung Gear)
关于立体深度感知的问题是,我们只能在一定距离内看到它。超过这个距离,立体图像和平面图像之间没有可见的区别。它们对我们来说看起来是一样的。我们可以利用这一点。
如果我们将项目设置 | 引擎 | 渲染 | VR | 单眼远场设置为 true,引擎将只渲染指定距离之外的任何物体一次,这可以在适当的场景中节省大量时间:
默认情况下,单眼和立体渲染之间的分割发生在 7.5 米处,但这在每个地图上都是单独设置的。(这个分割的位置称为裁剪平面。)这个裁剪平面与摄像机的距离在每个地图上都是单独设置的。要进行调整,请打开窗口 | 世界设置,并在出现的设置面板上查找 VR 部分。调整单眼裁剪距离将改变裁剪平面的位置。
对于场景中的某些对象,特别是大型对象,如果它们的边界靠近摄像机,即使它们实际上只出现在远处,您可能需要强制它们以单眼模式渲染。在这些情况下,打开对象的详细信息,并将渲染 | 渲染为单眼设置为 true。(此选项在渲染部分的高级选项中隐藏。)
项目设置备忘单
我们刚刚介绍了一些在为 VR 设置项目时应该修改的设置,以及每个设置的一些背景知识。为了回顾一下,这是我们所更改的备忘单:
-
项目设置 | 引擎 | 渲染 | VR | 实例化立体:True
-
项目设置 | 引擎 | 渲染 | VR | 轮询遮挡查询:True
-
项目设置 | 引擎 | 渲染 | 正向渲染器 | 正向着色:True
-
项目设置 | 引擎 | 渲染 | 默认设置 | 抗锯齿方法:MSAA
-
项目设置 | 引擎 | 渲染 | 默认设置 | 环境遮蔽静态分数:False
-
项目设置 | 项目 | 描述 | 设置 | 启动 VR:True
这是移动 VR 版本:
-
项目设置 | 引擎 | 输入 | 移动 | 默认触摸界面:无
-
项目设置 | 平台 | Android | APK 打包:配置和设置所提到的设置
-
项目设置 | 平台 | Android SDK:验证您的 SDK 位置是否设置正确。
-
项目设置 | 引擎 | 渲染 | 移动 | 移动 HDR:False
-
项目设置 | 引擎 | 渲染 | VR | 移动多视图:True
-
项目设置 | 引擎 | 渲染 | VR | 移动多视图直接:True
-
项目设置 | 引擎 | 渲染 | VR | 单眼远场:True
再次强调,不要盲目地遵循这些设置。对于大多数 VR 项目,这些是您想要的设置,但这并不意味着它们适用于您所做的每个项目。
装饰我们的项目
现在我们已经设置了项目的基本设置,让我们添加一些环境艺术,这样我们在工作时就有一些有趣的东西可以看。
将内容迁移到项目中
从您的Epic Games Launcher中打开 Learn 选项卡,并搜索Sun Temple
示例环境。点击创建项目按钮,并选择一个您想保存的位置:
让它下载。项目下载完成后,打开它。它应该打开到太阳神庙地图。现在我们要将这个地图迁移到我们现有的项目中。
我们也可以下载太阳神庙项目,然后设置它以在 VR 中运行。我们这样做是为了给您一个学习“迁移…”工具的机会。当您需要将资产从一个项目迁移到另一个项目时,“迁移”工具是最好的方法。
在内容浏览器中,选择“内容”|“地图”|“太阳神庙”。右键单击它,然后选择“资产操作”|“迁移…”:
现在,您将看到一个列表,其中列出了如果迁移此地图将被复制的所有内容。这就是“迁移…”工具的强大之处,也是为什么您应该使用它的原因。当您将资产迁移到另一个项目时,虚幻会检查该资产工作所需的其他所有内容,并将其包含在要复制的资产列表中。因此,例如,如果您迁移一个网格,该网格使用的材质和纹理也将被自动找到并迁移。在我们的例子中,我们正在迁移一个地图,所以虚幻将把地图所依赖的所有内容带入新项目中:
现在你需要选择你要放置迁移内容的位置。迁移操作的目标始终必须是目标项目的Content
目录。导航到该位置并选择它。(这就是为什么我们在本章开始时提到了了解虚幻项目目录结构的重要性。您偶尔需要知道其中的内容存放位置。)
迁移完成后,让我们关闭这个项目,重新打开刚刚添加了这个地图的项目。
现在你应该在内容浏览器的“Maps”目录中看到一个太阳神庙地图。让我们打开它。
如果这是您第一次打开此地图,虚幻可能需要编译大量着色器。(这是为什么我们在第二章中设置了派生数据缓存的原因之一——一旦编译了着色器,它们将存储在此缓存中,因此当您打开其他项目时,无需重新编译它们。)
在迁移此地图时,还有一些额外的内容。我们现在要摆脱它,以便我们可以专注于我们正在创建的新资产。顺便说一下,我们还将利用这个机会向您展示一些关于管理内容浏览器中的资产的重要内容,这对您的继续开发非常重要。
清理迁移内容
打开太阳神庙地图,打开“窗口”|“世界设置”,找到“游戏模式覆盖”。(我们将很快讨论游戏模式。)通过点击属性旁边的黄色“重置为默认”箭头来清除它:
每当您看到一个黄色的“重置为默认”箭头时,点击它将恢复属性的标准设置。
保存地图。
安全删除资产
现在在内容浏览器中选择“蓝图”文件夹。我们马上要创建自己的蓝图,所以我们不需要这些。删除此文件夹,但要注意出现的确认对话框。
如果您看到一个带有警告的“强制删除”按钮,这意味着您要删除的内容仍然在某个地方使用中。您几乎永远不应该删除仍然被引用的内容。(我们在这里说“几乎”是因为一旦您真正了解引擎在做什么,就有某些情况可以稍微推动它,但在您确切知道底层发生了什么之前,请不要这样做。)相反,找出资产仍在使用的位置,并将引用更改为指向其他内容,或者删除引用它的对象,或者保持不变:
如果可以安全删除对象,对话框将只显示一个删除按钮。这意味着删除它不会破坏其他内容:
在这种情况下,如果出现强制删除警告,意味着您可能没有清除地图的世界设置中的 GameMode Override,或者您在此之后没有保存地图。如果只有一个简单的删除按钮,点击它以删除文件夹及其内容。
移动资产并修复重定向器
现在让我们整理剩下的内容。在内容浏览器中,为您的项目创建一个新文件夹。我们可以将此文件夹命名为HelloVR
。
在内容浏览器中为您的项目创建一个文件夹是一个好主意。这样,当您从其他来源迁移更多内容到项目中,或者从市场添加资产时,您将永远不会困惑于哪些资产属于您的项目,哪些是外部来源的。同样,如果将资产迁移到其他位置,它们将全部出现在新项目的内容浏览器中。大多数开发者不这样做,但每个人都应该这样做。当您第一次迁移插件并让其将资产散落在现有文件夹中时,您就会明白为什么。通过保持自己的项目有组织,您可以避免很多混乱。
由于我们已经删除了Blueprints
文件夹,我们仍然有另外两个从迁移内容中遗留在内容根目录的文件夹。让我们将它们移动到我们的项目文件夹中。
将Maps
文件夹拖动到HelloVR
文件夹中。当询问是否移动或复制时,选择移动。现在将Assets
文件夹也进行同样的操作。
但这是什么?我们已经移动了文件夹,但旧位置的文件夹并没有消失。为什么?原因是虚幻引擎留下了一组重定向器。您应该了解这些。让我们将它们显示出来。
在搜索栏旁边的筛选器下拉菜单中,选择筛选器 | 其他筛选器 | 显示重定向器:
现在让我们进入那个被遗留的Assets
文件夹,并进入其中的Blueprints
文件夹。里面有一个名为 BP_Godray 的重定向器,我们将其移动到了新位置。双击此重定向器,它将带您到资源的新位置。这就是重定向器的作用。当您在虚幻引擎中移动资源时,很可能项目中的其他内容正在使用该资源并指向它。虚幻引擎允许您在不更改引用的情况下移动资源,当其他对象尝试在旧位置找到它时,重定向器将把它们指向新位置,您可以稍后更改引用指向的位置。这是一个很好的系统,可以在大型项目中节省很多麻烦。
然而,如果您不需要重定向器,您不希望将其留在那里。要清理重定向器,请右键单击它,并选择“修复”:
这将找到所有引用该资源的资源,并将引用指向新位置。完成后,删除重定向器,因为它不再需要。
这也可以同时对文件夹中的每个重定向器执行。接下来我们来做这个。
首先,我们将使内容浏览器的文件夹结构更易于查看。点击筛选器下拉菜单旁边的“Sources Panel”按钮,打开“Sources panel”:
这将切换到项目内容目录的树状视图,可以更方便地浏览和移动资源:
现在我们可以看到我们正在做什么了,让我们选择包含所有重定向器的旧的Assets
文件夹,右键单击它,然后选择“修复文件夹中的重定向器”:
操作完成后,您可以删除旧的Assets
文件夹,因为它现在是空的。
在删除文件夹之前,验证文件夹是否为空的一个好方法是在内容浏览器中右键单击文件夹,选择在资源管理器中显示,并在资源管理器中选择文件夹,按下Alt + Enter以显示其属性。如果显示为 0 个文件,则为空。如果有任何内容,您可以深入了解其中的内容以及是否需要保留。
我们的Content
目录现在应该非常有条理,我们使用的所有内容都集中在我们的HelloVR
文件夹下。如果您在项目较小的时候就养成了保持Content
目录整洁的习惯,那么一旦项目变得庞大,您将会更容易处理。
设置默认地图
现在我们已经导入了地图并清理了附带的额外蓝图,让我们设置项目以将 Sun Temple 作为默认地图加载。
在项目设置|项目|地图和模式|默认地图下,使用下拉菜单将 Sun Temple 设置为您的编辑器启动地图和游戏默认地图:
这样,当您启动编辑器或启动游戏作为独立可执行文件时,它将直接加载到这个地图中。
在桌面上测试我们的地图
让我们来看看我们目前所拥有的。如果我们正在开发桌面 VR,我们可以在 VR 中启动地图并四处查看。在编辑器工具栏上,选择播放按钮右侧的下拉菜单。选择 VR 预览(如果 VR 预览变暗,请确保您的 VR 头显已连接并且其软件正在运行):
这里感觉还不错,对吧?
我们还不能做太多事情,而且相对于地板来说我们的高度也不正确,但它正在运行,我们准备开始设置事物。
在移动设备上测试我们的地图(Oculus Go/Samsung Gear)
如果我们想在移动设备上测试地图,我们还需要做一些其他的事情。
假设我们已经按照说明设置好了在移动设备上运行项目,让我们首先检查我们的移动设备是否已连接并可见。
重要提示:如果您更新了 Unreal Engine 版本,请确保在<Engine Install Location>\Engine\Extras\AndroidWorks\Win64
下重新运行CodeWorks for Android安装程序。使用更新的 Unreal 代码和过时的 Android SDK 代码构建可能会在尝试在移动 VR 中运行时创建难以调试的错误。记得保持您的 CodeWorks 更新。
打开 Windows PowerShell 并导航到 Android SDK 目录中的platform-tools
目录。默认情况下,这将是C:\NVPACK\android-sdk-windows\platform-tools
。从这里,键入./adb devices
。您应该在这里看到您连接的设备的序列号,并在旁边带有device
一词。如果显示为“unauthorized”,则需要在头显内部接受与 PC 的连接。如果显示为“offline”,则可能需要重新启动您的adb
服务器。键入./adb kill-server
,然后再次运行./adb devices
:
如果您正在使用移动设备进行开发,无论如何,您都将花费大量时间在 PowerShell 中与设备进行通信。花时间学习 ADB 尤为重要。当出现问题时,您将使用 ADB 来找出问题所在。在此处了解更多信息:developer.android.com/studio/command-line/adb
。
如果您的./adb
设备看起来不错,您应该准备好将项目发布到设备上了。
在编辑器工具栏上的启动下拉菜单中,选择与您设备的序列号匹配的 Android 条目。
启动过程应该开始了。正如我们在第二章中提到的设置开发环境,第一次执行可能需要一些时间。
设置游戏模式和玩家角色
现在我们已经设置了一个基本场景并验证了它在平台上运行,让我们开始构建一些功能。
创建一个 VR 角色
我们首先需要做的是创建一个代表玩家的角色。角色是一种可以由玩家或 AI 控制的演员类型。在我们的情况下,我们将创建一个玩家可以控制的角色。
虚幻引擎是一个面向对象的系统。这意味着引擎是围绕称为对象的离散项组织的。一个对象由属性组成,你可以通过查看地图中选择的项目的详细面板来看到这些属性,以及函数,你通常可以在蓝图编辑器中看到这些函数。对象经常从彼此继承,因此一个新的对象类可能使用另一个类作为其父类来创建。这意味着新类将继承其父类的属性和行为,但可以更改这些属性和行为或添加新的属性和行为。因此,一个演员是对象类的子类,它添加了在世界中放置的能力。角色是一种可以由玩家或 AI 控制的演员类型。当我们使用角色作为父类创建自己的类时,我们正在设置该类来承担角色的所有功能,然后更改其行为或添加我们自己的功能。
让我们在内容浏览器中导航到我们的Content/HelloVR/Assets/Blueprints
文件夹,在文件夹中的任何空白处右键单击,然后选择创建基本资产 | 蓝图类:
在随后的对话框中,我们将被要求选择我们新蓝图的父类。选择 Pawn:
在我们的Blueprints
目录中将创建一个新的蓝图资产。让我们将其命名为BP_VRPawn
。
当你给你的资产命名时,遵循一个命名约定是一个好习惯。命名约定是在你思考为你正在创建的新事物命名时遵循的一组规则。通过在命名对象时遵循规则,你可以更容易地看到一个对象是什么,或者记住你给它起的名字。在这种情况下,我们使用BP_ 前缀
作为提醒,我们的角色是一个蓝图类。一个特别全面和深思熟虑的命名约定在这里:github.com/Allar/ue4-style-guide
。
一会儿,我们将开始修改我们的角色,但是首先,我们需要告诉地图使用它。
创建一个游戏模式
每当虚幻加载一个地图时,它首先检查规定地图行为的规则。这些规则可以指定许多事情,但我们现在关心的是从Player Start
对象生成什么样的角色。这些规则的集合存在于一个称为游戏模式的类中。
让我们创建一个游戏模式。在空白处右键单击,创建一个蓝图类,并选择 Game Mode Base 作为其父类。我们将其命名为BP_VRGameMode
。
双击我们的新游戏模式以打开它,在其详细信息部分,选择 Classes | Default Pawn Class 下拉菜单,并选择我们刚刚创建的BP_VRPawn
类:
对于我们现在的目的,这就是我们需要做的关于游戏模式的一切。我们只是使用它来指定我们想要加载的角色类。编译并保存它。
蓝图是一种编译语言。在您编写的代码可以由 CPU 运行之前,需要将其转换为 CPU 可以理解的语言。这可以通过两种主要方式实现。解释语言在运行时即时翻译。然而,这样做会带来一些成本,因为解释器需要在您的代码旁边运行并尝试在运行时进行翻译。将所有内容离线翻译为准备好在 CPU 需要运行时运行的单独进程中,这样处理速度更快。这是编译语言处理事物的方式,当您编译蓝图时,这就是您所做的事情。
默认情况下,当蓝图被编译时,它们被编译为一种格式,然后由虚拟机使用该蓝图代码托管您的应用程序运行时。这个系统运行速度很快,但如果您想从中挤出更多的速度,您可以选择将它们转换为本机 C++,然后允许它们编译为机器代码。此时,它们可以像直接在 C++中编写的代码一样快速运行。
分配游戏模式
现在,我们需要告诉我们的项目使用这个游戏模式作为默认模式。
打开项目设置,并在项目|地图和模式|默认模式下,将我们的默认游戏模式设置为我们新创建的游戏模式:
现在,我们项目中加载的任何关卡都将使用此游戏模式来决定生成什么以及运行场景时遵循什么规则。
为特定地图覆盖游戏模式
如果我们想要其中一个地图使用不同的游戏模式怎么办?例如,如果我们设置了一个入口菜单场景,我们可能希望生成一个专门用于与菜单交互的棋子,以替代默认的玩家棋子。幸运的是,这很容易实现。
如果尚未可见,请选择窗口|世界设置以打开我们的世界设置选项卡。在世界设置中,在游戏模式下,将游戏模式覆盖设置为我们刚刚创建的新 BP_VRGameMode:
我们刚刚告诉引擎在加载此地图时使用我们的新游戏模式,而不管项目设置中指定了什么游戏模式。
有四个地方可以指定要使用的游戏模式:
-
您可以在项目设置|地图和模式|默认模式|默认游戏模式中设置它。在项目中,除非有其他覆盖,否则此处指定的游戏模式将默认加载。
-
您可以在单个地图中设置游戏模式覆盖,就像我们在这里所做的那样。如果设置了全局默认游戏模式,它将覆盖项目设置中的全局默认游戏模式。
-
当启动可执行文件时,您可以使用命令行参数
?game=MyGameMode
来指定游戏模式。这将覆盖默认游戏模式以及地图中设置的任何覆盖。 -
在
DefaultEngine.ini
中,您可以指定在加载具有特定前缀的地图时要加载的特定游戏模式。如果设置了此项,它将覆盖任何其他规定。
将一个棋子直接放在世界中
虽然通常最好使用游戏模式和玩家起始对象将玩家棋子放入世界中,但您不必这样做,有时您会遇到一些现有项目,例如默认的 VR 模板项目,不使用游戏模式来设置玩家棋子。
在这些情况下,不要在您希望玩家生成的场景中放置玩家起始对象,而是直接将您的棋子蓝图拖放到场景中。如果场景中已经有一个现有的玩家起始点,请将其删除。
记住我们说过棋子可以由玩家或 AI 控制吗?由于没有游戏模式来完成这项工作,您需要将您的棋子置于玩家控制之下。选择刚刚放置在关卡中的棋子,在其详细信息中找到 Pawn | Auto Possess Player,并将值设置为 Player 0。这将在生成到世界中时将棋子置于玩家控制之下:
一般来说,最好使用 GameMode 来指定玩家角色类,但你应该知道这种方法的存在,因为你会看到一些项目使用它。
设置 VR 角色
现在,我们已经创建了一个 VR 角色并设置了游戏模式来使用它,让我们修改这个角色以适当地在 VR 中使用。我们将从头开始做这个。通常情况下,当你创建一个简单的 VR 应用程序时,你会使用 VR 模板提供的角色类,但我们不希望你把它当作一个支撑。更好的做法是了解如何为 VR 构建角色,这样你就可以根据需要适当地构建它。
我们要做的第一件事是打开我们的角色。
添加相机
在蓝图编辑器视图的左上角,你应该看到一个组件选项卡。点击绿色的+Add Component 按钮,在下拉菜单中选择 Scene 创建一个场景组件。将其命名为Camera Root
:
组件是可以添加到蓝图对象中的附加元素。有各种各样的组件可供选择,它们都有不同的功能。组件按层次结构组织,允许你将组件附加到其他组件上。你可以通过这种方式做很多事情。
现在,创建一个新的相机组件。如果在创建相机组件时仍然选择了 Camera Root 场景组件,则相机组件将作为 Camera Root 的子组件创建。如果没有选择,将其拖动到 Camera Root 上,将 Camera Root 设置为其父组件。
通常情况下,像我们在这里做的这样设置一个单独的根组件是一个好主意。这样可以更灵活地更改角色的结构,或者更改组件(如相机)的旋转或位置,而无需调整对象的位置。
添加运动控制器
接下来,选择DefaultSceneRoot
组件,并创建一个Motion Controller
组件。对于这个组件,在添加组件菜单的顶部使用搜索组件栏,输入mot
以缩小搜索范围到运动控制器组件。使用这个搜索栏可以节省很多时间。将这个新组件命名为MotionController_L
,确保它是DefaultSceneRoot
的子组件,而不是 CameraRoot 或 Camera 的子组件。
选择DefaultSceneRoot
,再次执行上述步骤创建第二个运动控制器组件。将其命名为MotionController_R
,并确保它是DefaultSceneRoot
的子组件,而不是任何其他组件:
现在,你的组件层次结构应该看起来像上面的截图。
在继续之前,我们需要设置一些运动控制器组件的属性。选择MotionController_R
组件,在其详细面板中找到 Motion Controller | Motion Source 条目。将其设置为 Right,以允许右手的 Oculus 或 Vive 控制器移动控制器。顺便说一下,确保MotionController_L
仍然设置为使用 Left 作为其运动源。默认情况下应该是这样的:
让我们也将这两个控制器设置为可见,以便我们可以验证它们是否正常工作。从每个运动控制器组件的详细面板中,选择可视化|显示设备模型。打开此选项,并验证显示模型源是否仍设置为默认值,这将简单地显示你正在使用的运动控制器硬件的模型。我们稍后会替换我们的运动控制器显示,但现在,我们只是想看到它们,以便我们可以验证我们已经正确设置它们:
设置我们的跟踪原点。
现在,我们需要告诉我们的角色如何解释追踪空间中头戴设备的位置。在您的角色的组件选项卡下方寻找“我的蓝图”选项卡,如果您的事件图面板在主编辑窗口中尚不可见,请在“我的蓝图”选项卡中双击“图表|事件图”以显示它:
一旦进入事件图,找到 BeginPlay 事件,或者在图形编辑器中右键单击任意位置并在出现的搜索对话框中键入beginplay
以查找或创建 BeginPlay 事件。从 BeginPlay 事件拖动执行线并右键单击以创建一个新节点。找到输入|头戴显示器|设置跟踪原点,或者开始在搜索框中键入以找到它。创建一个“设置跟踪原点”节点,并将其原点设置为地板高度,如果您使用的是房间规模的 VR 系统,如 HTC Vive 或带有触摸控制器的 Oculus Rift,或者将其原点设置为眼睛高度,如果您使用的是非房间规模的系统,如 Oculus Go 或较旧的单摄像头 Oculus Rift。
调整我们的玩家起始位置到地图中。
最后,我们需要调整地图中的玩家起始位置。在您的世界大纲中找到它(您可以使用搜索栏更快地找到它,然后选择它并将其拖动到场景中,直到其中心与地板相交(这是一种不太正式的对齐角色的方法,我们稍后会更好地完成这个工作,但现在它可以工作):
在头戴设备中进行测试。
我们现在拥有了在虚幻中创建 VR 体验所需的基本组件。我们有一个已经正确设置为在 VR 中高效运行的项目,以及一个可能还没有太多功能的角色,但已经准备好作为我们真正想要做的事情的基础。
让我们进行测试。使用 VR 预览启动地图,并验证您的视图是否位于正确的高度,并且在移动手时是否可以看到您的动作控制器。帧率也应该是可以接受的。
打包独立构建
当我们将虚幻应用程序分发给其他用户时,通常不会给他们编辑器的源文件。相反,我们将项目打包成一个可以在目标平台上运行的独立可执行文件。
让我们创建一个 Windows 独立可执行文件。
选择文件|打包项目|Windows|Windows(64 位)以启动打包过程。将被问到放置的位置。选择一个有意义的位置。(通常,在项目目录中创建一个“打包”目录是合理的。您可以将打包的构建放在任何您想要的地方。)当构建状态对话框出现时,点击“显示输出日志”以查看它正在做什么:
预计这个过程会花费一些时间。
一旦进程完成,关闭编辑器并检查您告诉系统构建可执行文件的位置。您应该在其中看到一个WindowsNoEditor
文件夹。在其中,您应该看到一个带有项目名称的可执行文件。启动可执行文件。如果在项目设置中设置了在 VR 中启动标志,它应该直接启动到您的头戴设备。
总结
恭喜!我们涵盖了很多内容。在本章中,我们经历了创建起始 VR 项目并正确设置其在目标硬件上运行的过程。我们学会了在设置新的 VR 项目时如何决定使用哪些设置,以及如何在虚幻项目目录中找到我们的方式。我们还了解了在 VR 开发中使用的一些重要虚幻引擎功能:
-
实例化立体
-
循环轮询遮挡
-
前向渲染
-
多重采样抗锯齿(MSAA)
-
[移动]移动多视图
-
[移动]单眼远场渲染
我们学会了如何从一个项目迁移内容到另一个项目,并在其到达后如何清理我们的“内容”目录。
最后,我们设置了一个基本的 VR 棋子,并设置了一个游戏模式来指示地图加载它。在使用棋子时,我们了解了如何使用组件来将简单的部件组装成复杂的对象,添加了相机和跟踪运动控制器。最后,我们设置了我们棋子蓝图的第一个元素,以适应我们的 VR 硬件的跟踪原点,并测试了我们的地图。
在下一章中,我们将使在本章中创建的棋子能够在世界中移动。我们将使用蓝图来创建一个传送移动方案,并学习如何设置环境来支持它,然后我们将继续实现一系列沉浸式移动方案。