虚幻游戏开发学习指南-全-
虚幻游戏开发学习指南(全)
原文:
zh.annas-archive.org/md5/051c3b4dba0eeeb804fe767fd8f102cf译者:飞龙
前言
许多人知道什么是游戏,很多人每天都在玩游戏。但有多少人知道如何创建一个游戏?使用虚幻引擎 4 进行游戏开发允许有志于成为游戏创作者的人快速开发看起来专业的游戏。虚幻引擎 4 提供了非常精致的游戏开发工具和能力,几乎可以定制你所能梦想的任何游戏。
这本书涵盖的内容
第一章,虚幻引擎概述,介绍了游戏引擎是什么,特别是针对虚幻引擎 4 及其历史。你将了解虚幻引擎 4 的功能以及它如何帮助你创建游戏。
第二章,创建你的第一个关卡,解释了如何使用 Box Brush 创建你的第一个房间,添加材质来纹理墙壁/地板,以及如何放置静态对象以增强房间的外观。
第三章,游戏对象 – 更多和移动,介绍了简单对象类型(称为静态网格)的结构,以及虚幻引擎中的对象是如何相互交互的。本章还介绍了蓝图,这是虚幻引擎 4 的图形脚本。
第四章,材质和光照,展示了如何通过学习如何创建自己的基本自定义材质以及如何使用简单的光照来照亮关卡内部来更详细地自定义你的关卡。
第五章,动画和 AI,介绍了在虚幻引擎中动画是如何工作的,以及如何在你的游戏关卡中实现简单的 AI。
第六章,粒子系统和声音,解释了如何向你的关卡添加视觉和声音效果。
第七章,地形和电影特效,展示了如何使用地形操作和电影特效给你的关卡添加最后的修饰。
你需要这本书的内容
你需要创建一个 Epic Games 的免费账户才能开始使用虚幻引擎 4。
这本书面向谁
这本书是为那些刚开始接触游戏开发并想了解游戏是如何创建的人而编写的。
术语约定
在这本书中,你会发现许多文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。
文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称如下所示:“在我的情况下,它将是Chapter2Level。”
新术语和重要词汇以粗体显示。你在屏幕上看到的单词,例如在菜单或对话框中,在文本中显示如下:“模式窗口让你能够创建并将对象放置到游戏世界中。”
注意
警告或重要注意事项以这种方式出现在一个框中。
小贴士
小贴士和技巧看起来像这样。
读者反馈
我们始终欢迎读者的反馈。请告诉我们您对这本书的看法——您喜欢或不喜欢什么。读者反馈对我们来说很重要,因为它帮助我们开发出您真正能从中获得最大收益的标题。
要发送给我们一般性的反馈,只需发送电子邮件至<feedback@packtpub.com>,并在邮件主题中提及书籍的标题。
如果您在某个主题上具有专业知识,并且您对撰写或为书籍做出贡献感兴趣,请参阅我们的作者指南:www.packtpub.com/authors。
客户支持
现在您已经是 Packt 书籍的骄傲拥有者,我们有一些事情可以帮助您从您的购买中获得最大收益。
下载示例代码
您可以从www.packtpub.com下载您购买的所有 Packt 出版物的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。
下载本书的彩色图像
我们还为您提供了一个包含本书中使用的截图/图表的颜色图像的 PDF 文件。这些彩色图像将帮助您更好地理解输出的变化。您可以从:www.packtpub.com/sites/default/files/downloads/LearningUnrealEngineGameDevelopment_ColorImages.pdf下载此文件。
勘误
尽管我们已经尽一切努力确保我们内容的准确性,但错误仍然会发生。如果您在我们的书中发现错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以节省其他读者的挫败感,并帮助我们改进本书的后续版本。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表链接,并输入您的勘误详情来报告它们。一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站或添加到该标题的勘误部分下的现有勘误列表中。
要查看之前提交的勘误表,请访问www.packtpub.com/books/content/support并在搜索字段中输入书籍名称。所需信息将出现在勘误部分。
侵权
互联网上对版权材料的盗版是一个跨所有媒体的持续问题。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上发现任何形式的我们作品的非法副本,请立即提供位置地址或网站名称,以便我们可以寻求补救措施。
请通过链接<版权@packtpub.com>与我们联系,并提供疑似盗版材料的链接。
我们感谢您在保护我们作者和我们为您提供有价值内容的能力方面的帮助。
问题
如果您对本书的任何方面有问题,请通过链接<问题@packtpub.com>与我们联系,我们将尽力解决问题。
第一章:虚幻引擎概述
首先,感谢您拿起这本书。我相信您一定很兴奋地想要学习如何制作自己的游戏。在本章中,我将向您介绍游戏中不同的基本组件以及虚幻引擎 4 如何帮助您制作您梦想中的游戏。
本章将涵盖以下主题:
-
游戏中包含什么?
-
虚幻引擎(UE)的历史
-
游戏开发是如何进行的?
-
UE 的组件及其编辑器
游戏中包含什么?
当你玩游戏时,你可能能够识别出游戏中需要包含的内容。在一个简单的 PC 射击游戏示例中,当你按下左鼠标按钮时,枪会触发。你看到子弹飞出,听到枪声,四处张望看看你是否击中了什么。如果你击中了什么,例如,一堵墙,目标会受到某种形式的损伤。
作为游戏创作者,我们需要学习分解我们在游戏中看到的内容,以确定我们为游戏需要什么。以下是一个简单的分解,不涉及过多细节:将鼠标点击与子弹发射联系起来,播放类似枪声的声音文件,在枪管附近显示火花(称为粒子效果),目标显示一些可见的损伤。
考虑这个例子,尝试将任何游戏可视化并分解为其基本组件。这将极大地帮助你设计和创建游戏关卡。
当你在玩游戏时,幕后有很多事情在进行。借助虚幻引擎,许多组件的交互已经被设计和定制,你需要根据你自己的游戏进行定制。当你使用引擎来制作游戏时,这将节省大量时间。
什么是游戏引擎?
游戏引擎所做的是为你提供工具和程序,帮助你定制和构建游戏;它为你制作自己的游戏提供了先发优势。虚幻引擎是目前市场上更受欢迎的选择之一,并且任何人都可以免费用于开发(如果你的游戏盈利,则需要支付版税;更多信息请访问www.unrealengine.com/custom-licensing)。它的流行主要归功于其广泛的定制性、多平台能力和使用它创建高质量 AAA 游戏的能力。如果你打算开始游戏开发生涯,这绝对是你想要开始尝试并用于构建你作品集的引擎之一。
虚幻引擎的历史
在解释这个强大无比的游戏引擎能做什么以及它是如何工作的之前,让我们先短暂地回顾一下过去,看看 UE 是如何产生的,以及它是如何发展到今天这个样子的。
对于玩家来说,你可能对 Unreal 游戏系列很熟悉。你知道第一款 Unreal 游戏是如何制作的吗?Epic Games 的工程师构建了一个引擎,帮助他们创建第一款 Unreal 游戏。多年来,随着每一代 Unreal 游戏系列的发展,越来越多的功能被添加到引擎中,以帮助游戏开发。这反过来又提高了 UE 的能力,并在几年内迅速改善了游戏引擎。
在 1998 年,UE 的第一个版本使得对第一人称射击游戏的修改成为可能。你可以使用自己的内容替换 Unreal 内容,并使用 UnrealScript 调整非玩家角色(NPCs),也称为机器人(由计算机通过人工智能控制的玩家)的行为。随后,通过开发在线游戏Unreal Tournament,将多人在线功能添加到 UE 中。这款游戏还把 PlayStation 2 添加到了兼容平台列表中,除了 PC 和 Mac。
到 2002 年,UE 取得了飞跃性的进步,通过开发粒子系统(生成如雾和烟雾等效果的系统)、静态网格工具(操纵对象的工具)、物理引擎(允许对象之间如碰撞的交互)和 Matinee(创建剪辑的工具,即简短的非交互式电影),将其带入下一代。这一改进导致了Unreal Championship和Unreal Tournament 2003的发展。Unreal Championship的发布还把 Xbox 游戏机添加到了列表中,并在 Xbox Live 中提供了多人游戏功能。
Epic 的下一款游戏Unreal II: The Awakening的开发,通过引入动画系统和现有引擎的整体改进,将 UE 向前推进。2000 年代初互联网速度的加快也增加了多人在线游戏的需求。Unreal Tournament 2004允许玩家相互进行在线战斗。这导致了车辆和大型战场的创建,以及在线网络能力的提升。2005 年,Unreal Champion 2在 Xbox 游戏机上的发布,加强了 UE 在 Xbox 平台上的能力。这也见证了新第三人称摄像系统的一个重要特性的创建。这为使用该引擎创建的游戏类型打开了更大的可能性。
战争机器是电子游戏行业中最为知名的品牌之一,它推动 Epic Games 在 2006 年创建并发布了其游戏引擎的第三个版本,Unreal Engine 3。
使用 DirectX 9/10 的图形引擎的改进,使得制作更逼真的角色和对象成为可能。Kismet 的引入,这是一个视觉脚本系统,允许游戏和关卡设计师在不深入编写代码的情况下创建更具吸引力的战斗玩法逻辑。UE3 的平台功能包括增加了 Xbox360 和 PlayStation 3。在光照控制和材质方面进行了全面革新。UE3 还引入了新的物理引擎。2008 年发布的 《战争机器 2》 看到了 UE3 的逐步改进。2013 年,发布了 《战争机器:审判》。
PC 在线游戏也受到了 Epic Games 开发者的关注。2009 年,发布了 Atlas Technology,与 UE 结合使用,以允许创建 大型多人在线游戏(MMOG)。
移动游戏需求的增加也导致 UE3 向着增强其对各种移动平台的支持能力方向发展。所有这些进步和技术能力使 UE3 成为最流行的 Unreal Engine 版本,并且至今仍然非常广泛地被使用。
UE3 在市场上主导了 8 年,直到 UE4 的出现。UE4 于 2014 年发布,通过用新的 蓝图 概念取代 Kismet 带来了最大的变化。我们将在本章后面更详细地讨论 UE4 的功能。
游戏开发
每个游戏工作室都有自己的一套流程来确保其游戏的成功发布。游戏制作通常在游戏发布之前要经过几个阶段。一般来说,有前期制作/规划阶段、制作阶段和后期制作阶段。大部分时间通常都花在制作阶段。
游戏开发是一个迭代的过程。一个想法的诞生是这个过程的开始。游戏的想法必须首先经过测试,看看它是否真的对目标受众有乐趣。这通过快速原型化关卡来完成。从几周到几个月甚至几年,这个原型的迭代可以变成一个完整游戏。
开发团队负责这个迭代过程。在整个开发周期中,每个人对游戏的贡献都会直接影响游戏及其成功。
开发团队由几个专业小组松散组成:艺术家(2D/3D 模型师、动画师)、电影制作者、音效设计师、游戏设计师和程序员。
艺术家
他们创建游戏中所有可见的对象,从菜单按钮到游戏关卡中的树木。一些艺术家专注于 3D 模型,而其他人则专注于动画。艺术家使游戏看起来美丽而逼真。艺术家必须学习如何将他们创建的图像/模型导入 UE4,这些图像/模型通常首先使用其他软件(如 3DMax、Maya 和 MODO)创建。他们很可能会使用蓝图来为游戏创建某些自定义行为。
电影制作者
许多电影专家也是受过训练的艺术家。他们拥有独特的视角和创意技能,能够创作短片场景/剪辑场景。UE4 中的 Matinee 工具将是他们大部分时间会使用的工具。
音效设计师
音效设计师具有敏锐的听觉,他们大多数都受过音乐训练。他们在声音实验室中工作,为游戏创建定制的声音/音乐。他们负责将声音文件导入 UE4,以便在游戏中的合适时刻播放。当使用 UE4 时,他们大部分时间会使用声音提示编辑器。
游戏设计师
设计师决定游戏中的发生什么,游戏中发生什么,以及游戏将涉及什么。在规划阶段,大部分时间将花费在讨论、演示和文档上。在生产阶段,他们将监督游戏原型制作过程,以确保游戏关卡按照设计创建。设计师经常花费时间在 Unreal 编辑器中,以自定义和微调关卡。
程序员
他们是研究团队,负责了解团队创建游戏所需的技术和软件。在前期制作阶段,他们负责决定哪些软件程序是必需的,并且能够创建游戏。他们还必须确保所使用的不同软件之间兼容。程序员也会编写代码,使艺术家创建的对象根据设计师的想法变得生动。他们编写游戏的规则和功能。一些程序员也参与创建游戏工具和研究。他们并不直接参与创建游戏,而是支持制作流程。具有极端图形的游戏通常有一支研究团队优化图形,并为游戏创建更逼真的图形。他们大部分时间都在编写代码,可能使用 Visual Studio 用 C++编写代码。他们还能够修改和扩展 UE4 的功能,以满足他们正在开发的游戏的需求。
Unreal Engine 4 的组件
Unreal Engine 是一个帮助您制作游戏的引擎。Unreal Engine 由几个组件组成,它们协同工作以驱动游戏。其庞大的工具和编辑器系统允许您组织您的资产,并操纵它们以创建您游戏的游戏玩法。
Unreal Engine 的组件包括音效引擎、物理引擎、图形引擎、输入和游戏框架,以及在线模块。
音效引擎
音效引擎负责在游戏中添加音乐和声音。它集成到 Unreal 中,允许您播放各种声音文件,以设定氛围并增加游戏的真实感。游戏中声音有许多用途。环境声音始终在背景中。当需要时,声音效果可以重复,或者是一次性的,由游戏中的特定事件触发。
在森林环境中,你可以将鸟鸣、风、树木和树叶沙沙声作为环境声音。这些单独的声音可以组合成森林环境声音,并在游戏角色在森林中时在背景中柔和地持续播放。重复的声音,如脚步声文件,可以连接到行走动作的动画。一次性音效,如城市中特定建筑的爆炸声,可以链接到游戏中的事件触发器。在虚幻中,声音的触发是通过称为声音提示的提示实现的。
物理引擎
在现实世界中,物体遵循物理定律。物体根据牛顿运动定律发生碰撞并被设置成运动状态。物体之间的吸引力也遵循万有引力定律和爱因斯坦的广义相对论。在游戏世界中,为了使物体对现实生活的反应相似,必须通过编程构建相同的系统。虚幻物理引擎利用由 NVIDIA 开发的 PhysX 引擎进行计算,以实现逼真的物理交互,例如碰撞和流体动力学。这种高级物理引擎的存在使我们能够专注于制作游戏,而不是花费时间让物体正确地与游戏世界交互。
图形引擎
为了在屏幕上显示图像,它必须渲染到您的显示监视器(如您的 PC/电视或移动设备)上。图形引擎通过获取有关整个场景的信息(如颜色、纹理、几何形状、单个物体的阴影和光照,以及场景的视点),并考虑影响物体整体颜色、光线、阴影和遮挡的交叉交互因素,负责在您的显示上输出信息。
图形引擎随后在后台使用所有这些信息进行大量计算,然后才能将最终的像素信息输出到屏幕上。图形引擎的强大功能影响场景的真实感。虚幻图形引擎具有输出逼真游戏画面质量的能力。它优化场景和处理大量实时光照计算的能力,使用户能够在游戏中创建逼真的物体。
该引擎可用于创建适用于所有平台(PC、Xbox、PlayStation 和移动设备)的游戏。它支持 DirectX 11/12、OpenGL 和 JavaScript/WebGL 渲染。
输入和游戏框架
Unreal Engine 包含一个输入系统,该系统将玩家按下的键和按钮转换为游戏中角色执行的动作。此输入系统可以通过游戏框架进行配置。游戏框架包含跟踪游戏进度和控制游戏规则的函数。抬头显示(HUDs)和用户界面(UIs)是游戏框架的一部分,用于在游戏过程中向玩家提供反馈。例如,GameMode、GameState和PlayerState等游戏类设置游戏规则并控制游戏状态。游戏中的角色由玩家(使用PlayerController类)或 AI(使用AIController类)控制。无论是由玩家还是 AI 控制,游戏中的角色都是称为Pawn类的基类的一部分。Character类是Pawn类的子集,专门用于垂直方向的玩家表示,例如人类。
在 Unreal Gameplay 框架和控制器就绪的情况下,它允许对玩家的行为进行完全自定义,并具有灵活性,如下面的图所示:

光线和阴影
光是游戏制作中的强大工具。它可以以多种方式使用,例如创造场景的气氛或吸引玩家对游戏中的对象的注意。Unreal Engine 4 提供了一套基本灯光,可以轻松放置到您的游戏关卡中。它们是方向光、点光、聚光灯和天空光。
方向光发射平行光束,点光像灯泡一样发光(从单个点以径向向外向所有方向发射),聚光灯以锥形形状向外发射光线,而天空光模仿天空向下照射关卡中的物体:

光的有效设计也为您的游戏创建了逼真的阴影。通过选择关卡中的灯光类型,您可以影响场景的气氛和渲染时间,这反过来又影响游戏的每秒帧数。在游戏世界中,您有两种类型的阴影:静态和动态。静态阴影可以预先烘焙到场景中,这使得它们渲染速度快。动态阴影在运行时改变,渲染成本更高。我们将在第四章光照和环境控制中了解更多关于光照和阴影的知识。
后处理效果
后处理效果是在场景结束时添加的效果,用于提高场景质量。Unreal Engine 4 提供了非常好的后处理效果选择,您可以将它们添加到您的关卡中,以增强整体场景。
它提供全场景高动态范围渲染(HDRR)。这允许明亮的对象非常明亮,暗淡的对象非常暗淡,但我们仍然能够看到其中的细节。(这是 NVIDIA 进行 HDR 渲染的动机。)
UE4 后处理效果包括使用时间抗锯齿(TXAA)的抗锯齿、泛光、色彩分级、景深、眼睛适应、镜头光晕、后处理材质、场景边缘、屏幕空间反射和晕影。尽管游戏通常在设计时考虑后处理效果,但用户通常可以选择关闭它们,如果需要的话。这是因为它们通常需要消耗相当数量的额外资源,以换取更好的视觉效果。
人工智能
如果你完全不了解人工智能(AI)的概念,它可以被认为是人类创造来模拟现实生活的智能。人类创造了人工智能,给对象一个大脑,使其能够思考并自主做出决策。
从根本上讲,人工智能由复杂的规则集组成,帮助对象做出决策并执行其设计功能/行为。在游戏中,NPC 被赋予某种形式的人工智能,以便玩家可以与之互动。例如,赋予 NPC 寻找攻击甜点的能力。如果受到攻击,他们会逃跑、躲藏,并找到一个更好的位置进行反击。
Unreal Engine 4 提供了良好的基本人工智能,为你自定义和改进游戏中 NPC 的人工智能奠定了基础。关于在 Unreal Engine 中如何设计人工智能的更多细节将在第五章动画和人工智能中讨论。
线上和跨平台功能
Unreal Engine 4 提供了为许多平台创建游戏的能力。如果你使用 Unreal Engine 4 创建游戏,它可以移植到不同的平台,如 Web、iOS、Linux、Windows 和 Android。此外,通用 Windows 平台(UWP)也将很快被添加。它还有一个在线子系统,为游戏提供集成 Xbox Live、Facebook、Steam 等功能的能力。
Unreal Engine 和其强大的编辑器
在了解了 Unreal Engine 的不同组件之后,现在是时候学习更多关于各种编辑器以及它们如何赋予我们创建游戏的实际功能了。
Unreal Editor
Unreal Engine 拥有多个编辑器,有助于游戏的创建。默认情况下,Unreal Editor 是 Unreal Engine 的启动编辑器。它可以被认为是允许访问其他子系统(如材质和蓝图子系统)的主要编辑器。
Unreal Editor 提供了一个由视口和窗口组成的可视化界面,使你能够导入、组织、编辑并向你的游戏资产添加行为/交互。其他子编辑器/子系统具有非常专业的功能,允许你控制资产(外观和行为)的细节。
虚幻编辑器,连同所有子系统,是设计师的一个伟大工具。它允许物理放置资产,并使用户能够在不修改代码的情况下控制游戏变量。
材质编辑器
着色器和材质赋予物体独特的颜色和纹理。虚幻引擎 4 利用基于物理的着色。这个新的材质管道让艺术家能够更好地控制物体的外观和感觉。基于物理的着色具有更详细的光与表面的关系。这种理论将两个物理属性(微观表面细节和反射率)绑定在一起,以实现物体的最终外观。
在过去,许多最终外观是通过调整着色器/材质算法中的值来实现的。在虚幻引擎 4 中,我们现在可以通过调整光和着色算法的值来达到高质量的内容,这会产生更一致和可预测的结果。关于着色器和材质的更多细节将在第四章中提供,光照和环境控制。以下截图显示了 UE4 中的材质编辑器:

瀑布粒子系统
瀑布粒子系统提供了广泛的能力来设计和创建粒子效果。通过设计每个粒子的尺寸、颜色和纹理以及这些粒子群如何相互交互来模拟真实粒子效果行为,可以创建诸如烟雾、火花和火焰等效果。以下截图显示了 UE4 中的瀑布粒子系统:

人物骨骼网格动画
人物动画系统允许您设计和控制角色的骨骼、骨骼网格和插座的动画。此工具可用于预览角色的动画并设置关键帧之间的混合动画。还可以通过物理资产工具(PhAT)调整物理和碰撞属性。以下截图显示了 UE4 中的人物动画系统:

地形 - 构建大型户外世界和植被
要使用编辑器创建大型户外空间,虚幻引擎通过地形系统提供雕刻和绘画工具,以帮助我们。一个高效的细节级别(LOD)系统和内存利用率允许大规模地形塑造。还有一个植被编辑器,可以将草地、雪和沙子应用到户外环境中。
声音提示编辑器
声音和音乐的控制是通过声音提示编辑器完成的。声音和音乐通过称为声音提示的提示触发播放。可以使用此编辑器实现开始/停止/重复/淡入或淡出的功能。以下截图显示了 UE4 中的声音提示编辑器:

Matinee 编辑器
Matinee 编辑器工具集允许创建游戏过场场景和电影。这些创建的短剪辑可以用来介绍游戏关卡开始,在游戏开始前讲故事,甚至作为游戏的宣传视频。以下截图显示了 UE4 中的 Matinee 编辑器:

蓝图可视化脚本系统
蓝图系统是 Unreal Engine 中的一个新特性。Unreal Engine 4 是第一个使用这一革命性系统的引擎。对于那些熟悉 Unreal Engine 3 的人来说,它可以被视为 Unreal 脚本系统、Kismet 和 Prefab 功能的增强和改进的合并版本。蓝图可视化脚本系统允许您使用可视化脚本语言(由线条连接的类似框的流程图)扩展代码功能。这种能力意味着您不需要编写或编译代码,就可以创建、排列和自定义游戏对象的行为/交互。这也为非程序员(艺术家/设计师)提供了快速原型设计或创建关卡以及操作游戏玩法的能力,而无需应对游戏编程的挑战。蓝图的一个酷特性是,您可以通过点击对象并选择 创建变量 来创建变量,就像在编程中一样。这为开发者打开了在不进行复杂编码的情况下可以做的事情。
为了帮助开发者调试蓝图脚本逻辑,您可以在执行过程中可视地看到事件序列和属性值。类似于编码中的故障排除,您还可以设置断点来暂停蓝图序列。以下截图显示了 UE4 中的关卡蓝图编辑器:

Unreal 编程
访问 Unreal Engine 的源代码使用户能够自由地创建几乎任何他们能想到的东西。基础代码的功能可以被扩展和定制,以满足游戏所需的各种功能。从内部学习 Unreal Engine 的工作原理可以解锁其在游戏创作中的全部潜力。
Unreal Engine 也为编程人员集成了非常实用的调试功能。其中之一就是 热重载 功能。这个工具使得 C++ 代码的更改能够立即反映在游戏中。为了方便快速更改代码,Unreal Engine 还包括了 代码视图。通过在 代码视图 类别中点击一个对象的功能,它将直接显示在 Visual Studio 中与该对象相关的代码,您可以在那里对代码进行更改。
对于包含代码更改的游戏项目,可以设置版本控制和源代码管理。
Unreal 对象
实体是虚幻中所有游戏对象的基础类。为了使实体具有更多的属性和功能,实体类被扩展到各种更复杂的类。在编程方面,实体类充当容器类,用于包含称为组件的专用对象。组件功能的组合赋予了实体其独特的属性。
虚幻编辑器入门指南
这是对我们如何使用虚幻编辑器的一个快速概述。我们将简要介绍如何使用编辑器中的各种窗口来创建游戏。
开始菜单
当启动虚幻引擎时,您将默认首先进入一个菜单窗口。这个新的开始菜单简单易导航。它有一个大标签页,允许您选择要启动的游戏引擎版本,并清楚地显示了您创建的项目。它还提供了对市场(Marketplace)的访问,这是一个由他人创建的游戏样本库,您可以下载(有些免费,有些付费)。菜单还提供了来自 Epic 的最新更新和新闻,以确保开发者能够了解最新的开发和变化。以下截图显示了开始菜单:

项目浏览器
启动所需版本的虚幻引擎后,虚幻项目浏览器会弹出。此浏览器为您提供创建预定制游戏级别的选项。这意味着您有一系列通用级别,您可以从这些级别开始构建您的游戏级别。对于那些对游戏制作新手来说,这个功能允许您快速直接进入构建各种类型的游戏。您可以直接在蓝图或C++作为基础模板的情况下,创建第一人称射击级别和第三人称游戏设置,或者 2D/3D 横版滚动平台级别。新建项目标签页的酷之处在于,它还允许您选择目标设备(PC/移动),目标图像质量,以及是否将虚幻内容包含在启动项目中。以下截图显示了项目浏览器:

内容浏览器
当虚幻编辑器启动时,会出现各种窗口和面板的默认布局。其中之一是内容浏览器。内容浏览器是一个窗口,您可以在这里找到您拥有的所有内容(游戏资产)。它将您的资产分类到不同的文件夹中,例如音频、材质、动画、粒子效果等。此窗口还具有导入按钮,允许您将使用其他软件创建的游戏资产导入到游戏中。以下截图显示了内容浏览器的默认位置(用绿色突出显示):

工具栏
工具栏是一个可定制的功能区,提供对工具和编辑器的快速访问。默认布局包括对蓝图和 Matinee 编辑器的快速访问。快速播放和启动游戏功能也是标准功能区布局的一部分。这些按钮允许你快速查看游戏中的创作。以下截图显示了默认的工具栏:

视口
视口是通往游戏世界之窗,所以你看到的就是游戏中的内容。如果你使用“新建项目”菜单中提供的选项之一创建了一个关卡,你会注意到摄像机已经根据该预定制关卡的设置进行了调整。这就是你将用于放置对象并移动它们的窗口。当你点击工具栏中的播放按钮时,这个视口窗口就会活跃起来,允许你与游戏关卡进行交互。以下截图显示了在编辑器中高亮的视口窗口:

场景大纲
场景大纲包含场景中放置的对象列表。它只包含当前场景中加载的内容。你可以创建文件夹并为对象命名(以帮助你轻松识别对象)。它也是一个快速分组项目的方法,这样你可以选择它们并批量进行更改。以下截图显示了在编辑器中高亮的场景大纲:

模式
模式窗口赋予你创建和将对象放置到游戏世界中的能力。你可以选择你希望执行的活动类型。从放置、绘制、景观、植被和几何编辑中选择。放置是将对象放入游戏世界。绘制允许你绘制对象的顶点和纹理。景观和植被是制作大规模自然地形的有用工具。几何编辑提供了修改和编辑对象的工具。以下截图中的高亮区域显示了模式窗口:

摘要
在本章中,我们介绍了关于游戏引擎的基础内容,特别是虚幻引擎 4 及其历史。我们还简要讨论了游戏开发的过程以及游戏公司中存在的各种角色,这些角色有助于创建游戏的不同组件。然后,我们介绍了虚幻引擎的不同组件以及我们如何使用这些不同的功能来帮助我们制作游戏。最后,我们介绍了可用于帮助我们自定义游戏各个组件的不同编辑器。
在接下来的章节中,我们将深入了解虚幻引擎 4 的功能和特性。在下一章中,你将接触到虚幻编辑器的一些基本功能,并开始制作自己的游戏关卡。
第二章:创建你的第一个关卡
在本章中,你将在逐步说明的帮助下创建和运行一个简单的关卡。由于本书的目的是让你掌握使用 Unreal Engine 4 自信地创建自己的游戏技能,而不是简单地遵循一系列步骤来创建一个固定的示例,因此我将尽可能提供额外的信息,这些信息可以帮助你在学习基本技术的同时创建自己的游戏关卡。
在本章中,我们将介绍以下主题:
-
如何控制视图和视口
-
如何在关卡中移动、缩放和旋转对象
-
如何使用 BSP 盒子刷的添加模式创建地面和墙壁
-
如何使用 BSP 盒子刷的减去模式在墙上挖洞
-
如何向关卡中添加简单的方向光以模拟阳光
-
如何使用玩家开始在地图上生成面向正确方向的玩家
-
如何使用大气雾在你的地图中创建天空
-
如何保存你创建的地图并将其设置为项目的默认加载地图
-
如何将材质添加到你创建的几何体上,使其看起来更真实
-
如何复制 BSP 刷子以快速创建事物
-
如何将道具(也称为静态网格)添加到房间中
-
如何使用光子重要性体积将光线集中在地图的重要部分
探索预配置关卡
在我们创建关卡之前,了解 Unreal Engine 4 中的关卡外观是很有帮助的。Unreal Engine 4 提供了加载各种类型游戏关卡的可能性,包括一个默认的可玩关卡,该关卡直接来自项目浏览器菜单选项(在启动 Unreal 编辑器后立即弹出)。我个人非常喜欢 Unreal Engine 4 的这个新特性,因为它让我能快速了解可用的预设类型,并且我可以轻松选择一个作为我想要创建的游戏关卡的基础。
我们将使用预设项目类型之一作为基础,创建一个新的地图,作为我们第一个关卡。
小贴士
如何快速探索不同的项目类型
通常,在项目加载默认关卡后,我会点击工具栏上的播放按钮。播放功能允许你进入游戏,你可以看到在关卡中预先为你创建的内容。
创建新项目
在本章中,我们将使用蓝图第一人称模板来创建我们的第一个游戏项目。
创建新的蓝图第一人称项目的步骤如下:
-
启动 Unreal Engine 4。
-
选择新建项目选项卡。
-
选择蓝图然后第一人称。
-
选择项目的名称和路径(或保留默认的
MyProject)。 -
点击创建项目。
确保已选中包含启动内容选项。
![创建新项目]()
在创建项目时,蓝图第一人称的默认示例级别将加载。以下截图显示了默认级别的样子:

使用带有示例级别的预设项目类型,您可能首先想要运行级别并查看默认游戏级别包含的内容。
视口导航
使用加载的示例级别,您应该熟悉鼠标和键盘控制以便在视口中导航。您可能需要将此部分添加到书签中,直到您可以轻松地缩放或从所有角度查看任何对象。
视图
这里有一些关于 3D 建模创建中不同视图的快速信息:示例地图默认加载在 透视 视图中。除了在 透视 视图中显示地图外,您还可以分别更改在顶部、侧面或前视图中的视图内容。切换到这些视图之一的选项位于视口的左上角。以下截图显示了要按下的按钮位置,以便您切换视图:

如果您想同时看到多个视图,请导航到 Windows | 视口 并选择任何视口(默认视口使用 视口 1)。
选定的视口编号将弹出。您可以拖动并停靠此 视口 窗口并将其添加到默认的 视口 1。以下截图显示了同时显示 视口 1 和 视口 2 的样子(一个在 透视 视图中,另一个在 顶 视图中):

控制键
这里有一些按键可以帮助您移动和查看对象:
在 透视 视图中:
| 快捷操作 | 描述 |
|---|---|
| 左键点击 + 拖动 | 这将使摄像机前后移动并从左向右旋转 |
| 右键点击 + 拖动 | 这将旋转视口摄像机 |
| 左键点击 + 右键点击 + 拖动 | 这将使物体上下移动 |
在 正交 (顶、前 和 侧) 视图中:
| 快捷键 | 描述 |
|---|---|
| 左键点击 + 拖动 | 这将创建一个选择框 |
| 右键点击 + 拖动 | 这将平移视口摄像机 |
| 左键点击 + 右键点击 + 拖动 | 这将缩放视口摄像机 |
对于熟悉游戏的您,您也可以在编辑器中使用 WASD 来导航摄像机。
透视 视图中的 WASD 控制:
| 快捷操作 | 描述 |
|---|---|
| 任意鼠标点击 + W | 这将使摄像机向前移动 |
| 任意鼠标点击 + A | 这将使摄像机向左移动 |
| 任意鼠标点击 + S | 这将使摄像机向后移动 |
| 任意鼠标点击 + D | 这将使摄像机向右移动 |
在选择对象时:
| 快捷操作 | 描述 |
|---|---|
| W | 这将显示 平移 工具 |
| E | 这将显示 旋转 工具 |
| R | 这显示的是缩放工具 |
| F | 这将相机聚焦到选定的对象上 |
| Alt + Shift + 沿着 x/y/z 轴拖动 | 这会复制一个对象并将其沿 x/y/z 轴移动 |
从新空白地图创建关卡
现在你已经熟悉了控制方式,你可以自己创建地图了。在本章中,我们将介绍如何从头开始构建一个基本房间。要为你的第一人称游戏创建一个新的地图,请转到文件 | 新建关卡…。以下截图显示了如何创建一个新的关卡:

创建新关卡时有两个选项:默认和空关卡。选择空关卡以创建一个完全空白的地图。以下截图显示了创建新关卡时可以使用的选项:

当视图中没有内容时,请不要感到惊讶。在接下来的几节中,我们将向关卡中添加对象。以下截图显示了在透视视图中空关卡的样子:

使用 BSP Box 刷子创建地面
BSP Box 刷子可以用来在地图中创建矩形对象。创建关卡的第一件事就是有一个可以站立的地面。
在我们开始之前,请确保视图中是透视视图。除非明确指定,否则我们将主要使用这个视图来创建大多数关卡。
前往模式窗口,点击BSP,然后点击并拖动Box到视图中。这就是你可以找到 Box 刷子的地方:

在这里,一个 Box 刷子已经被成功添加到视图中:

你现在已经在关卡中成功创建了第一个对象。接下来,我们将改变这个盒子的尺寸,使其成为一个合适的尺寸,以便它可以作为关卡的地面。
选择刚刚创建的盒子,转到细节 | 刷子设置。为X、Y和Z填写以下值。以下截图显示了需要设置的值:

当你正确设置了值后,盒子应该看起来像这样:

有用提示 - 轻松选择对象
为了帮助您更容易地在级别中选择对象,您可以转到世界大纲(其默认位置位于编辑器的右上角),您将看到级别中所有对象的完整列表。点击对象的名称以选择它,其详细信息也将显示出来。这是一种非常有用的方式,可以帮助您在级别中有许多对象时选择对象。以下截图显示了如何使用世界大纲在级别中选择 Box 刷子(我们刚刚创建的):

有用提示 - 更改视图模式以辅助视觉效果
如果你难以看到盒子,你可以将视图模式更改为未照明(按钮位于与透视按钮相邻的视图中)。以下截图显示了如何将视图模式更改为未照明:

向级别添加灯光
为了帮助我们更好地看到级别,现在是时候学习如何照亮级别了。为了模仿来自太阳的环境光,我们将为级别使用方向光。
与添加 BSP Box 刷子的方式相同,我们将转到模式窗口 | 灯光 | 方向光。点击并拖动方向光到视口窗口中。以下截图放大了模式窗口,显示方向光项可以通过拖动到视图中来创建:

目前,让我们将灯光放置在 BSP Box 刷子略微上方,如图下所示:

有用提示 - 在级别中定位对象
要在级别中定位对象,我们使用变换工具在 x、y 和 z 方向上移动对象。选择对象并按W键显示变换工具。将出现三个箭头,从对象中伸出。点击并按住红色箭头以沿x轴移动对象,绿色箭头以沿y轴移动它,蓝色箭头以沿z轴移动它。
为了帮助您更准确地定位对象,您也可以在移动对象时切换到顶视图,以在 x 和 y 方向上移动对象,侧视图用于 y 和 z 方向的调整,以及前视图以调整 x 和 z 方向。
对于那些想要精确位置控制的人来说,你可以使用细节。选择要显示详细信息的对象。转到变换 | 位置。通过点击位置旁边的箭头,你可以选择相对或世界位置。更改X、Y和Z值以更精确地移动对象。
向级别添加天空
在为关卡添加光照之后,我们将继续添加天空到关卡中。点击模式 | 视觉 | 大气雾。以添加光照和添加 Box BSP 相似的方式,点击、按住并拖动它到视图中。我们几乎准备好查看我们刚刚创建的内容了。请耐心等待。

添加玩家起始点
对于每个游戏,您需要设置玩家将出生的位置。转到模式 | 基本 | 玩家起始点。点击、按住并拖动玩家起始点到视图中。
这张截图显示了带有玩家起始点的模式窗口:

将玩家起始点放置在地面中心或略高于地面,如图所示:

通过按Esc键取消选择Player Start。从Player Start发出的浅蓝色箭头指示玩家开始游戏时将出生的方向。要调整玩家出生时面对的方向,旋转Player Start直到浅蓝色箭头指向这个方向。查看以下关于如何旋转对象的提示。
有用的提示 – 在关卡中旋转对象
要在关卡中旋转对象,我们使用旋转工具围绕 x(行)、y(俯仰)和 z(偏航)方向旋转对象。选择对象并按E键以显示旋转工具。将出现三条带有方框尖端的线从对象中延伸出来。点击并按住红色箭头以围绕x轴旋转对象,绿色箭头以围绕y轴旋转对象,蓝色箭头以围绕z轴旋转对象。
另一种更精确地旋转对象的方法是通过控制在详细信息下找到的实际旋转值。 (选择要旋转的对象以显示其详细信息)。在变换选项卡中,转到旋转,并将X、Y和Z值设置为旋转对象。旋转旁边有一个箭头,您可以点击以选择是否要调整相对或世界的旋转值。当您选择使用相对设置旋转对象时,对象将相对于其当前位置旋转。当对象使用世界设置旋转时,它将相对于世界的位置。
如果您想让玩家控制器(如前一张截图所示)的浅蓝色箭头朝内并远离您,您需要将玩家控制器绕y轴旋转 180 度。在相对设置下输入Y为180。玩家控制器将以本截图所示的方式旋转:

查看已创建的关卡
现在,我们已经准备好查看我们刚刚创建的简单关卡。
在查看关卡之前,点击以下截图所示的构建按钮,以构建此关卡所需的光、材质等。这一步确保光线在关卡中正确渲染。

在构建完关卡后,点击此截图所示的播放按钮,以查看关卡:

以下截图显示了关卡的外观。上下左右移动鼠标以查看关卡。使用W、A、S和D在关卡中移动角色。要返回编辑器,请按ESC。

保存关卡
导航到文件 | 另存为…,并给您刚刚创建的地图起一个名字。在我们的例子中,我已经将其保存为Chapter2Level,在…/UnrealProjects/MyProject/Content/Maps路径下,其中MyProject是项目的名称。
将地图配置为起始关卡
保存您的新地图后,您可能还想将此项目设置为默认加载此地图。您可以为此项目链接多个地图,并在游戏中的特定点加载它们。目前,我们想用我们新创建的地图替换当前的Example_Map。为此,请转到编辑 | 项目设置。这会打开一个包含项目可配置值的页面。转到游戏 | 地图与模式。参考以下截图,看看如何选择地图与模式。
在默认地图下,更改您刚刚保存的地图中的游戏默认地图和编辑器默认地图。在我的情况下,它将是Chapter2Level。然后,关闭项目设置。当您下次启动编辑器和运行游戏时,您的新的地图将默认加载。

向地面添加材质
现在我们已经创建了地面,让我们通过应用材质使地面看起来更逼真。
转到内容浏览器 | 内容 | 起始内容 | 材质。在过滤器框中输入wood。以下截图显示了我们要用于地面材质的核桃抛光材质:

点击、按住并拖动M_Wood_Floor_Walnut_Polished到视口区域,并将其放置在地面的顶部表面。产生的效果应该看起来像这样:

添加墙壁
现在我们已经准备好添加墙壁以防止玩家从地图上掉落。为了创建墙壁,我们将使用相同的 BSP Box 刷来创建墙壁。由于我们在上一步中添加了材质,您需要通过在内容浏览器中点击任何东西来清除此材质选择。这将防止使用相同材质创建新的几何形状。
与创建地面类似,转到模式 | BSP | 盒子。点击、按住并拖动到视图中。设置 BSP 盒子的尺寸为 X = 30,Y = 620,Z = 280。为了帮助我们查看和定位墙壁,使用控制来旋转视图。你也可以使用不同的视图来帮助将墙壁定位到地面上。在这里,你可以看到墙壁应该如何定位(注意,我已经将相机平移以从不同的角度查看级别):

复制墙壁
现在首先选择在前面步骤中创建的墙壁,以复制墙壁。确保变换工具是显示的(如果不是,当对象被选中时按 W 键一次)。
按住 Alt + Shift 键的同时,点击并拖动一个坐标轴(例如前一个示例中的 x 轴),你会注意到在这个方向上还有一个墙壁的副本在移动。当墙壁处于正确的位置时,释放按键。使用正常的平移控制来将墙壁定位到如下所示的位置:

为门创建开口
房间现在几乎完成了。我们将学习如何雕刻 BSP 盒子刷子以创建门的开口。
将一个新的 BSP 盒子刷子拖放到地图中:X = 370,Y = 30,Z = 280。将这个墙壁定位到如下截图所示的位置,以封闭房间的一侧:

到目前为止,我们一直在使用加法模式(选择已选中的单选按钮)来创建 BSP 盒子刷子。为了在墙上创建一个开口,我们将使用减法模式创建另一个 BSP 盒子刷子。确保你已经按照以下截图所示选择了它。以前面的方式将 BSP 盒子刷子拖放到视图中。至于这个刷子的尺寸,我们将将其近似到门的尺寸,其中 X = 115,Y = 30,Z = 212。

当减法BSP 盒子刷子放置正确时,它看起来会像这样:

为了帮助你定位减法BSP 盒子刷子,你可以切换到前视图以将门放置在中心附近。以下截图显示了前视图和选中的减法BSP 盒子刷子:

添加材质到墙壁
为了使地面看起来更逼真,我们将给它应用一种材质。转到内容浏览器 | 内容 | 起始内容 | 材质。在过滤器框中输入Wall。选择M_Basic_Wall并将其拖放到带有门的墙壁表面上。然后,我们将使用不同的材质。在过滤器框中输入Brick。选择M_Brick_Clay_New并将其应用到另外两面墙壁的内表面。
在这里,你可以看看在应用之前提到的材质后,关卡在未照明模式下的样子:

在再次运行关卡之前建立灯光,以查看关卡现在的样子。
封闭房间
现在,让我们复制带有门的墙来封闭房间。单击墙,按住Alt + Shift,并将其拖到房间的另一侧。以下屏幕截图显示了房间封闭后的样子:

将道具或静态网格添加到房间中
现在让我们向空房间添加一些物体。转到内容浏览器 | 内容 | 起始内容 | 道具。找到SM_Lamp_Ceiling并将其拖放到房间中。

由于我们想要使用天花板灯道具作为地板灯,你需要通过围绕x轴旋转 180 度来旋转灯。使用相对模式将 X 设置为 180 度。以下屏幕截图显示了旋转后的灯位于房间一端的位置。注意,我已经建立了灯光并更改了视图模式为照明模式。你可以随意放置灯,看看它看起来如何。

添加光质量重要性体积
由于我们的房间在地图上只占据一小部分,我们可以通过在地图中添加一个名为光质量重要性体积的项目来集中光线在一个小区域内。光质量重要性体积的边界框告诉引擎在地图中需要光的地方,因此它应该包括地图上所有物体的整个区域。将光质量重要性体积拖放到地图中。在这里,你可以看到如何找到光质量重要性体积:

默认情况下,放置的线框盒(即光质量重要性体积)是一个立方体。你需要将其缩放以适应你的房间。选择光质量重要性体积后,按R键显示缩放工具。使用x、y和z轴调整盒子的大小,直到它适合关卡。以下屏幕截图显示了使用缩放工具缩放盒子:

在将盒子缩放并平移以适应关卡后,光质量重要性体积应该看起来像以下屏幕截图所示,其中线框盒足够大,可以容纳房间内部。光质量重要性体积的线框大小可以大于地图。

为房间添加完成细节
我们的房间几乎完成了。你可能会注意到门现在只是墙上的一个洞。为了使其看起来像门,我们需要添加门框和门,如下所示:
-
前往内容浏览器 | 内容 | StarterContent | Props。
-
点击并放下SM_DoorFrame到视口中。
-
调整它以适应墙壁。
完成后,它应该看起来像以下截图所示。
我已经使用了不同的视角,如顶部、侧面和正面,来调整框架,使其完美地适应门。你可以调整Snap Sizes进行微调。

实用技巧 - 使用拖动捕捉网格
为了帮助你更准确地移动对象到位置,你可以使用视口顶部的捕捉网格按钮,如下截图所示。开启拖动捕捉网格允许你根据所选的网格大小移动对象。点击网格状的符号来切换捕捉网格的开启/关闭。右侧显示的数字是对象移动时的最小网格大小。

我还注意到地板的一部分还没有上纹理。使用你之前使用的相同木纹纹理,确保地面使用M_Wood_Floor_Walnut_Polished完全上纹理。
然后,点击并拖动SM_Door到视口中。以与之前相同的方式旋转门,使其适应门框。在这里,你可以看到门已经就位:

摘要
我们已经学习了如何在新的项目中导航视口并设置/保存新地图。我们还使用 BSP Box 刷子创建了第一个带有门的房间,为墙壁和地板添加了材质,并学会了放置静态对象以增强房间的外观。尽管现在它仍然有点空旷,我们将在接下来的几章中继续对其进行工作,并扩展这个地图。在下一章中,我们将通过添加一些可以与之交互的对象来为关卡增添活力。
第三章. 游戏对象 – 更多和移动
我们在第二章 创建你的第一个关卡中在虚幻编辑器中创建了我们的第一个房间。在本章中,我们将介绍一些关于我们用于在第二章 创建你的第一个关卡中原型化关卡的结构的信息。这是为了确保你在继续前进之前对一些重要核心概念有坚实的基础。然后,我们将逐步介绍各种概念,使对象在玩家的交互下移动。
在本章中,我们将涵盖以下主题:
-
BSP 刷子
-
静态网格
-
纹理和材质
-
碰撞
-
体积
-
蓝图
BSP 刷子
我们在第二章 创建你的第一个关卡中广泛使用了 BSP 盒刷来创建地面和墙壁。
BSP 刷子是游戏开发中关卡创建的主要构建块。它们被用来快速原型化关卡,就像我们在第二章 创建你的第一个关卡中使用的那样。
在虚幻引擎中,BSP 刷子以原语(盒子、球体等)和预定义/自定义形状的形式出现。
背景
BSP 代表二叉空间划分。BSP 树的结构允许快速访问空间信息以进行渲染,尤其是在由多边形组成的 3D 场景中。场景递归地分为两个部分,直到 BSP 树的每个节点只包含可以任意顺序渲染的多边形。场景通过从给定节点(视点)向下遍历 BSP 树来渲染。
由于场景是使用 BSP 原则划分的,因此在关卡中放置对象可以看作是在场景的 BSP 分区中进行切割。几何刷子使用构造实体几何(CSG)技术来创建多边形表面。CSG 通过使用布尔运算符(如并集、减法和交集)组合简单的原语/自定义形状,以在关卡中创建复杂形状。
因此,CSG 技术用于创建关卡中对象的表面,而渲染关卡则是基于使用 BSP 树对这些表面进行处理。这种关系导致几何刷子也被称为 BSP 刷子,但更准确地说,是 CSG 表面。
刷子类型
BSP 刷子可以是加法或减法性质。加法刷子就像填充空间的体积。在第二章 创建你的第一个关卡中,我们使用了加法刷子来制作地图的地面和墙壁。
减法刷子可以用来形成空心空间。这些在第二章 创建你的第一个关卡中用来在墙上开洞放置门及其框架。
刷子坚固性
对于加法刷子,它可能处于以下各种状态:实心、半实心或非实心。
由于减法笔刷创建空隙,玩家可以在其中自由移动。减法笔刷只能是实体笔刷。
请参考以下表格比较它们的属性:
| 笔刷实体性 | 笔刷类型 | 阻挡程度 | BSP 切割 |
|---|---|---|---|
| 实体 | 添加和减去 | 阻挡玩家和弹体 | 对周围世界几何体造成 BSP 切割 |
| 半实体 | 仅添加 | 阻挡玩家和弹体 | 不会对周围世界几何体造成 BSP 切割 |
| 非实体 | 仅添加 | 不阻挡玩家或弹体 | 不会对周围世界几何体造成 BSP 切割 |
静态网格
静态网格是由多边形组成的几何形状。更微观地看,一个网格是由连接顶点的线条组成的。
静态网格的顶点不能被动画化。这意味着你不能对网格的一部分进行动画处理,并使该部分相对于自身移动。但整个网格可以被平移、旋转和缩放。我们在第二章“创建您的第一个关卡”中添加的灯和门就是静态网格的例子。
与低分辨率网格相比,高分辨率网格具有更多的多边形。这也意味着高分辨率网格具有更多的顶点。高分辨率网格需要更多的时间来渲染,但能够提供更多的细节。
静态网格通常首先在外部软件程序中创建,例如 Maya 或 3ds Max,然后导入 Unreal 以放置在游戏地图中。
我们在第二章“创建您的第一个关卡”中添加的门、其框架和灯都是静态网格。请注意,这些对象不是简单的几何形状。
BSP 笔刷与静态网格
在游戏开发中,游戏中的许多对象都是静态网格。为什么是这样呢?静态网格被认为更高效,特别是对于具有许多顶点的复杂对象,因为它们可以被缓存到视频内存中,并由计算机的显卡绘制。因此,在创建对象时,静态网格更受欢迎,因为它们具有更好的渲染性能,即使是复杂对象也是如此。然而,这并不意味着 BSP 笔刷在创建游戏时没有作用。
当 BSP 刷子简单时,它仍然可以用来而不会对性能造成太大的影响。BSP 刷子可以在 Unreal 编辑器中轻松创建,因此它对于游戏/关卡设计师的快速原型设计非常有用。简单的 BSP 刷子可以在建模艺术家正在创建实际的静态网格时作为临时占位符对象创建和使用。创建静态网格需要时间,对于高度详细的静态网格来说更是如此。我们将在本章后面简要介绍静态网格创建流程,以便我们了解将静态网格放入游戏所需完成的工作量。因此,BSP 刷子非常适合在没有等待所有静态网格创建的情况下进行早期游戏测试。
使静态网格可移动
让我们打开我们在第二章,创建您的第一个关卡中创建的已保存地图,并首先将其保存为新的Chapter3Level。
-
进入内容浏览器 | 内容 | 启动内容 | 道具,搜索SM_Chair,这是一个标准的静态网格道具。点击并拖动它到我们的地图中。
-
现在关卡中的椅子是不可移动的。您可以快速构建和运行关卡来检查它。要使其可移动,我们需要在椅子的详细信息下更改一些设置。
-
首先,确保SM_Chair被选中,转到详细信息选项卡。转到变换 | 移动性,将其从静态更改为可移动。看看以下截图,它描述了如何使椅子可移动:
![使静态网格可移动]()
-
接下来,我们想让椅子能够响应我们。在详细信息选项卡中向下滚动一点,更改椅子的物理设置。转到详细信息 | 物理。确保模拟物理复选框被勾选。当此复选框被勾选时,自动链接设置将碰撞设置为物理 Actor。以下截图显示了椅子的物理设置:
![使静态网格可移动]()
让我们现在构建并玩这个关卡。当你走进椅子时,你将能够推动它。只是要注意,椅子仍然被称为静态网格,但现在它是可移动的。
材质
在第二章,创建您的第一个关卡中,我们选择了一款核桃抛光材质并将其应用于地面。这改变了简单暗淡的地面,变成了棕色抛光木地板。使用材质,我们能够改变物体的外观和感觉。
这里对材质的简要介绍是因为这是一个在我们能够构建静态网格之前需要了解的概念。我们已经知道在游戏中我们需要静态网格,我们不能仅仅依赖于默认地图包中有限的选项。我们需要知道如何创建自己的静态网格,并且我们高度依赖于材质来赋予静态网格外观和感觉。
因此,在创建自定义静态网格时,我们何时应用材质?材质是在编辑器外部的创建过程中应用于静态网格的,我们将在本章后面的部分进行介绍。现在,让我们首先学习如何在编辑器中构建材质。
在 Unreal 中创建材质
为了完全理解材质的概念,我们需要将其分解为其基本组成部分。一个表面的外观是由许多因素决定的,包括颜色、图案/图案/设计的存在、反射性、透明度等等。这些因素结合在一起赋予表面其独特的样子。
在 Unreal Engine 中,我们可以通过使用材质编辑器来创建我们自己的材质。根据前面的解释,材质是由许多因素决定的,所有这些因素结合在一起赋予材质其独特的外观和感觉。
Unreal Engine 提供了一个基础材质节点,它包含一系列可定制的因素,我们可以利用这些因素来设计我们的材质。通过为不同的因素赋予不同的值,我们可以创造出我们自己的材质。让我们来看看我们在第二章中使用的材质背后是什么,创建你的第一个关卡。
打开内容浏览器 | 内容 | 入门内容 | 材质,双击M_Brick_Clay_New。这会打开材质编辑器。以下截图显示了砖泥材质的基础材质节点的放大版本。你可能注意到基础颜色、粗糙度、法线和环境遮蔽都有输入到基础M_Brick_Clay_New材质节点中。这些输入使砖墙看起来像砖墙。

这些节点的输入可以来自各种来源。以基础颜色为例,我们可以使用 RGB 值定义颜色,或者从纹理输入中获取颜色。纹理是以.bmp、.jpg、.png等格式存在的图像,我们可以使用 Photoshop 或 ZBrush 等工具创建它们。
我们将在本书稍后更详细地讨论材质的构建。现在,让我们记住,材质应用于表面,纹理是我们可以用作组合来赋予材质整体视觉外观的东西。
材质与纹理的比较
注意到我在上一节中同时使用了材料和纹理。这对于游戏开发的新手来说常常会引起相当多的困惑。材料是我们应用到表面上的东西,它们由不同纹理的组合构成。材料根据指定的属性从纹理中获取属性,包括颜色、透明度等等。
如前所述,纹理是简单的图像,格式如.tga、.bmp、.jpg、.png等。
纹理/UV 映射
现在,我们了解到自定义材料是由纹理和材料的组合构成的,材料被应用到表面上,以赋予多边形网格其身份和真实感。下一个问题是,我们如何将这些与材料一起提供的众多纹理应用到表面上?我们只是简单地将其粘贴到 3D 对象上吗?我们必须有一种可预测的方式来将这些纹理绘制到表面上。所使用的方法被称为纹理映射,它由 Edwin Catmull 在 1974 年首创。
纹理映射将纹理图像的像素分配到多边形表面的一个点上。这个纹理图像被称为UV 纹理图。我们使用 UV 作为 XY 坐标的替代品的原因是因为我们已经在使用 XY 来描述对象的几何空间。因此,UV 坐标是纹理的 XY 坐标,它仅用于确定如何绘制 3D 表面。
如何创建和使用纹理图
我们首先需要将网格在其接缝处展开,并在 2D 中平铺。然后在这个 2D 表面上绘制以创建纹理。这个绘制的纹理(也称为纹理图)然后通过为网格的每个面分配纹理的 UV 坐标将其包裹回网格。为了更好地帮助您可视化,请查看以下插图:

来源:维基百科 (en.wikipedia.org/wiki/UV_mapping)
因此,共享的顶点可以分配多个 UV 坐标集。
多纹理
为了在表面上获得更好的外观,我们可以使用多个纹理来创建最终所需的结果。这种分层技术允许使用不同纹理的组合创建许多不同的纹理。更重要的是,它为艺术家提供了对表面细节和/或光照的更好控制。
一种特殊的纹理映射形式——法线图
法线图是一种纹理图。它们给表面带来小凹凸和凹坑。法线图在不增加多边形数量的情况下为表面添加细节。法线图的一个非常有效的用途是从高多边形 3D 模型生成法线图,并使用它来纹理低多边形模型,这被称为烘焙。我们将在下一节讨论为什么我们需要具有不同多边形数量的相同 3D 模型。
法线贴图通常存储为常规 RGB 图像,其中 RGB 分量分别对应于表面法线的 X、Y 和 Z 坐标。以下图像显示了从www.bricksntiles.com/textures/获取的法线贴图示例:

细节级别
我们创建具有不同细节级别(LODs)的对象,以提高渲染效率。对于靠近玩家的对象,渲染高 LOD 对象。具有更高 LOD 的对象具有更多的多边形。对于远离玩家的对象,则渲染对象的简化版本。
艺术家可以使用自动化的 LOD 算法,通过软件部署或手动减少 3D 模型中的顶点、法线和边数,来创建不同 LOD 版本的 3D 对象,从而创建一个多边形数量更少的模型。在创建不同 LOD 的模型时,请注意,我们总是先创建具有最多多边形的最详细模型,然后相应地减少以创建其他 LOD 版本。反过来工作模型要困难得多。务必记住,在处理不同 LOD 的对象时保持 UV 一致性。目前,不同的 LOD 需要分别进行光照贴图。
以下图像来自renderman.pixar.com/view/level-of-detail,非常清楚地显示了基于距离相机距离的多边形数量:

碰撞
Unreal Engine 中的对象具有可以修改的碰撞属性,以设计对象与其他对象碰撞时的行为。
在现实生活中,碰撞发生在两个物体移动并在接触点相遇时。它们的个别对象属性将决定我们得到什么样的碰撞,它们如何响应碰撞,以及碰撞后的路径。这就是我们在游戏世界中试图实现的内容。
以下截图显示了 Unreal Engine 4 中对象可用的碰撞属性:

如果你仍然对碰撞的概念感到困惑,想象一下静态网格为对象提供形状(它有多大,有多宽等等),而对象的碰撞能够确定当放置在桌子上时该对象的行为——该对象是否能够在关卡中穿过桌子,或者静止地放在桌子上。
碰撞配置属性
让我们来看看 Unreal 的碰撞属性中的一些可能配置,这些是我们应该熟悉的。
模拟生成碰撞事件
当对象具有模拟生成击中事件标志被勾选时,当对象发生碰撞时,会发出警报。此警报通知可用于根据此碰撞触发其他游戏动作。
生成重叠事件
生成重叠事件标志与模拟生成击中事件标志类似,但当此标志被勾选时,为了生成一个事件,所有对象需要的只是与另一个对象重叠。
碰撞预设
碰撞预设属性包含一些预配置的常用设置。如果您希望创建自己的自定义碰撞属性,请将其设置为自定义。
碰撞启用
碰撞启用属性允许三种不同的设置:无碰撞、无物理碰撞和碰撞启用。当此对象仅用于非物理类型的碰撞,如射线投射、扫掠和重叠时,选择无物理碰撞。当需要物理碰撞时,选择碰撞启用。当绝对不需要碰撞时,选择无碰撞。
对象类型
对象可以被分类到几个组中:WorldStatic、WorldDynamic、Pawn、PhysicsBody、Vehicle、Destructible和Projectile。所选类型决定了它在移动时采取的交互。
碰撞响应
碰撞响应选项设置所有随附的追踪和对象响应的属性值。当碰撞响应选择阻止时,追踪和对象响应下的所有属性也设置为阻止。
追踪响应
追踪响应选项影响对象与追踪的交互方式。可见性和相机是您可以选择的两种追踪类型,您可以选择阻止、重叠或忽略。
对象响应
对象响应选项影响此对象与其他对象类型的交互方式。记得之前提到的对象类型选择吗?对象类型属性确定对象的类型,在此类别下,您可以配置此对象与不同类型对象的碰撞响应。
碰撞外壳
在虚幻引擎中,要发生碰撞,使用外壳。要查看静态网格的碰撞外壳示例,请查看以下截图中的围绕立方体的浅蓝色线条;它是一个盒式碰撞外壳:

外壳可以在静态网格编辑器中为静态网格生成。以下截图显示了在静态网格编辑器中创建自动生成的碰撞外壳的可用菜单选项:

简单的几何对象可以组合并重叠以形成一个简单的船体。一个简单的船体/边界框可以减少碰撞时的计算量。因此,对于复杂对象,可以使用通用边界框来包围对象。当创建具有复杂形状的静态网格,而不是简单几何类型的对象时,你需要参考本章后面的静态网格创建流程部分,以了解如何为它创建合适的碰撞边界框。
交互
当设计碰撞时,你还需要决定对象有哪些交互类型以及它会与什么交互。
阻挡意味着它们将发生碰撞,而重叠可能意味着不会发生碰撞。当发生阻挡或重叠时,可以标记事件,以便可以采取由此交互产生的其他操作。这是为了允许自定义事件,你可以在游戏中实现。
注意,为了实际发生碰撞,两个对象都必须设置为Block,并且它们必须设置为能够阻挡正确类型的对象。如果一个设置为阻挡而另一个设置为重叠,则将发生重叠但不会发生阻挡。当对象以高速移动时,可能会同时发生阻挡和重叠,但事件只能在重叠或阻挡中触发,不能同时触发。你还可以设置阻挡以忽略特定类型的对象,例如,Pawn,即玩家。
静态网格创建流程
静态网格创建流程是在编辑器外使用 3D 建模工具(如 Autodesk 的 Maya 和 3D 的 Max)完成的。Unreal Engine 4 兼容导入 FBX 2013 版本的文件。
此创建流程主要被艺术家用来为项目创建游戏对象。
将静态网格导入编辑器的实际步骤和命名约定在 Unreal 4 文档网站上都有很好的记录。你可以参考docs.unrealengine.com/latest/INT/Engine/Content/FBX/StaticMeshes/index.html获取更多详细信息。
介绍体积
体积是无形的区域,创建它们是为了帮助游戏开发者执行特定功能。它们与关卡中的对象一起使用,以执行特定目的。体积通常用于设置边界,目的是防止玩家进入游戏中的触发事件,或使用 Lightmass 重要性体积来改变地图中某个区域的灯光计算方式,如第二章,创建你的第一个关卡中所述。
这里列出了可以在虚幻引擎 4 中自定义和使用的不同类型的体积。但现在您可以快速浏览每个体积,稍后当我们开始学习如何在书中使用它们时再回来查看。对于本章,您可能首先关注触发体积,因为我们将在此章的后续示例中使用它。
阻挡体积
阻挡体积可以用来防止玩家/角色/游戏对象进入地图的某个区域。它与我们在前面描述的碰撞外壳非常相似,可以用作静态网格碰撞外壳的替代品,因为它们的形状更简单(块状),因此更容易计算碰撞响应。这些体积还具有快速检测哪些对象与其自身重叠的能力。
阻挡体积的一个使用示例是防止玩家穿越一排低矮的灌木丛。在这种情况下,由于灌木丛形状相当不规则,但大致形成一条直线,就像树篱一样,一个不可见的阻挡体积将是非常好的防止玩家穿越灌木丛的方法。
下面的截图显示了阻挡体积的属性。我们可以在刷子设置下更改体积的形状和大小。使用蓝图更改碰撞事件和触发其他事件。这基本上是我们将获得的所有其他体积的基本配置。

摄像头阻挡体积
摄像头阻挡体积的工作方式与阻挡体积相同,但它专门用于阻挡摄像头。当您想限制玩家使用摄像头探索超过一定范围时,这很有用。
触发体积
触发体积可能是最常用的体积之一。这也是我们将用来为我们在游戏中正在工作的关卡创建事件的体积。正如其名所示,进入这个体积后,我们可以触发事件,并且通过蓝图,我们可以为我们的游戏创建各种事件,例如移动电梯或生成 NPC。
导航网格边界体积
导航网格边界体积用于指示 NPC 能够自由导航的空间。NPC 可能是游戏中的敌人,他们需要某种路径寻找方法来独自在关卡中移动。这个导航网格边界体积将设置游戏中他们能够穿过的区域。这很重要,因为可能会有障碍物,如桥梁,他们需要使用这些障碍物才能到达另一边(而不是直接走进河流并可能溺水)。
物理体积
物理体积用于创建玩家/级别中的玩家/对象的物理属性发生变化的区域。一个例子是在太空船达到轨道时仅改变太空船内的重力。在这些区域内改变重力时,玩家开始移动得更慢,并在太空船中漂浮。然后,当飞船返回地球时,我们可以关闭这个体积。以下截图显示了从物理体积获得的附加设置:

疼痛造成体积
疼痛造成体积是一个非常专业的体积,用于在玩家进入时对其造成伤害。它是杀戮体积的“较轻”版本。健康值的减少和每秒造成的伤害量可以根据您的游戏需求进行自定义。以下截图显示了您可以调整的属性,以控制对玩家施加的疼痛程度:

杀戮体积
当玩家进入杀戮体积时,我们会将其消灭。这是一个非常剧烈的体积,会立即消灭玩家。其用法的一个例子是当玩家从高楼坠落时立即将其消灭。以下截图显示了杀戮体积的属性,以确定玩家被消灭的点:

级别流体积
级别流体积用于在您处于体积内时显示级别。它通常填充您希望加载级别的整个空间。我们需要流式传输级别的理由是为了给玩家一种我们有一个大型开放游戏级别的错觉,而实际上级别被分割成块以实现更高效的渲染。以下截图显示了可以为级别流体积配置的属性:

清除距离体积
清除距离体积允许在体积内清除对象。清除的定义是从一组中选择。清除距离体积用于根据与摄像机的距离选择需要消失(或未渲染)的对象。远离摄像机的微小对象无法被肉眼看到。如果摄像机距离这些对象太远,则可以清除这些对象。使用清除距离体积,您可以决定在固定空间内要清除的对象的距离和大小。如果有效使用,这可以大大提高您游戏的表现。
这可能看起来与遮挡的概念非常相似。遮挡是通过选择对象并逐个实现,当它不在屏幕上渲染时。这些通常用于场景中的大型对象。清除距离体积可以在大范围的空间中使用,并使用条件来指定对象是否渲染。
以下截图显示了清除距离体积可用的配置设置:

音量
音量用于模拟从一个地方过渡到另一个地方时真实的环绕声音变化,尤其是在从一个地方过渡到另一个非常不同的环境时,例如从繁忙的街道走进钟表店,或者从有现场乐队演奏的餐厅进进出出。
音量放置在某个区域的边界周围,创建一个人工边界,将空间分为内部和外部。有了这个人工创建的边界和与这个音量相关的设置,声音艺术家能够配置在过渡期间如何播放声音。
后处理体积
后处理体积使用后处理技术影响整个场景。后处理效果包括光晕效果、抗锯齿和景深。
光线重要性体积
我们在第二章“创建你的第一个关卡”中使用了光线重要性体积,以聚焦于地图上有物体的部分。体积的大小应该包括你的整个关卡。
介绍蓝图
虚幻编辑器通过一个可视化脚本系统提供了为游戏关卡创建自定义事件的能力。在虚幻引擎 4 之前,它被称为Kismet 系统。在虚幻引擎 4 中,这个系统经过改进,增加了更多功能和能力。改进后的系统以新的名称“蓝图”推出。
蓝图有几种类型:类蓝图、仅数据蓝图和关卡蓝图。这些大致相当于我们以前所知道的 Kismet,现在被称为关卡蓝图。
为什么我需要蓝图?简单的答案是,通过蓝图,我们能够在不深入实际编码的情况下控制游戏玩法。这使得非程序员能够方便地设计和修改游戏玩法。因此,它主要受益于能够通过蓝图编辑器配置游戏的游戏设计师/艺术家。
那么,我们如何使用蓝图?我能用蓝图做什么?蓝图就像通过界面进行编码。你可以选择、拖放功能节点到编辑器中,并将它们逻辑上连接起来,以触发游戏中特定场景的期望响应。对于程序员来说,他们能够很快地掌握它,因为蓝图实际上是一种编码,但通过一个可视化界面进行。
为了让所有刚开始接触虚幻引擎 4 以及可能编程的新手受益,我们将在这里通过一个基本示例来讲解关卡蓝图的工作原理,并以此为例同时介绍一些基本的编程概念。
我们将如何使用蓝图?蓝图具有原型设计、实施或修改几乎任何游戏元素的能力。游戏元素影响游戏对象如何生成、生成什么、在哪里生成以及它们在什么条件下生成。游戏对象可以包括灯光、摄像机、玩家的输入、触发器、网格和角色模型。蓝图可以动态控制这些游戏对象的属性,以创建无数的游戏场景。使用的例子包括在游戏中进入房间时改变灯光的颜色、进入房间后触发门关闭并在关闭时播放门关闭的声音效果、在地图中的三个可能位置随机生成武器等等。
在本章中,我们将首先关注级别蓝图,因为它是最常用的蓝图形式。
级别蓝图
级别蓝图是一种影响级别发生事件的蓝图类型。在此蓝图创建的事件会影响级别中发生的事情,并通过指定目标特定对象来使事件具体化。
随意跳到下一节,我们将通过一个蓝图示例来了解,这样我们就能更好地理解级别蓝图。
以下截图显示了一个空白的级别蓝图。最常用的窗口是事件图,位于中央。使用事件图中的不同节点类型并适当地连接它们,可以在游戏中创建响应式交互。节点包含变量、值和其他在编程中用于控制游戏事件图形(不写一行脚本或代码)的类似属性。

使用触发体积来打开/关闭灯光
我们现在可以使用所学知识来构建我们游戏的下一个房间。我们将复制我们创建的第一个房间以创建第二个房间。
-
打开我们在第二章中创建的级别,创建您的第一个关卡(
Chapter2_Level),并将其保存为名为Chapter3_Level的新级别。 -
选择所有墙壁、地板、门和门框。
-
按住Alt + Shift并拖动以复制房间。
-
将复制的房间与复制的门对齐到第一个房间的墙上。参考以下截图以了解从顶部视角墙壁是如何对齐的:
![使用触发体积打开/关闭灯光]()
-
删除第一个房间的后墙以连接两个房间。
-
删除所有门以方便进入第二个房间。
-
将立式台灯和椅子移到旁边。查看以下截图以了解此时房间的样子:
![使用触发体积打开/关闭灯光]()
-
重建灯光。以下截图显示了在建立灯光后房间被正确照亮的情景:
![使用触发体积打开/关闭灯光]()
-
现在,让我们专注于第二个房间的制作。我们将使用刚刚创建的第二个房间来创建一个更窄的通道。
-
将侧墙向彼此靠近——大约从之前的侧墙向中心方向 30 厘米。参考以下两个截图了解移动侧墙后的顶视图和透视视图:
![使用触发体积打开/关闭灯光]()
![使用触发体积打开/关闭灯光]()
-
注意,LightMass 重要性体积现在并没有覆盖整个楼层。增加体积的大小以覆盖整个楼层。查看以下截图以了解如何正确地扩展体积的大小:
![使用触发体积打开/关闭灯光]()
-
转到内容浏览器 | 道具。点击并将SM_Lamp_Wall拖放到楼层中。如果需要,旋转灯具,使其平稳地放置在侧墙上。
-
转到模式 | 灯光。点击并将点光源拖放到第二个房间中。将其放置在之前步骤中添加的墙灯上的光源正上方。查看以下截图以了解我们刚刚添加的灯具和点光源的放置位置:
![使用触发体积打开/关闭灯光]()
-
调整点光源的设置:强度 = 1700.0。这大约是灯泡发出的光强度。以下截图显示了点光源的设置:
![使用触发体积打开/关闭灯光]()
-
接下来,转到灯光颜色并调整灯光颜色为#FF9084FF,以调整楼层的氛围。
![使用触发体积打开/关闭灯光]()
-
现在,让我们将点光源重命名为
WalkwayLight,并将壁灯道具重命名为WallLamp。 -
选择点光源,右键点击以显示上下文菜单。转到附加到并选择WallLamp。这样就将灯光附加到道具上,以便当我们移动道具时,灯光也会一起移动。以下截图显示了WalkwayLight与WallLamp的链接:
![使用触发体积打开/关闭灯光]()
-
现在,让我们创建一个触发体积。转到模式 | 体积。点击并拖动触发体积到楼层中。
-
调整体积的大小以覆盖分隔两个房间的门入口。参考以下两个截图了解如何定位体积(透视视图和顶视图)。确保体积覆盖了门的整个空间。
![使用触发体积打开/关闭灯光]()
![使用触发体积打开/关闭灯光]()
-
将触发体积重命名为
WalkwayLightTrigger。 -
为了使用触发体积来打开和关闭灯光,我们需要找出点光源中哪个属性控制这个功能。点击点光源(WalkwayLight)以显示灯光的属性。向下滚动到渲染并取消勾选可见属性框。注意,灯光现在已关闭。我们希望在触发之前保持灯光关闭。
-
因此,下一步是链接事件序列。这是通过级别蓝图完成的。我们需要使用我们创建的触发体积来触发属性变化,并将灯光重新打开。
-
在选择点光源的情况下,转到顶部工具栏并选择蓝图|打开级别蓝图。这会打开级别蓝图窗口。确保点光源(WalkwayLight)仍然被选中,如以下截图所示:
![使用触发体积打开/关闭灯光]()
-
在级别蓝图窗口的事件图中右键单击以显示可以添加到级别蓝图中的操作。
-
由于级别蓝图能够指导可能执行的操作,我们可以简单地选择添加 WalkwayLight 引用。这将在级别蓝图中创建WalkwayLight演员。以下截图显示了WalkwayLight演员正确添加到蓝图中:
![使用触发体积打开/关闭灯光]()
-
您可以保持级别蓝图窗口打开,并转到我们在级别中创建的触发体积。
-
选择触发体积(WalkwayLightTrigger),右键单击并选择添加事件然后OnActorBeginOverlap。以下截图显示了如何在级别蓝图中添加OnActorBeginOverlap:
![使用触发体积打开/关闭灯光]()
-
要控制点光源中的变量,我们将在添加的WalkwayLight节点上的小蓝色圆圈上点击并拖动。这会在小蓝色圆圈处创建一条蓝色线条。这还会打开一个菜单,我们可以看到可以对点光源执行哪些操作。在搜索栏中输入
visi以显示选项。点击设置可见性。以下截图显示了如何将设置可见性功能添加到点光源(WalkwayLight)中:![使用触发体积打开/关闭灯光]()
-
在设置可见性函数中勾选新可见性复选框。以下截图显示了我们要配置的设置:
![使用触发体积打开/关闭灯光]()
-
现在,我们已准备好将OnActorBeginOverlap事件链接到设置可见性函数。从OnActorBeginOverlap点击并拖动白色三角形框,并将其放置在设置可见性函数的白色三角形框上。以下截图显示了事件正确链接:
![使用触发体积打开/关闭灯光]()
-
现在,构建关卡并播放。从第一个房间穿过门进入第二个房间。灯光应该被触发开启。
但当你走回第一个房间时会发生什么?灯光保持开启状态,当你走回第二个房间时没有任何反应。在下一个示例中,我们将介绍如何在你进出房间时切换灯光的开和关。这是一种实现灯光控制的替代方法,我将将其作为可选内容供您尝试。
使用触发体积切换灯光开/关(可选)
以下步骤可用于触发体积以切换灯光的开和关:
-
我们需要在事件图中替换设置可见性节点。点击并拖动来自点光源(WalkwayLight)的蓝色点,并将其拖放到任何空白空间。这会打开上下文菜单。以下截图显示了放置新节点从WalkwayLight的上下文菜单:
![使用触发体积切换灯光开/关(可选)]()
-
选择切换可见性。这将在事件图中创建一个额外的新的节点;我们需要根据以下截图重新连接链接,以便将OnActorBeginOverlap链接到切换可见性:
![使用触发体积切换灯光开/关(可选)]()
-
最后一步是删除设置可见性节点,然后我们就可以在进入和离开房间时切换灯光的开和关。以下截图显示了我们想要的最终事件图。编译并播放关卡以查看如何切换灯光的开和关。
![使用触发体积切换灯光开/关(可选)]()
摘要
我们已经介绍了一些关于我们在虚幻引擎 4 中用于构建游戏世界的对象的重要概念。我们将最常见的游戏对象类型之一,静态网格,分解为其最基本的组件,以便理解其结构。我们还比较了两种游戏对象类型(静态网格和 BSP),它们之间的区别以及它们在游戏中的位置。这将帮助您决定需要创建哪种类型的对象以及如何为您的游戏关卡创建它们。
本章还简要介绍了纹理和材质,它们的创建方式以及如何应用到网格上。我们将在下一章更详细地介绍材质。因此,您可能想先阅读第四章,材质和灯光,然后再创建/应用材质到您新创建的游戏对象上。为了帮助您优化游戏,本章还涵盖了网格创建流程和 LOD 的概念。为了进行交互,我们还需要学习在虚幻中对象如何相互交互和碰撞,以及哪些对象属性可以配置以允许不同的物理交互。
本章还介绍了我们对蓝图的第一印象,即 Unreal Engine 4 的图形脚本。通过一个简单的蓝图示例,我们学习了如何使用 Unreal 中众多有用的体积之一——触发体积(Trigger Volume),来为我们的关卡打开和关闭灯光。在下一章中,我们将继续使用更多令人兴奋的材料和灯光来构建我们已创建的关卡。
第四章:材质与照明
在本章中,我们将详细了解虚幻引擎 4 中的材质和灯光。我们将材质和灯光一起放在本章中,因为一个对象的外观很大程度上是由这两者——材质和照明——决定的。
材质是我们应用到对象表面的东西,它影响对象在游戏中的外观。材质/着色器编程是一个热门的研究课题,因为我们总是努力提高纹理性能——在有限的 CPU/GPU 渲染能力下寻求更高的图形细节/真实感/质量。该领域的学者需要找到方法,使我们在游戏中拥有的模型尽可能真实,同时尽可能减少计算/数据量。
照明也是世界创建中的一个非常强大的工具。照明有许多用途。照明可以创造一个关卡的氛围。当有效地使用时,它可以用来聚焦关卡中的对象,并引导玩家通过你的关卡。照明也创造阴影。在游戏关卡中,阴影需要人工创建。因此,我们还将学习如何适当地渲染我们的游戏中的阴影。
材质
在上一章中,我们简要介绍了材质和纹理是什么。纹理就像一个简单的.png/.tga格式的图像文件。材质是由不同元素组合而成的,包括纹理,以创建我们应用到游戏对象上的表面属性。我们还简要介绍了 UV 坐标是什么以及我们如何使用它们将 2D 纹理应用到 3D 对象的表面上。
到目前为止,我们只学习了如何应用虚幻引擎默认提供的材质。在本章中,我们将深入探讨如何在虚幻引擎 4 中实际创建我们自己的自定义材质。从根本上说,对象的材质创建属于艺术家的范畴。对于特殊的定制纹理,它们有时由 2D 艺术家使用 Photoshop 等工具手工绘制,或者从我们想要的精确对象的纹理照片中获取,或者从类似对象中获取。纹理也可以从现有的纹理集合中进行调整,以创建所需的用于 3D 模型的定制材质。由于需要大量的真实纹理,程序员有时也会通过算法生成纹理,以便更好地控制其最终外观。这也是计算机图形学中材料进步的一个重要研究领域。
这里的材质操作属于被称为图形程序员的专门程序员群体的范畴。他们有时也是研究人员,研究如何更好地压缩纹理、提高渲染性能以及创建特殊的动态材质操作。
材质编辑器
在虚幻引擎 4 中,可以通过材质编辑器来实现材质操作。这个编辑器提供的是创建材质表达式的功能。材质表达式协同工作,为材质创建一个整体表面属性。你可以把它们看作是数学公式,通过相加/相乘来影响材质的属性。材质编辑器使得编辑/制定材质表达式变得容易,以创建定制的材质,并提供快速预览游戏中的更改的能力。通过虚幻的蓝图功能和编程,我们还可以根据游戏需求动态地操作材质。
渲染系统
虚幻引擎 4 中的渲染系统使用 DirectX 11 管线,包括延迟着色、全局照明、自发光透明度和后期处理。虚幻引擎 4 也开始分支以支持最新的 DirectX 12 管线,适用于 Windows 10,DirectX 12 功能将对所有用户可用。
基于物理的着色模型
虚幻引擎 4 使用基于物理的着色模型(PBSP)。这是一个在许多现代游戏引擎中使用的概念。它使用对光的行为的近似来赋予物体属性。使用这个概念,我们给这四个属性赋予值(0 到 1):基础颜色、粗糙度、金属度和高光,以近似视觉属性。
例如,树干的树皮通常是棕色、粗糙且不太反光的。根据我们对树皮外观的了解,我们可能会将金属值设置为低值,粗糙度设置为高值,并将基础颜色设置为显示棕色,具有低高光值。
这改善了创建材质的过程,因为它更直观,因为视觉属性是由光如何反应来控制的,而不是像旧方法那样,我们根据光应该如何行为来近似视觉属性。
对于熟悉描述材质属性的老术语的人来说,你可以把它看作是漫反射颜色和高光强度被基础颜色、金属度和粗糙度所取代。
使用 PBSP 的优势在于我们可以更准确地近似材质属性。
高级着色语言
材质编辑器允许使用节点网络和连接进行高级着色语言(HLSL)的可视化脚本。对于那些对着色器或 HLSL 概念完全陌生的人来说,应该先阅读下一节关于着色器、DirectX 和 HLSL 的内容,以便您对计算机如何在屏幕上渲染材质信息有基本了解。HLSL 是由微软开发的一种专有着色语言。OpenGL 有自己的版本,称为 GLSL。HLSL 是用于编程图形管道中各个阶段的编程语言。它使用与 C 编程类似的变量,并有许多已编写和可供使用的内置函数。HLSL 着色器可以在作者时间或运行时编译,并在运行时设置到适当的管道阶段。
入门
在虚幻引擎 4 中打开材质编辑器,请转到内容浏览器 | 材质,然后双击任何材质资产。或者,您可以选择一个材质资产,右键单击以打开上下文菜单,并选择编辑来在材质编辑器中查看该资产。
如果您想学习如何创建新的材质,您可以在即将到来的部分中尝试示例。
创建简单的自定义材质
我们将继续使用我们创建的关卡。打开Chapter3Level.umap并将其重命名为Chapter4Level.umap,以防止覆盖前一章结尾处我们已完成的内容。
要在我们的游戏包中创建新的材质资产,请转到内容浏览器 | 材质。选择材质后,右键单击以打开上下文菜单,导航到新资产 | 材质。这将在材质文件夹中创建新的材质(我们希望将资产放在逻辑文件夹中,以便我们能够轻松找到游戏资产)。或者,您也可以转到内容浏览器 | 新 | 材质。

将新材质重命名为MyMaterial。以下截图显示了正确创建的新的MyMaterial:

注意,新MyMaterial的缩略图显示为灰色的棋盘图案材质。这是未应用任何材质时的默认材质。
要打开材质编辑器开始设计我们的材质,双击MyMaterial。以下截图显示了带有空白新材质的材质编辑器。由于尚未定义任何属性,材质的球形预览显示为黑色。

让我们开始为MyMaterial节点定义一些属性,以创建我们自己的独特材质。"基础颜色"、"金属"和"粗糙度"是我们将首先学习的三个值。
基础颜色由红、绿、蓝的向量形式定义。为此,我们将从右侧的MyPalette拖放Constant3Vector到主窗口中,其中包含MyMaterial节点。或者,您也可以右键单击以打开上下文菜单,并在搜索框中输入vector以过滤列表。点击并选择Constant3Vector以创建节点。双击Constant3Vector以显示颜色选择器窗口。以下截图显示了我们要用于创建红色墙面材质的Constant3Vector设置。(R = 0.4,G = 0.0,B = 0.0,H = 0.0,S = 1.0,V = 0.4):

按照以下截图所示,通过点击并拖动从Constant3Vector节点的小圆圈到MyMaterial节点旁边基础颜色属性的小圆圈来将Constant3Vector连接到MyMaterial节点。这个Constant3Vector节点现在为材质提供基础颜色。注意左边的球形预览如何更新以显示新的颜色。如果颜色没有自动更新,请确保顶部的工具栏上的实时预览设置被选中。

现在,让我们设置材质的金属度值。这个属性接受从 0 到 1 的数值,其中 1 代表 100%的金属。要为值创建输入,请从MyPalette点击并拖动Constant,或者在材质编辑器中右键单击以打开菜单;在搜索框中输入Constant以过滤并从过滤列表中选择Constant。要编辑常量中的值,请单击Constant节点以显示详细信息窗口并填写值。以下截图显示了如果金属度设置为 1 时材质的外观:

在看到金属度值如何影响材质后,让我们看看粗糙度会做什么。粗糙度也接受从 0 到 1 的Constant值,其中 0 是完全光滑的,使表面非常反光。左侧的截图显示了当粗糙度设置为 0 时材质的外观,而右侧的截图显示了当粗糙度设置为 1 时材质的外观:

我们希望使用这种新材料来纹理墙面。因此,我们将金属度设置为0.3,将粗糙度设置为0.7。以下截图显示了我们对第一个自定义材质的最终设置:

前往内容浏览器中的MyMaterial并复制MyMaterial。将其重命名为MyWall_Grey。使用以下值将基础颜色更改为灰色,如选择器节点中所示,用于Base Color的Constant3Vector值。(R = 0.185, G = 0.185, B = 0.185, H = 0.0, S = 0.0, V = 0.185):

以下截图显示了MyWall_Grey节点的链接。(Metallic = 0.3, Roughness = 0.7):

使用简单纹理创建自定义材质
要使用纹理创建材质,我们必须首先选择一个合适的纹理。纹理可以由艺术家创建或从材料的照片中获取。为了学习目的,你可以从网络中找到合适的免费源图像,例如www.textures.com,并使用它们。如果你计划在游戏中发布,请记住检查使用条件和其他与许可证相关的条款。
我们需要一个简单的纹理来创建自定义材质。首先,我们需要使用的实际纹理。目前,让我们保持这个选择简单直接。根据颜色选择这个纹理,它应该具有你希望材质看起来具有的整体属性。接下来,我们需要一个法线纹理。如果你还记得什么是法线图,它控制着表面的凹凸。法线图给出了材质中的凹槽。这两种纹理将共同工作,为你提供一个看起来逼真的材质,你可以在游戏中使用。
在这个例子中,我们将创建另一个木纹纹理,我们将用它来替换房间中已经应用的自定义包中的木纹。
在这里,我们将首先导入在 Unreal Engine 中需要的纹理。前往内容浏览器 | 纹理。然后点击顶部的导入按钮。这会打开一个窗口,用于浏览纹理的位置。导航到保存纹理的文件夹位置,选择纹理并点击打开。注意,如果你导入的不是 2 的幂(256 x 256、1024 x 1024 等)的纹理,你会收到一个警告消息。由于内存使用效率低下,应避免使用不是 2 的幂的纹理。如果你导入的是我使用的示例图像,它们已经转换为 2 的幂,因此你不会在屏幕上收到此警告消息。
导入T_Wood_Light和T_Wood_Light_N。T_Wood_Light将用作我们想要的主体纹理,而T_Wood_Light_N是法线图纹理,我们将用它来处理这种木材。
接下来,我们按照前面的步骤创建一个新的材料,如前例所示。转到内容浏览器 | 材料。选择材料文件夹,打开上下文菜单,导航到新资产 | 材料。将新材料重命名为MyWood。
现在,我们不再选择Constant3Vector来提供基础颜色的值,而是使用TextureSample。转到MyPalette并输入Texture以过滤列表。选择TextureSample,将其拖放到材质编辑器中。单击TextureSample节点以显示详细信息面板,如图所示。在详细信息面板中,转到材质表达式纹理基础并单击其旁边的小箭头。这会弹出一个包含所有可用的合适资产的弹出窗口。向下滚动以选择T_Wood_Light。

现在,我们已经配置了TextureSample,使用的是我们之前导入到编辑器中的木纹。通过单击白色空心圆连接器,将其拖动并放置在MyWood节点的Base Color连接器上。
重复相同的步骤创建一个用于T_Wood_Light_N法线贴图纹理的TextureSample节点,并将其连接到MyWood的Normal输入。
以下截图显示了我们要为MyWood设置的参数。为了使我们的木纹有一点光泽感,使用Constant节点将Roughness设置为0.2。(回顾:从MyPalette拖放一个Constant节点并将其值设置为0.2,连接到MyWood的Roughness输入。)

使用自定义材料来转换级别
使用我们在前两个示例中创建的自定义材料,我们将替换当前使用的材料。
以下截图显示了第一个房间的前后对比。注意新自定义材料如何将房间转换成现代风格的房间。

从前面的截图,我们还添加了一个点光源并将其放置在灯具道具上,使其看起来像是在发光。以下截图显示了我们所使用的点光源设置(Light Intensity = 1000.0,Attenuation Radius = 1000.0):

接下来,我们添加了一个天花板来覆盖房间。墙壁的天花板使用与墙壁相同的盒子几何形状。我们已将M_Basic_Wall材料应用到其上。
然后,我们使用红色墙壁材料(MyMaterial)来替换带有门框的墙壁上的材料。灰色墙壁材料(MyWall_Grey)用于替换侧面墙壁的砖材料。光泽木材料(MyWood)用于替换木地板材料。
渲染管线
为了使图像出现在屏幕上,计算机必须在屏幕上绘制图像以显示它。通过使用 2D 和 3D 数据信息创建场景的 2D 表示的步骤序列被称为图形或渲染管线。计算机硬件,如中央处理器(CPU)和图形处理器(GPU),用于计算和操纵绘制 3D 场景所需的输入数据。
由于游戏是交互式的,并且高度依赖于实时渲染,因此渲染移动场景所需的数据量很大。需要计算三角形多边形的每个顶点的坐标位置、颜色以及所有显示信息,同时考虑到在它们正确显示在屏幕上之前重叠多边形的影响。因此,优化 CPU 和 GPU 的能力以处理这些数据并及时在屏幕上显示它们至关重要。多年来,这一领域一直在不断改进,以允许以更高的帧率渲染出更高品质的图像,从而获得更好的视觉效果。在此阶段,游戏应至少以 30fps 的帧率运行,以便玩家获得合理的游戏体验。
当前的渲染管线使用一系列可编程着色器来操纵图像信息,在屏幕上显示图像之前。我们将在下一节中更详细地介绍着色器和 Direct3D 11 图形管线。
着色器
着色器可以被视为一系列编程代码的序列,它告诉计算机如何绘制图像。不同的着色器控制图像的不同属性。例如,顶点着色器为单个顶点提供诸如位置、颜色和 UV 坐标等属性。顶点着色器的另一个重要目的是将具有 3D 坐标的顶点转换成 2D 屏幕空间以便显示。像素着色器处理像素以提供颜色、z 深度和 alpha 值信息。几何着色器负责处理原始数据(三角形、线和顶点)级别的数据。
图像的数据信息从一个个着色器传递到下一个着色器进行处理,最终通过帧缓冲区输出。
着色器还用于结合后处理效果,如体积光照、HDR 和光晕效果,以增强游戏中的图像。
着色器编程所使用的语言取决于目标环境。对于 Direct3D,官方语言是 HLSL。对于 OpenGL,官方的着色语言是OpenGL 着色语言(GLSL)。
由于大多数着色器是为 GPU 编写的,因此主要的 GPU 制造商 Nvidia 和 AMD 也尝试开发自己的语言,以便为 OpenGL 和 Direct3D 着色器输出。Nvidia 开发了 Cg(在 2012 年 3.1 版本后已弃用)和 AMD 开发了 Mantle(用于 2014 年发布的某些游戏,如战场 4,似乎在开发者中越来越受欢迎)。苹果公司也于 2014 年 9 月为其 iOS 8 发布了名为Metal 着色语言的自己的着色语言,以提高 iOS 的性能优势。Kronos 还于 2015 年初宣布了一种基于 OpenGL 的下一代图形 API,称为Vulkan,这似乎得到了 Valve Corporation 等成员公司的强烈支持。
以下图像来自 MSDN 上的 Direct3D 11 图形流水线(msdn.microsoft.com/en-us/library/windows/desktop/ff476882(v=vs.85).aspx)。它显示了可编程阶段,数据可以通过这些阶段生成用于我们游戏的实时图形,称为渲染流水线状态表示。

这里提供的信息来自 Microsoft MSDN 页面。您可以使用 Direct3D 11API 配置所有阶段。如顶点、Hull、Domain、几何和像素着色器(那些有圆形矩形块的)等阶段,可以使用 HLSL 进行编程。能够以编程方式配置此流水线使其在游戏图形渲染方面具有灵活性。
以下是对每个阶段功能的解释:
| 阶段 | 功能 |
|---|---|
| 输入汇编器 | 此阶段向流水线提供数据(以三角形、线和点等形式) |
| 顶点着色器 | 此阶段处理顶点,如变换、蒙皮和光照。经过此阶段后,顶点的数量不会改变。 |
| 几何着色器 | 此阶段处理整个几何原语,如三角形、线和点。 |
| 流输出 | 此阶段在数据流向光栅化器的同时,将原始数据从流水线传输到内存。 |
| 光栅化器 | 此阶段剪辑原始数据,并为像素着色器准备原始数据。 |
| 像素着色器 | 在这里进行像素操作。每个原始像素都在这里进行处理,例如像素颜色。 |
| 输出合并 | 此阶段将各种输出数据(像素着色器值、深度和模板信息)与渲染目标的内容以及深度/模板缓冲区的内容合并,以生成最终的流水线结果。 |
| Hull 着色器、细分器和域着色器 | 这些细分阶段将高阶表面转换为三角形,为渲染做准备。 |
为了帮助您更好地可视化每个阶段发生的情况,以下图像展示了一个仅针对顶点的简化渲染管道的非常好的插图。图像来自一个旧的 Cg 教程。请注意,不同的 API 有不同的管道,但它们在渲染的基本概念上依赖于相似性(来源:goanna.cs.rmit.edu.au/~gl/teaching/rtr&3dgp/notes/pipeline.html)。

图形显示的示例流程:
-
CPU 将指令(编译的着色语言程序)和几何数据发送到位于显卡上的图形处理单元。
-
数据传递到顶点着色器,在那里顶点被转换。
-
如果 GPU 中启用了几何着色器,则在场景中执行几何形状的变化。
-
如果 GPU 中启用了细分着色器,场景中的几何形状可以被细分。计算出的几何形状被三角化(细分为三角形)。
-
三角形被分解成片段。根据片段着色器修改片段四边形。
-
为了创建深度感,为片段设置 z 缓冲区值,然后将其发送到帧缓冲区进行显示。
APIs – DirectX 和 OpenGL
DirectX 和 OpenGL 都是用于在计算机中处理多媒体信息的应用程序编程接口(API)集合。它们是目前用于视频卡的最常见的两种 API。
DirectX 是由微软创建的,以便多媒体相关硬件,如 GPU,能与 Windows 系统通信。OpenGL 是开源版本,可以在包括 Mac OS 在内的许多操作系统上使用。
使用 DirectX 或 OpenGL API 编程的决定取决于目标机器的操作系统。
DirectX
Unreal Engine 4 首次使用 DirectX11 发布。在宣布 DirectX 12 与 Windows 10 一起发布后,Unreal 从 4.4 版本开始创建了一个 DirectX 12 分支,以便开发者可以开始使用这个新的 DirectX 12 来创建游戏。
识别属于 DirectX 的 API 的一个简单方法就是它们的名称都以 Direct 开头。对于电脑游戏来说,我们最关心的 API 是 Direct3D,它是用于在游戏中绘制高性能 3D 图形的图形 API,以及 DirectSound3D,它是用于声音播放的。
DirectX API 对于创建 Windows 操作系统的高性能 2D 和 3D 图形至关重要。例如,DirectX11 支持在 Windows Vista、Windows 7 和 Windows 8.1 上。最新的 DirectX 版本可以通过服务包更新进行更新。已知 DirectX 12 是与 Windows 10 一起发布的。
DirectX12
Direct3D 12 于 2014 年发布,从 Direct3D 11 进行了大幅改进,以提供显著的性能提升。这是一个非常好的链接,指向 MSDN 博客上发布的一段视频,展示了 DirectX 12 的技术演示:channel9.msdn.com/Blogs/DirectX-Developer-Blog/DirectX-Techdemo。
(如果你对 Direct3D 11 不熟悉,或者之前没有阅读着色器部分,请在继续阅读 DirectX 部分之前先阅读该部分。)
管道状态表示
如果你能从着色器部分回忆起,我们曾查看 Direct3D 11 的可编程管道。以下图像与着色器部分相同(来自 MSDN),它显示了一系列可编程着色器:

在 Direct3D 11 中,每个阶段都可以独立配置,并且每个阶段都会独立地在硬件上设置状态。由于许多阶段由于相互依赖而具有设置相同硬件状态的能力,这导致了硬件不匹配的开销。以下图像是硬件不匹配开销如何发生的极好说明:

驱动程序通常会首先从应用程序(游戏)中记录这些状态,并等待直到绘制时间,当它准备好将其发送到显示监视器时。在绘制时间,这些状态在它们被转换为用于硬件的 GPU 代码以渲染游戏正确场景之前,在一个控制循环中进行查询。这为在绘制时间记录和查询所有状态创建了一个额外的开销。
在 Direct3D 12 中,一些可编程阶段被组合成一个称为管道状态对象(PSO)的单个对象,以便整个组只设置一次每个硬件状态,从而防止硬件不匹配的开销。现在可以直接使用这些状态,而不是在绘制调用之前计算结果硬件状态所需的资源。这减少了绘制调用的开销,允许每帧进行更多的绘制调用。正在使用的 PSO 可以根据所需的任何硬件原生指令和状态动态更改。

工作提交
在 Direct3D 11 中,向 GPU 的工作提交是立即的。Direct3D 12 的新特性是它使用包含执行特定工作负载所需全部信息的命令列表和包。
在 Direct3D 11 中,立即工作提交意味着信息以单个命令流的形式传递给 GPU,由于缺少完整信息,这些命令通常会被延迟,直到实际工作可以完成。
当工作提交被分组在自包含的命令列表中时,驱动程序可以预先计算所有必要的 GPU 命令,然后将该列表发送到 GPU,使 Direct3D 12 的工作提交过程更加高效。此外,使用包可以被视为一组创建特定对象的命令的小列表。当这个对象需要在屏幕上重复时,这个命令包可以被“回放”以创建重复的对象。这进一步减少了 Direct3D 12 所需的计算时间。
资源访问
在 Direct3D 11 中,游戏创建资源视图,将这些视图绑定到着色器中的插槽。这些着色器然后在绘制调用期间从这些显式绑定的插槽中读取数据。如果游戏想要使用不同的资源进行绘制,它将在下一个绘制调用中使用不同的视图进行。
在 Direct3D 12 中,您可以通过使用描述符堆来创建各种资源视图。每个描述符堆都可以定制以链接到特定的着色器,使用特定的资源。这种设计描述符堆的灵活性允许您完全控制资源使用模式,充分利用现代硬件的能力。您还可以描述多个索引的描述符堆,这允许轻松地交换堆,以完成单个绘制调用。
灯光
我们在第一章中简要介绍了灯光的类型,Unreal 引擎概述。让我们先快速回顾一下。方向光发射平行光束。点光源像灯泡一样发光(从单个点以径向向外所有方向)。聚光灯以锥形形状向外发射光,而天空光则模仿天空向下照射关卡中的对象。
在本章中,我们将学习如何使用这些基本灯光照亮室内区域。我们已经在第二章中放置了一个点光源,创建您的第一个关卡,并学习了如何将其强度调整为 1700。在本章中,我们将学习更多关于我们可以调整的每个类型灯光的参数,以创建我们想要的照明效果。
让我们先查看使用这些 Unreal 灯光照亮的关卡。加载Chapter4Level_Prebuilt.umap,构建并播放关卡以四处查看。点击关卡中放置的灯光,你会注意到大多数使用的灯光是点光源或聚光灯。这两种形式的灯光在室内照明中相当常见。
下一节将指导您自己扩展关卡。或者,您可以使用Chapter4Level_Prebuilt关卡来帮助您创建自己的关卡,因为创建整个关卡确实需要相当多的时间。如果您想跳到下一节,可以直接使用提供的预建地图版本,并使用预建地图作为参考来浏览本章的其他示例。然而,这将是一个很好的机会来复习您在前几章学到的内容,并自己扩展关卡。
在我们开始扩展关卡的选做练习之前,让我们通过几个教程示例来了解我们如何放置和配置不同类型的灯光。
配置具有更多设置的点光源
打开Chapter4Level.umap并将其重命名为Chapter4Level_PointLight.umap。
前往模式 | 灯光,将一个点光源拖放到关卡中。由于点光源从单个点向所有方向均匀发射光线,衰减半径、强度和颜色是配置点光源时最常见的三个值。
衰减半径
以下截图显示了点光源具有默认的衰减半径为1000的情况。三个蓝色圆圈的半径基于点光源的衰减半径,用于显示其对环境的影响区域。

以下截图显示了衰减半径减少到 500 的情况。在这种情况下,由于半径仍然大于房间本身,您可能看不到任何光照上的差异:

现在,让我们看看当我们调整半径变得非常小时会发生什么。以下截图显示了当半径变化时光线亮度的差异。左边的图像是衰减半径设置为 500 时的情况,右边的图像是衰减半径设置为 10 时的情况。

强度
点光源的另一个设置是强度。强度影响光线的亮度。您可以调整强度值来调整光线的亮度。在我们确定这个字段应该使用什么值以及我们希望光线有多亮之前,您应该了解另一个设置,使用逆平方衰减。
使用逆平方衰减
点光源和聚光灯默认启用了基于物理的逆平方衰减。此设置可配置为在高级下的灯光详情中找到的复选框。以下截图显示了在详情面板中找到此属性的位置:

平方反比衰减是一种物理定律,描述了光强度如何随距离自然衰减。当我们有这个设置时,强度的单位与我们在现实世界中的灯光相同的单位,即流明。当不使用平方反比距离衰减时,强度只是一个值。
在上一章中,我们添加了第一个点光源,并将强度设置为 1700。这相当于一个 1700 流明的灯泡的亮度,因为使用了平方反比距离衰减。
颜色
要调整点光源的颜色,转到灯光 | 颜色。以下截图显示了如何通过指定 RGB 值或使用颜色选择器选择所需颜色来调整灯光的颜色:

添加和配置聚光灯
打开Chapter4Level.umap并将其重命名为Chapter4Level_SpotLight.umap。转到模式 | 灯光,将聚光灯拖放到场景中。
聚光灯的亮度、可见影响半径和颜色可以通过强度、衰减半径和颜色的值以与点光源相同的方式进行配置。
由于点光源向所有方向发射光线,而聚光灯则从单个点向外以锥形形状发射光线,具有方向,因此聚光灯具有额外的属性,如内锥角和外锥角,这些是可以配置的。
内锥角和外锥角
外锥角和内锥角的单位是度。以下截图显示了当外锥角 = 20(左侧)和外锥角 = 15(右侧)时聚光灯的光半径。内锥角值在截图中没有产生太多可见结果,因此通常值为 0。然而,内锥角可以用来在锥形中心提供光线。对于扩散较宽的灯光和某些 IES 轮廓,这将更加明显。

使用 IES 轮廓
打开Chapter4Level_PointLight.umap并将其重命名为Chapter4Level_IESProfile.umap。
IES 光线轮廓是一个包含描述光线外观信息的文件。这是由灯光制造商创建的,可以从制造商的网站上下载。这些配置文件可以在建筑模型中使用,以渲染具有逼真照明的场景。同样,IES 轮廓信息也可以在虚幻引擎 4 中使用,以渲染更逼真的灯光。IES 光线轮廓可以应用于点光源或聚光灯。
下载 IES 光线轮廓
IES 光线轮廓可以从灯光制造商的网站上下载。以下是一些您可以使用的轮廓:
-
Philips:
www.usa.lighting.philips.com/connect/tools_literature/photometric_data_1.wpd -
Lithonia:
www.lithonia.com/photometrics.aspx
将 IES 配置文件导入 Unreal Engine 编辑器
从内容浏览器中,点击导入,如下面的屏幕截图所示:

我更喜欢我的文件按照一定的顺序排列,因此我创建了一个名为IESProfile的新文件夹,并创建了以制造商命名的子文件夹,以更好地分类所有导入的灯光配置文件。
使用 IES 配置文件
在上一个示例的基础上继续,选择场景中正确的聚光灯并确保它被选中。转到详细信息面板并向下滚动以显示灯光的灯光配置文件。
然后转到内容浏览器并进入IESProfile文件夹,我们将灯光配置文件导入到该文件夹中。点击你想要的配置文件之一,将其拖放到聚光灯的 IES 纹理上。或者,你可以选择配置文件,然后返回到灯光的详细信息面板,点击IES 纹理旁边的箭头以将配置文件应用到聚光灯上。在下面的屏幕截图中,我应用了从松下网站下载的标记为144907的配置文件之一。

我重新配置了聚光灯,设置强度= 1000,衰减半径= 1000,外锥角= 40,和内锥角= 0。
接下来,我删除了另一个聚光灯,并用一个设置强度= 1000和衰减半径= 1000的点光源替换它。我还设置了旋转-Y= -90,并将其相同的 IES 配置文件应用到它上。下面的屏幕截图显示了当相同的灯光配置文件应用到聚光灯和点光源时产生的差异。请注意,聚光灯中光的扩散减少了。这加强了聚光灯提供从点光源向外扩散的锥形光的概念。外锥角决定了这种扩散。点光源向所有方向发射光,并且均匀地发射,因此它没有衰减灯光配置文件设置,允许在屏幕上完全显示此灯光配置文件的设计。这是在使用 IES 灯光配置文件时需要注意的一件事,以及它们适用于哪些类型的灯光。

添加和配置方向光
打开Chapter4Level.umap并将其重命名为Chapter4Level_DirectionalLight.umap。
我们已经在第二章“创建您的第一个关卡”中添加了方向光到我们的关卡中,它向关卡提供平行光束。
轮向光也可以通过控制太阳的方向来照亮场景。左边的截图显示了当大气阳光复选框未选中时的轮向光。右边的截图显示了当大气阳光复选框选中时的轮向光。当大气阳光复选框选中时,你可以通过调整轮向光的旋转来控制阳光的方向。

以下截图显示了当旋转-Y = 0时的样子。这看起来像是一个早上的日落场景:

示例 – 添加和配置天空光
打开Chapter4Level_DirectionalLight.umap并将其重命名为Chapter4Level_Skylight.umap。
在上一个例子中,我们在轮向光中添加了阳光控制。构建和编译以查看场景现在的样子。
现在,让我们通过转到模式 | 灯光,然后点击并拖动天空光到场景中来向场景中添加天空光。在向场景添加天空光时,始终记得先构建和编译,以便看到天空光的效果。
天空光有什么作用?天空光模拟天空的颜色/光线,用于照亮场景的外部区域。因此,外部区域看起来更真实,因为颜色/光线是反射在表面上的(而不是使用简单的白色/彩色光)。
以下截图显示了天空光的效果。左边的图像显示了天空光不在场景中。右边的图像显示了天空光。注意,墙壁现在带有天空的颜色。

静态、固定或可移动灯光
在学习了如何放置和配置不同的灯光后,我们需要考虑在场景中需要哪种类型的灯光。如果你对灯光的概念不熟悉,你可能想简要地浏览一下有用的灯光术语部分,以帮助你的理解。
以下截图显示了可以更改灯光为静态、固定或可移动的详细信息面板。

静态和固定灯光听起来非常相似。它们有什么区别?你什么时候想使用静态灯光,什么时候想使用固定灯光?
常见的灯光/阴影定义
常见的灯光/阴影定义如下:
-
直接光:这是由于光源直接存在于场景中的光。
-
间接光:这是场景中不是直接来自光源的光。这是反射光在周围弹跳,并来自各个方向。
-
光照图:这是一个存储对象关于光/亮度信息的数据结构。这使得对象的渲染速度更快,因为我们已经提前知道了它的颜色/亮度信息,并且在运行时不需要计算这些信息。
-
阴影图:这是一个创建动态阴影的过程。它基本上由两个步骤组成以创建阴影。可以添加更多步骤以渲染更漂亮的阴影。
静态光
在游戏中,我们总是希望有最佳的性能,静态光将是一个极好的选择,因为静态光只需要预先计算一次到光照图中。因此,对于静态光,我们有最低的性能成本,但作为交换,我们无法改变光的外观,移动光,以及将此光的效果与移动对象(这意味着它无法在光的影响范围内移动时为移动对象创建阴影)集成到游戏环境中的效果。然而,静态光可以在其影响半径内的现有静止对象上投射阴影。影响半径基于光源的源半径。作为对低性能成本的回报,静态光有一些限制。因此,静态光通常用于针对计算能力较低的设备创建场景。
静态光
静态光可以用于在游戏过程中我们不需要移动、旋转或改变光的影响半径的情况下,但允许光有改变颜色和亮度的能力。间接光和阴影与静态光一样,在光照图中预先烘焙。直接光阴影存储在阴影图中。
静态光在性能成本上是中等的,因为它能够通过使用距离场阴影图在静态对象上创建静态阴影。完全动态的光和阴影通常比静态光和阴影多 20 倍以上。
可移动光
可移动光用于为场景投射动态光和阴影。除非绝对必要,否则在级别中应谨慎使用。
练习 – 扩展你的游戏级别(可选)
这里是我为了将当前的Level4扩展到我们目前拥有的预构建版本所采取的步骤。这绝对不是唯一的方法。我只是简单地使用了一个几何刷来简化这一级别的扩展。以下截图显示了扩展级别的一部分:

有用提示
当可能时,将同一区域内的项目分组在一起,并重命名实体以帮助您更快地识别级别的各个部分。这些简单的额外步骤在编辑器中创建游戏级别原型时可以节省时间。
指南
如果你计划自己扩展游戏关卡,请打开并加载 Level4.umap。然后保存地图为 Level4_MyPreBuilt.umap。你也可以打开扩展后的关卡副本以复制资源或作为快速参考。
面积扩展
我们将首先延长这一层的地面区域。
第一部分 – 延长现有通道
短通道被延长形成了一个 L 形通道。延长部分的尺寸为 X1200 x Y340 x Z40。
| 需要的 BSP 数量 | X | Y | Z |
|---|---|---|---|
| 天花板 | 1200 | 400 | 40 |
| 地面 | 1200 | 400 | 40 |
| 左墙 | 1570 | 30 | 280 |
| 右墙 | 1260 | 30 | 280 |
第二部分 – 创建大房间(居住和厨房区域)
通道通向末尾的大房间,这是主要的居住和厨房区域。
| 需要的 BSP 数量 | X | Y | Z |
|---|---|---|---|
| 天花板 | 2000 | 1600 | 40 |
| 地面 | 2000 | 1600 | 40 |
| 将大房间和通道分开的左侧墙(从通道进入大房间时离你最近的墙) | 30 | 600 | 340 |
| 将大房间和通道分开的灯光墙(从通道进入大房间时离你最近的墙) | 30 | 600 | 340 |
| 大房间(厨房区域)的左侧墙 | 1200 | 30 | 340 |
| 大房间(餐厅区域)的右侧墙 | 2000 | 30 | 340 |
| 从通道进入房间左侧的墙(进入房间时,窗户座位所在的位置的墙) | 30 | 350 | 340 |
| 从通道进入房间右侧的墙(进入房间时,长长长凳所在的位置的墙) | 30 | 590 | 340 |
| 门区域(包括砖墙、门框和门) | |||
| 左侧墙填充物 | 30 | 130 | 340 |
| 右侧墙填充物 | 30 | 126 | 340 |
| 门 x 2 | 20 | 116 | 250 |
| 侧门框 x 2 | 25 | 4 | 250 |
| 水平门框 | 25 | 242 | 5 |
| 侧砖墙 x 2 | 30 | 52 | 340 |
| 水平砖墙 | 30 | 242 | 74 |
第三部分 – 沿通道创建一个小房间
为了创建通往小房间的通道,复制我们在第一个房间中创建的相同门框。
| 需要的 BSP 数量 | X | Y | Z |
|---|---|---|---|
| 天花板 | 800 | 600 | 40 |
| 地面 | 800 | 600 | 40 |
| 侧墙 x 2 | 30 | 570 | 340 |
| 对面墙(有窗户的墙) | 740 | 30 | 340 |
第四部分 – 在大房间中创建一个娱乐区
| 需要的 BSP 数量 | X | Y | Z |
|---|---|---|---|
| 侧墙 x 2 | 30 | 620 | 340 |
| 带有书架的墙 | 740 | 30 | 340 |
创建窗户和门
现在我们完成了房间的制作,我们可以开始制作门和窗户。
第一部分 – 为餐厅区域创建大玻璃窗户
为了创建窗户,我们使用减法几何笔刷在墙上创建洞口。首先,创建一个尺寸为 X144 x Y30 x Z300 的洞口,并将其放置在天花板和地面之间的正中间。复制这个洞口并将其转换为加法笔刷;调整尺寸为 X142 x Y4 x Z298。
使用 M_Metal_Copper 为框架,并使用 M_Glass 为刚刚创建的附加刷子。现在,将它们分组,并将两个刷子各复制四次以创建五个窗户。餐厅区域窗户的截图如下所示:

第二部分 – 为窗座创建开放式窗户
要创建窗座区域的窗户,创建一个尺寸为 X50 x Y280 x Z220 的减法几何刷子。对于这个窗户,我们在窗户底部有一个 X50 x Y280 x Z5 的突出边缘。然后对于玻璃,我们复制尺寸为 X4 x Y278 x Z216 的减法刷子,将其转换为添加刷子并调整以适应。
使用 M_Metal_Brushed 为框架,并使用 M_Glass 为刚刚创建的附加刷子。

第三部分 – 创建房间窗户
对于房间窗户,创建一个尺寸为 X144 x Y40 x Z94 的减法刷子。这是为了在墙上创建一个用于道具框架 SM_WindowFrame 的空洞:。复制减法刷子和道具以创建房间的两个窗户。
第四部分 – 创建主门区域
对于主门区域,我们首先创建门及其框架,然后是门周围的砖墙,最后是剩余的混凝土平面墙。
我们有两个带框架的门和一些砖墙需要增加,然后再回到通常的平滑墙。以下是创建这个门区域的尺寸:
| 需要的 BSPs | X | Y | Z |
|---|---|---|---|
| 实际门 x 2 | 20 | 116 | 250 |
| 侧框 x 2 | 25 | 4 | 250 |
| 顶部框架 | 25 | 242 | 5 |
这里是创建门周围区域的尺寸:
| 需要的 BSPs | X | Y | Z |
|---|---|---|---|
| 砖墙侧面 x 2 | 30 | 52 | 340 |
| 砖墙顶部 | 30 | 242 | 74 |
| 左侧平滑墙 | 30 | 126 | 340 |
| 右侧平滑墙 | 30 | 130 | 360 |
创建基本家具
让我们分部分开始,如下所述。
第一部分 – 创建餐桌并放置椅子
对于餐桌,我们将定制一个尺寸为 X480 x Y160 x Z12 的木质餐桌,并在餐桌边缘 40 厘米处放置两个尺寸为 X20 x Y120 x Z70 的腿。用于纹理的材料是 M_Wood_Walnut。
然后使用 Props 文件夹中的 SM_Chair 在桌子周围安排八张椅子。
第二部分 – 装饰休息区
中间有两个低桌子,墙边有一个低长桌子。使用 Props 文件夹中的三个 SM_Couch 围绕低桌子放置。以下是大型桌子的尺寸:
| 需要的 BSPs | X | Y | Z |
|---|---|---|---|
| 平面顶部 | 140 | 140 | 8 |
| 腿 x 2 | 120 | 12 | 36 |
这里是小型餐桌的尺寸:
| 需要的 BSPs | X | Y | Z |
|---|---|---|---|
| 腿 x 2 | 120 | 12 | 36 |
这里是墙边低长桌的尺寸:
| 需要的 BSPs | X | Y | Z |
|---|---|---|---|
| 块 | 100 | 550 | 100 |
第三部分 – 创建窗户座位区
在打开的窗户旁边放置一个尺寸为 X120 x Y310 x Z100 的几何盒子。这是为了在窗户旁边创建一个简化的座位。
第四部分 – 创建日本座位区
表面尺寸为 X200 x Y200 x Z8,并带有 4 条短腿(每条腿尺寸为 X20 x Y20 x Z36)的日本方形桌子放置在桌子角落附近。
为了在桌子下创造一个腿部空间,我使用了一个减法刷子(X140 x Y140 x Z40),并将其放置在桌子下面的地面上。我使用这个减法刷子的角落作为放置桌子短腿的指南。
第五部分 – 创建厨房柜子区
这是一个厨房柜子区的简化块原型。以下 L 形区域的尺寸:
| 需要的 BSPs | 材质 | X | Y | Z |
|---|---|---|---|---|
| 较短的 L:桌面下的柜子 | M_Wood_Walnut | 140 | 450 | 100 |
| 较长的 L:桌面下的柜子 | M_Wood_Walnut | 890 | 140 | 100 |
| 较短的 L:桌面 | M_Metal_Brushed_Nickel | 150 | 450 | 10 |
| 较长的 L:桌面 | M_Metal_Brushed_Nickel | 900 | 150 | 10 |
| 较短的 L:悬挂柜子 | M_Wood_Walnut | 100 | 500 | 100 |
| 较长的 L:悬挂柜子 | M_Wood_Walnut | 900 | 100 | 100 |
以下是小岛区域(风扇)的尺寸:
| 需要的 BSPs | 材质 | X | Y | Z |
|---|---|---|---|---|
| 风扇(木质区域) | M_Wood_Walnut | 400 | 75 | 60 |
| 风扇(金属区域) | M_Metal_Chrome | 500 | 150 | 30 |
以下是小岛区域(桌子)的尺寸:
| 需要的 BSPs | 材质 | X | Y | Z |
|---|---|---|---|---|
| 桌下柜子 | M_Wood_Walnut | 500 | 150 | 100 |
| 桌面 | M_Metal_Chrome | 550 | 180 | 10 |
| 水槽(使用减法刷子) | M_Metal_Chrome | 100 | 80 | 40 |
| 炉灶台面 | M_Metal_Burnished_Steel | 140 | 100 | 5 |
概述
在本章中,我们深入了解了材料和灯光的信息。我们学习了渲染系统的工作原理以及底层图形管道/技术,如 Directx 11、Directx 12 和 OpenGL/Vulkan。我们还学习了如何使用 Unreal 4 材质编辑器创建自定义材质并将其应用到你的级别中。
我们还探讨了不同类型的灯光,以及调整强度、衰减半径和其他设置来自定义级别的灯光。我们还学习了如何从灯光制造商的网站上导入 IES 灯光配置文件,以创建级别的真实灯光。我们还了解了静态、固定和可移动灯光之间的区别以及不同灯光如何为级别投射阴影。
在下一章中,我们将学习游戏中的动画和人工智能。敬请期待更多内容!
第五章。动画和 AI
本章是关于动画和人工智能(AI)的。
动画是我们为了让游戏中的事物移动所需要的东西。人工智能(AI)是角色(除了玩家)在游戏中知道如何行为和反应所必需的。
在本章中,我们将涵盖以下主题:
-
动画的定义
-
3D 动画
-
在 Unreal Engine 4 中进行动画所需的工具
-
学习如何将动画添加到你的游戏中
-
使用动画蓝图
-
了解混合动画
-
游戏中的 AI
-
设计一个行为树(BT)
-
使用蓝图在你的游戏中实现 AI
什么是动画?
动画是通过一系列图像或帧来模拟运动。
在计算机出现之前,动画是通过传统的技术创造的,如手绘动画和定格动画(或模型动画)。正如其名所示,手绘动画涉及在纸上绘制场景。每个场景都在下一张纸上重复,场景略有变化。所有纸张按顺序排列,页面快速翻动,就像翻页书一样。纸张上的细微变化创造了 2D 动画,这可以被拍摄成运动电影。这种技术在迪士尼卡通和电影中经常使用。正如你可以想象的,这是一种非常耗时的方式来制作动画,因为你需要成千上万的绘画来创造几秒钟的电影。
定格动画涉及创建模型,在每一帧中稍微移动它们以模拟运动,并拍摄这个序列来构建整个场景。捕捉无数片段的繁琐过程限制了这种方法的使用,如今更主流的动画技术得到了青睐。
计算机动画与定格动画非常相似,因为计算机图形在每一帧中都会稍微移动;然后这些帧被渲染到屏幕上。对于计算机游戏,我们通过使用 Maya 和 3ds Max 等工具创建 3D 模型来进行计算机动画。然后,我们为这些模型添加动画以模拟游戏中的逼真行为和动作。为了使物体移动,动画是必需的。角色需要被动画化,这样它们看起来才真实——它们可以处于空闲状态、行走、奔跑或执行游戏中需要执行的其他任何动作。
动作捕捉也是目前非常流行的一种角色动画方式。这项技术基本上是利用记录的人类动作来创建计算机图形角色的行为。如果你看过电影《阿凡达》,那些蓝色的阿凡达角色实际上是由人类演员扮演的,然后通过计算机图形技术进行了增强,以呈现出那样的外观。为了拍摄这部电影,他们把动作捕捉技术推进到了现在所说的表演捕捉。这项技术的进步赋予了电影和游戏制作者捕捉动画细节的能力,使得 CG 角色能够脱颖而出。
理解如何动画化 3D 模型
虽然这本书的目标不是教你如何动画化模型,但了解动画是如何制作的对于你更好地理解如何在游戏中让游戏角色根据设计移动和表现是非常重要的。
如前所述,我们可以使用工具如 Maya 或 3ds Max 来动画化 3D 模型。然后我们可以记录它们的变化,并在需要时在屏幕上渲染这些动画。
动画前的准备工作
在游戏开发中,动画的制作责任属于动画师。在动画首先被创建之前,我们需要首先有一个由 3D 模型师创建的 3D 模型。3D 模型师负责赋予物体形状并进行纹理处理。根据我们处理的对象类型,获取物体正确绑定的具体过程可能会有所不同。绑定需要在将物体交给动画师创建特定动画之前完成。有时,动画师还需要对绑定进行微调,以便更好地控制动画。
布料绑定是一个将骨骼放置在网格中并为骨骼创建关节的过程。这些骨骼/关节的集合被称为绑定。绑定提供了控制点,动画师可以使用这些控制点来移动对象,从而创建所需的动画。在这里,我将使用一个人类角色模型来解释,以便你能够轻松理解这个概念。
3D 或角色建模师首先展示模型的头部和身体是如何塑造的。然后确定模型的高度,通过向模型添加原语来创建所有必需的特征,并对其进行纹理处理,为其眼睛、头发等上色。现在模型已经准备好了,但内部仍然像果冻一样柔软,因为我们还没有给它任何内部结构。绑定是将骨骼添加到身体中的过程,以支撑它。手臂可以旋转,因为我们已经给它一个肩胛骨(肩胛骨)、上臂骨(肱骨)和一个可以模仿球窝关节的关节。我们用于绑定的关节由一组限制组成,这些限制限制了在不同平面和角度上的运动。还将层次结构应用于骨骼结构,以帮助骨骼相互连接。手指连接到手,手连接到手臂。可以建立这样的关系,以便当一个部分移动时,其余部分也会自然地一起移动,从而使动作看起来更真实。
Maya 和 3ds Max 等工具为绑定过程提供了一些简化,因为您可以使用标准绑定作为基础,并根据模型的需求调整这个基础。一些模型更高,需要更长的骨骼。一个 3D 模型必须有一个简单的骨骼结构,紧密遵循 3D 模型的形状和大小。相似大小的 3D 模型可以共享相同的骨骼结构。
为了更好地理解我们如何将动画添加到游戏关卡中,让我们学习计算机动画是如何创建的,以及我们如何使这些模型移动。
动画是如何创建的?
动画基本上模仿了现实世界中生命活动的样子。许多公司为了使计算机动画尽可能准确,会不遗余力地使用动作捕捉技术。他们拍摄现实生活中的实际动作,然后使用计算机 3D 模型来重现这些动作。
在创建动画时,动画师利用绑定过程中创建的骨骼和关节,并尽可能详细地调整它们的位置,以模仿它们的自然运动。骨骼和关节共同作用,影响身体姿势。这些动作随后被记录为简短的动画剪辑,称为动画序列。动画序列构成了动画的最基本块,可以播放一次或多次以创建动作。例如,一个行走动画只有 1.8 秒长,但可以反复播放来模拟行走。当这个序列再次重复时,通常被称为动画循环。
动画序列也可以相互链接,形成一个动作链。在从一个序列过渡到另一个序列时,可能需要一些混合,以便使动作看起来更自然。
Unreal Engine 4 为游戏动画提供的功能
在 Unreal Engine 4 中,动画主要是在 Persona 编辑器中完成的。这个编辑器提供了四种不同的模式:骨骼、网格、动画和图表。这些模式主要存在是为了让您可以直接跳入其中之一,以更有效地编辑/创建动画。因此,它们只是一组松散的功能,可以用来控制动画的不同方面。我们将学习如何使用 Persona 中的功能为我们的关卡添加动画。
为了帮助提高团队协作,Unreal Engine 4 还发布了一个之前仅限内部使用的工具集,这是一个 Maya(兼容 Maya 2013 及以上版本)的插件,称为动画和绑定工具集(ART)。此工具集提供了一个用户界面,允许在 Maya 本身内创建骨骼、放置骨骼和创建绑定。我们不会深入探讨这个工具集的细节,但您可以在 Unreal 的在线文档中找到更多关于此的信息,网址为docs.unrealengine.com/latest/INT/Engine/Content/Tools/MayaRiggingTool/index.html。
从 Maya/3ds Max 导入动画
由于许多艺术家使用 Maya 和 3ds Max 来创建 3D 模型和动画,Unreal Engine 4 拥有一个出色的 FBX 导入管道,允许您成功导入骨骼模型、动画序列和变形目标。这使得将资产传输到 Unreal 编辑器并将其放入游戏变得容易。Unreal 还试图稳定从其他软件(如 Blender 和 MODO)导入艺术资产。
教程 – 从 Marketplace 导入动画包
由于 3D 模型和动画最初是在 Unreal Engine 之外创建的,为了了解动画的工作原理,我们首先导入一个包含 3D 模型和多个动画序列的动画包,然后我们将学习如何使用 Unreal 编辑器中的不同工具进行动画制作。
Unreal Engine 在 Marketplace 提供了许多可下载的包。Marketplace 位于启动菜单屏幕下,位于启动按钮下方。以下截图显示了具有Marketplace标签选中的启动屏幕,该标签用于可下载的包。在角色和动画下 Marketplace 中搜索动画入门包。这个特定的包可以免费下载。点击动画入门包进行下载。

在包下载后,您会发现包已添加到库中。以下截图显示了Animator Starter Pack在库下的保险库中的位置:

现在我们已经将动画入门包添加到我们的库中,我们可以将其添加到当前项目中并开始尝试动画。
点击添加到项目,将出现一个弹出窗口,显示 Unreal Engine 中所有当前项目的名称。选择你为所有各种级别和教程示例创建的项目名称。如果你遵循与我相同的项目和级别命名约定,它将是MyProject。我已将上一章的Chapter4Level打开并重命名为Chapter5Level。以下屏幕截图显示了在项目中加载的AnimStarterPack:

你可以用 Persona 做什么?
Persona 为游戏开发者提供了播放和预览动画序列的能力,通过混合将动画序列合并成单个动画,创建蒙太奇,编辑骨骼/插座,以及使用蓝图控制动画。我希望你仍然记得在第三章“游戏对象 – 更多和移动”中关于蓝图所学的内容。
教程 – 将现有动画分配给 Pawn
在上一个练习中将免费动画包添加到你的项目中后,现在是时候向级别添加一些动画了。首先,打开Chapter4Level,将其重命名为Chapter5Level,然后使用内容浏览器导航到AnimStarterPack文件夹。转到Character子文件夹,点击并拖动HeroTPP到级别中。
此屏幕截图显示了如何将HeroTPP添加到级别中:

HeroTPP看起来很假,对吧?现在,让我们给他一个更好的姿势。点击HeroTPP以显示详细信息。在详细信息下的动画选项卡中输入动画模式设置。使用动画资产,在内容浏览器中导航并点击Jog_Fwd_Rifle(在AnimStarterPack中),然后点击Anim to Play旁边的箭头。

这里是动画设置的放大视图:

现在,构建并播放级别。你会看到你刚刚添加到级别中的角色正在慢跑。
这是动画角色的直接方法。然而,无论周围发生什么,角色都会继续循环这个动画。我们可能希望角色能够对环境和游戏条件做出反应。那么,我们该如何做到这一点?
我们为什么需要混合动画?
在上一个练习中,我们学习了如何使骨骼网格采用单个动画。但我们可以让骨骼网格开始沿直线奔跑吗?接下来的几个动画练习部分将解释我们如何做到这一点,并随后添加更多基本动画。
首先,你需要记住,当告诉它们播放时,动画序列/姿势才会播放。在为角色动画时,你需要关注细节,以便角色看起来正常。
现在,让我们快速回顾一下在之前的练习中我们做了什么:骨骼网格角色是一个没有附加动画的僵尸。当我们链接跑步动画并设置它播放时,角色立即看起来像是在跑步。所以,如果我们想让角色停止跑步,我们可以移除跑步动画。角色会回到看起来像是没有动画的僵尸。如果我们在一个游戏中这样做,你可能会认为动画有什么非常不正常的地方。僵尸->跑步->僵尸。这没有任何现实感。
我们如何改进它?我们从为角色设置空闲姿势开始;空闲姿势是角色站在固定位置并呼吸的状态。呼吸也是动画的一部分。它使角色看起来像是有生命的。接下来,我们设置它播放跑步动画。要停止这个动画,我们允许角色再次回到空闲位置。对于这个迭代来说,这不是一个糟糕的尝试。角色现在看起来不再像僵尸,而是看起来和感觉都很真实。
我们还能做些什么来让它更好?让我们用一个正常驾驶汽车的人(不是赛车手)的类比。当你从起始位置移动时,你会从 0 速度加速到舒适的巡航速度。当你想要停车时,你会通过踩刹车来降低巡航速度,然后逐渐回到 0(以避免突然停车并给你的乘客带来向前抛的不好体验)。同样,我们可以用这个来帮助我们设计角色的从静止状态过渡。我们将使用一个名为混合动画的工具来创建这个过渡,这样我们就可以让角色的动作更加逼真。
混合动画,正如其名所示,通过变量混合各种类型的动画。它可以是一个简单的一维关系,其中我们使用速度作为一个轴来混合动画,或者是一个二维关系,其中我们使用速度和方向来混合动画。虚幻引擎的混合动画工具能够以不同的方式设置动画的混合。
教程 – 创建混合动画
在这个例子中,我们将使用速度作为参数来混合动画。在我们列出在虚幻编辑器中实现此目的的步骤之前,让我们先简要概述一下这里的思考过程。这将有助于你理解这个过程是如何工作的,而不仅仅是简单地遵循过程来让某件事情发生。
当速度为 0 时,我们分配空闲姿势。随着速度的增加,我们应该将动画从空闲状态切换到行走动画。当速度进一步增加时,动画从行走切换到慢跑,然后是跑步。以下是混合动画效果的示意图:

接下来,让我们确定动画包中哪些动画序列适合每个阶段:
-
Idle_Rifle_Hip
-
Walk_Fwd_Rifle_Ironsights
-
Jog_Fwd_Rifle
-
Sprint_Fwd_Rifle
要创建一个简单的 1D 混合空间,我们可以右键单击Character文件夹,并转到创建资产 | 动画 | 混合空间 1D。或者,您可以在内容浏览器中选择Character文件夹,点击顶部的创建按钮,转到动画,然后选择混合空间 1D。

选择HeroTPP_Skeleton;点击此选项将创建一个新的 1D 混合空间。将newblendspace1d重命名为WalkJogRun。双击新创建的WalkJogRun以打开编辑器。这将直接将您带到编辑器的动画选项卡。注意以下截图中的这部分被突出显示。在骨骼网格字段中,我们有HeroTPP_Skeleton,这是我们之前创建混合空间时选择的。

在动画编辑器中,您可以使用资产浏览器(默认位于屏幕的右下角)。点击动画资产可以预览动画的外观。
让我们先设置X 轴标签为速度。X 轴范围从0到375。将X 轴分区保留为4。
在速度图中,分区的数量创建了我们所拥有的段。基于我们之前为空闲、步行、慢跑和跑步状态选择的设置,使用资产浏览器找到动画,点击并拖动动画到WalkJogRun标签页中的适当部分,如图所示:
Idle_Rifle_Hip在速度=0 时。在第一分区行中设置Walk_Fwd_Rifle_Ironsights。当您将动画拖动到图中时,它会在分区线之一处创建一个节点并自动对齐。在第二分区行中设置Jog_Fwd_Rifle,并在速度=375 时设置Sprint_Fwd_Rifle。要预览动画的混合效果,将鼠标沿垂直轴移动到图中。

教程 – 设置动画蓝图以使用混合动画
现在我们已经创建了一个使用速度作为参数的混合动画。我们如何让 NPC 改变速度,然后将此动画链接到它,以便随着速度的变化,播放的动画也发生变化?
对于简单的速度和动画变化实现,我们将设置动画蓝图。转到内容浏览器。导航到动画 | 角色;然后,导航并点击创建资产 | 动画 | 动画蓝图:

选择动画蓝图后,编辑器会提示你想要在哪个基类中创建动画蓝图。以下截图显示了可用的选择选项:

在这个例子中,我们将选择最基础的通用类AnimInstance来构建我们的动画蓝图。将HeroTPP_Skeleton作为此蓝图的目标骨骼网格。将此动画蓝图命名为MyNPC_Blueprint。
要检查你是否选择了正确的目标骨骼网格,请查看蓝图窗口中的骨骼标签,如图下截图所示。你应该在框中看到HeroTPP_Skeleton。截图还显示了已选择的图标签,显示了一个空的默认 AnimGraph。我们将使用图标签继续这个练习,除非另有说明。
AnimGraph
以下截图显示了默认的空白 AnimGraph。最终动画姿态将接收已指定骨骼网格的输出:

首先,我们想要通过在 AnimGraph 内部右键点击并导航到状态机 | 添加新状态机…来添加一个状态机,如图下截图所示:

重命名新创建的状态机Movement:

双击Movement。创建一个名为WalkJogRun的新状态:

双击新创建的WalkJogRun状态,在新标签页中修改状态。转到资产浏览器标签页,查找我们在上一个练习中创建的WalkJogRun blendspace,将其拖动到编辑器中。将WalkJogRun blendspace 链接到最终动画,如图下截图所示。注意,在 blendspace 节点中指定了速度=0.00;这是我们之前在早期练习中创建 blendspace 时定义的变量,用于控制动画变化。
接下来,我们需要创建一个变量,以便我们可以将值传递给WalkJogRun blendspace 的速度变量。要做到这一点,我们需要点击并拖动 blendspace 节点旁边Speed旁边的绿色点以打开上下文菜单,查找提升为变量,然后点击它。这将在 blendspace 节点中将速度提升为浮点变量,我们将设置它来控制播放动画的速度和类型。将这个新变量重命名为Speed。以下截图显示了如何创建和连接一个Speed变量到WalkJogRun blendspace,它链接到最终动画姿态:

现在,回到将Movement链接到最终动画姿态:

现在,整个 AnimGraph 已经连接起来。点击Compile,你会看到角色模型的预览更新,如以下截图所示。白色移动的圆点显示了数据如何通过系统流动。这里的速度是 0。

我们也可以使用此选项卡来查看当我们更改Speed的值时的实时预览。以下截图显示了速度为 50 时的情况。角色模型采取了一个行走姿态。

通过 AnimGraph,我们能够将Speed设置为变量,并将其链接到WalkJogRun混合空间,这反过来控制以何种速度播放哪种动画。我们现在需要考虑如何提供一些逻辑来确定 NPC 的速度如何变化。
EventGraph
EventGraph 用于将逻辑编程到蓝图之中。
在此示例中,我们将使用 EventGraph 创建逻辑来更改速度值,这将反过来影响 NPC 的动画控制。
要创建一个更复杂的智能决策过程,这被称为 AI,我们需要在 EventGraph 中使用一组与 AI 相关的节点。我们将在下一节中了解更多关于创建 AI 的内容。
以下截图显示了动画蓝图中的默认新EventGraph选项卡。
Event Blueprint Update Animation节点可以被视为在 EventGraph 网络中发送脉冲的源。随着这个脉冲通过网络传播,它会经过你设计的多个问题,以确定播放哪种动画。

Try Get Pawn Owner用于获取动画蓝图分配的所有者。这通常与另一个节点IsValid结合使用,以确保在设置值以更改动画之前有一个有效的所有者。
要使MyNPC_Blueprint在级别中为我们拥有的Hero_TPP网格上工作,我们首先需要删除Try Get Pawn Owner节点并将其替换为Get Owning Component。在 EventGraph 上右键点击并输入Get。在打开的上下文菜单中向下滚动以找到Get Owning Component。此截图显示了Get Owning Component节点所在的位置:

同样地,在编辑器中右键点击并输入IsValid以查找节点。此截图显示了获取IsValid节点的地方:

现在,将Event Blueprint Update Animation的三角形输出链接到IsValid节点的Exec输入(这也是一个三角形输入)。将Get Owning Component的Return Value输出(旁边有一个蓝色圆圈)链接到IsValid节点的Input Object(旁边也有一个蓝色圆圈)。以下截图显示了三个节点的连接。
解释是这样的,在每一个 tick 时,我们需要检查目标骨骼网格是否有效。
目前,如果目标骨骼网格有效,我们只需将 NPC 的速度设置为 100。因此,在事件图区域右键单击,并输入SetSpeed以过滤选项。点击并选择设置速度,如图所示:

将IsValid节点的Is Valid输出链接到SET Speed节点的输入(这有一个三角形符号)。然后,点击速度旁边的框,并输入100以设置速度:

保存并重新编译现在,以查看预览模型如何变化。以下截图显示了当速度设置为 100 时,模型正在播放行走动画:

现在,动画蓝图已经准备好在游戏关卡中使用。我们需要将这个动画蓝图分配给游戏中的一个角色。保存并关闭动画蓝图编辑器以返回主编辑器。
要将蓝图分配给骨骼网格,我们将点击现有的HeroTPP以显示详细信息面板。关注面板的动画部分;以下截图显示了当没有动画序列链接到骨骼网格且不使用动画蓝图时的原始设置。将动画模式设置为使用动画资产,将Anim to Play设置为无:

要使用MyNPC_Blueprint为此骨骼网格,将动画模式设置为使用动画蓝图。选择MyNPC_Blueprint作为Anim Blueprint Generated Class:

现在,编译并运行游戏;你会看到 NPC 以 100 的速度在同一地点行走。
人工智能
AI 是一个决策过程,它将 NPC 添加到游戏中。AI 是 NPC 的可编程决策过程,用于控制他们在游戏中的响应和行为。一个不由人类玩家控制的游戏角色没有智能形式,当这些角色需要更高形式的决策过程时,我们将其应用于它们。
多年来,游戏中的 AI 取得了巨大的进步,NPC 可以被编程以以某种方式行为,有时,带有某种形式的随机性,使其几乎不可预测,这样玩家就没有简单的、直接的策略来赢得关卡。
决策过程,也是 NPC 的逻辑,存储在称为行为树的数据结构中。我们将首先学习如何设计一个简单的行为树,然后学习如何在虚幻引擎 4 中实现它。
理解行为树
学习如何设计一个好的决策树非常重要。这是程序员或脚本编写者依赖的基础,以创建游戏中的角色行为。行为树是建筑师为设计你的房子而设计的建筑蓝图。
行为树有根节点,这些根节点分支成多个子节点层,这些子节点从左到右排序(这意味着在遍历子节点时,你总是从最左边的节点开始)。这些节点描述了决策过程。构成行为树的节点主要分为三类:组合节点、装饰器节点或叶节点。一旦你熟悉了这三类中每种常见节点类型,你就可以准备创建自己的复杂行为:
| 组合节点 | 装饰器节点 | 叶节点 | |
|---|---|---|---|
| 子节点 | 可能有一个或多个子节点。 | 这只能有一个子节点。 | 这根本不能有任何子节点。 |
| 功能 | 根据特定类型的组合节点处理子节点。 | 根据特定类型的装饰器,这可能转换来自子节点的状态结果、终止子节点或重复子节点的处理。 | 执行特定的游戏动作/任务或测试。 |
| 节点示例 | 序列节点按顺序处理从最左边的子节点开始的子节点,收集每个子节点的结果,并将整体成功或失败结果传递给父节点(注意,即使只有一个子节点失败而其余子节点成功,整体结果也是失败)。这可以被视为一个AND节点。 | 反转器节点将成功转换为失败,并将这个反转的结果传递回父节点。它也可以相反工作。 | 射击一次叶节点显示 NPC 将射击一次,并返回成功或失败,具体取决于结果。 |
练习 - 设计行为树的逻辑
这是对如何构建行为树的一个简单概述。以下图例将帮助您识别行为树的不同组件:

示例 - 创建一个简单的行为树
下图显示了一个敌人 NPC 的简单响应。敌人只有在战争开始时才会开始攻击。

下图在先前的行为树基础上进行了扩展。它更详细地描述了敌人 NPC 应该如何接近目标。NPC 将朝向目标(在这个例子中是玩家角色)奔跑,如果足够接近,它就开始射击玩家。

接下来,我们设置更多行为来展示 NPC 将如何射击玩家。我们给敌人 NPC 一点智慧:如果有人射击它就隐藏,如果没有人射击它就开始射击;如果玩家开始朝它移动,NPC 就开始向后移动到一个更好的位置,或者进行死亡比赛(在近距离射击玩家)。

如何在虚幻引擎 4 中实现行为树
Unreal 编辑器允许使用视觉脚本蓝图以及几个 AI 组件来设计复杂的行为树。
在 Unreal Engine 4 中,也有一个选项,可以以传统方式或与蓝图视觉脚本结合的方式编程非常复杂的 AI 行为。
UE4 中的 BT 节点大致分为五类。为了回顾,我们在上一节中已经对前四个有所了解;服务节点是这里唯一的新类别:
-
根节点:行为树的起始节点,每个行为树只有一个根节点。
-
复合节点:这些节点定义了分支的根以及如何执行此分支的基本规则。
-
装饰器:这也被称为条件。它们附着到另一个节点上,并决定树中的分支,甚至单个节点是否可以执行。
-
任务节点:这也可以称为典型的 BT 中的叶节点。这些是树的叶子,即执行“操作”的节点。
-
服务节点:这些是复合节点的附件。只要它们的分支正在执行,就会以定义的频率执行。这些通常用于进行检查和更新黑板。它们取代了其他行为树系统中传统的并行节点。
导航网格
为了让 AI 角色在游戏关卡中移动,我们需要特别告诉 AI 角色地图中哪些区域是可访问的。
Unreal Engine 实现了名为导航网格的类似网格的组件。导航网格基本上就像一个体积块;你可以调整网格的大小以覆盖游戏关卡中 AI 角色可以移动的特定区域。这限制了 AI 可以移动的区域,并使角色的移动更加可预测。
教程 – 创建导航网格
前往模式 | 体积。将导航网格边界体积拖放到你的游戏关卡中。以下截图显示了在编辑器中可以找到导航网格边界体积的位置:

如果你无法在你的地图中看到导航网格边界体积,请转到编辑器中的显示设置,如下截图所示。确保导航旁边的复选框被勾选:

调整导航网格的大小和位置,使其覆盖你希望 AI 角色能够访问的地面区域。以下截图显示的是我将网格调整到适合我 AI 角色行走的地面区域。将网格向上和向下移动,使其略微高于实际的地面网格。导航网格应该大致包围地面网格。此截图显示了网格可见时的样子:

教程 – 设置 AI 逻辑
下面是本教程中我们将创建的组件概述:
-
蓝图 AIController(MyNPC_AIController)
-
蓝图角色(MyNPC_Character)
-
黑板(MyNPC_Brain)
-
行为树(MyNPC_BT)
-
蓝图行为树任务(Task_PickTargetLocation)
本教程的重要收获是学习组件如何相互连接以协同工作以创建逻辑;我们利用这种逻辑来控制 NPC 的行为。
在内容浏览器中针对这些不同文件类型的文件结构,您可以将不同的组件分组到不同的文件夹中。对于这个例子,因为我们只创建一个具有逻辑的 NPC 角色,所以我会将这些组件全部放入一个文件夹中以便简化。为此,我在主目录下创建了MyFolder。
我们从 AIController 和 Character 开始创建 NPC 的 AI 逻辑。角色蓝图是包含网格链接的对象,我们将在进行一些初始配置后将其拖放到关卡地图中。AIController 是赋予 NPC 角色逻辑的组件。
我们将在后续讨论其他三个组件。
创建蓝图 AIController
转到创建 | 蓝图。在文本框中输入AIController以按类过滤,如图所示。选择AIController作为父类。
将此 AIController 蓝图重命名为MyNPC_AIController:

我们稍后会回来配置这个。
创建蓝图角色
转到创建 | 蓝图,并在文本框中输入Character以按类过滤。选择蓝图中的Character作为父类,如图所示。将此蓝图重命名为MyNPC_Character。

将网格添加到角色蓝图并配置
双击MyNPC_Character在内容浏览器中打开角色蓝图编辑器。转到组件选项卡。
在视角空间视图中,您将看到一个空白的线框-胶囊形状的对象,如图所示。在蓝图编辑器的细节面板中,滚动到网格部分,我们将通过选择现有的网格来向此蓝图添加网格。您可以转到内容浏览器,选择HeroTPP,然后点击其旁边的箭头。或者,您也可以点击框旁边的搜索按钮并找到HeroTPP:

在选择 HeroTPP 作为骨骼网格后,您将看到网格出现在线框胶囊中。请注意,HeroTPP 骨骼网格比胶囊线框大得多,如以下截图所示。我们希望能够调整线框的大小,使其尽可能紧密地包围骨骼网格的高度和宽度。这将定义角色的碰撞体积。

此图显示了当骨骼网格的线框高度正确时的情况:

将 AIController 链接到角色蓝图
前往 MyNPC_Character 的 默认 选项卡,滚动到 AI 部分,并单击滚动框以显示可用于 AIController 的选项。选择 MyNPC_AIController 以将角色分配给使用此 AIController,如截图所示。编译、保存并暂时关闭 MyNPC_Character。

前往 内容浏览器,将 MyNPC_Character 拖放到关卡地图中。编译并播放关卡。您将看到角色出现在关卡中,但它处于静态状态。
添加基本动画
与早期将动画分配给网格的实现类似,我们将为 MyNPC_Character 添加动画。双击 MyNPC_Character 以打开编辑器。转到 默认 选项卡,滚动到 动画 部分,并分配我们之前为该角色蓝图创建的动画蓝图(MyNPC_Blueprint)。以下截图显示了我们可以如何将动画分配给角色。编译并保存 MyNPC_Character:

现在,再次播放关卡,您将看到角色现在原地踏步(因为我们已在动画蓝图 MyNPC_Blueprint 中将速度设置为 100)。
配置 AIController
前往 内容浏览器。然后,转到 MyFolder 并双击 MyNPC_AIController 以打开编辑器。我们现在将在 EventGraph 中添加节点以设计逻辑。
我们的首要任务是让角色向前移动(而不仅仅是原地踏步)。
在 EventGraph 中添加的节点
以下是在 EventGraph 中需要添加的节点:
-
事件刻度:这用于在每次刻度时触发循环
-
获取受控单位:这返回 AIController 的单位(这将将是 HeroTPP 的单位)
-
获取演员前向向量:这获取前向向量
-
添加移动输入:这将目标链接到 获取受控单位,并将 链接世界方向 链接到 获取演员前向向量 的输出
-
IsValid:这是为了确保在实际上更改单位值之前单位首先存在
以下截图显示了我们要创建的最终 EventGraph:

现在,再次播放关卡,您将看到角色现在正在向前走。但它走得有点太快。我们想要调整角色移动的最大速度。
调整移动速度
双击MyNPC_Character以打开编辑器。转到默认选项卡,滚动到角色移动部分,并将最大行走速度设置为100,如图所示:

创建 BlackBoardData
BlackBoardData 充当 NPC 大脑的内存单元。这是您存储和检索用于控制 NPC 行为的数据的地方。转到内容浏览器,导航到创建 | 杂项 | 黑板。将其重命名为MyNPC_Brain。

将变量添加到 BlackBoardData 中
双击MyNPC_Brain以打开 BlackBoardData 编辑器。单击新建键,选择键类型为向量,并将其命名为TargetLocation。此截图显示TargetLocation已正确创建。保存并关闭编辑器。

创建行为树
行为树是 NPC 通过它来确定采取何种行动的逻辑路径。
要在虚幻引擎中创建行为树,请转到内容浏览器 | 创建 | 杂项,然后单击行为树。将其重命名为MyNPC_BT。

双击MyNPC_BT以打开行为树编辑器。以下截图显示了我们对MyNPC_BT想要的设置。它应该将MyNPC_Brain设置为黑板资产。如果没有,搜索MyNPC_Brain并将其分配为黑板资产。
如果您已经完成了前面的练习并且熟悉行为树,您会注意到在这个编辑器中有一个根节点,您可以使用它来开始构建 NPC 的行为。

使用等待任务创建简单的 BT
此处的下一步是添加一个组合节点(可以是序列、选择器或简单并行)。在这个例子中,我们将选择并使用序列节点来扩展这里的行为树。您可以点击并拖动从根节点以打开上下文菜单,如图所示。或者,只需右键单击打开菜单并选择您想要创建的节点。

我们将从序列节点添加一个等待任务。点击并拖动以从序列节点创建一个新的连接。从上下文菜单中选择等待。将等待设置为15.0s,如图所示。保存并编译MyNPC_BT。

编译后,在行为树编辑器中点击播放。你会看到光线通过链接移动,特别是从序列节点到等待 15 秒的等待任务。
使用行为树
现在我们已经有一个简单的行为树实现,我们想让我们的 NPC 角色开始使用它。我们该如何做?前往内容浏览器 | 我的文件夹,双击MyNPC_AIController以打开编辑器。前往我们最初创建简单向前移动实现的事件图选项卡。断开IsValid节点和添加移动输入之间的初始链接。根据以下截图重新布线,将IsValid节点链接到一个新的运行行为树节点。在运行行为树节点中,将BTAsset分配给MyNPC_BT。接下来,将事件计时器替换为事件开始播放(因为 BT 现在将替换这里的思考功能)。保存并编译。

为行为树创建自定义任务
我们现在想让 NPC 在地图上选择一个位置并朝它走去。
这需要创建一个自定义任务,其中 NPC 必须选择一个目标位置。我们已经在 BlackBoardData 中创建了一个条目来存储矢量值。然而,我们还没有创建一种方法来分配数据值。这将通过创建一个自定义行为树任务来完成。
前往内容浏览器 | 创建 | 蓝图。对于父类,搜索BTNode并选择BTTask_BlueprintBase,如图所示。将此任务重命名为Task_PickTargetLocation。

双击新创建的Task_PickTargetLocation。前往事件图,创建以下节点,并将这些节点链接起来:
-
事件接收执行:将拥有者演员链接到获取演员位置的目标。当PickTargetLocation执行时,事件接收执行开始。
-
获取演员位置:将返回值链接到半径节点中的获取随机点的原点。
-
设置黑板值为矢量:将事件接收执行链接到设置黑板值为矢量的执行箭头。
-
在半径内获取随机点:将返回值链接到设置黑板值为矢量的值输入。
-
执行完成:将设置黑板值为矢量链接到执行完成的输入。
![为行为树创建自定义任务]()
注意到有一个新目标位置变量链接到设置黑板值为矢量的键。我们需要为这个创建一个新的变量。点击+变量,如图所示,以创建一个新的变量。将新变量命名为New Target Loc。

点击新创建的 New Target Loc 以显示变量的详细信息。选择 BlackBoardKeySelector 作为变量类型,如图所示:

保存并编译自定义任务。
在 BT 中使用 PickTargetLocation 自定义任务
从当前的 Sequence 组合节点添加一个新的链接。将 Task_PickTargetLocation 节点放置在 Sequence 节点的左侧,以便它首先执行,如图所示。确保将 New Target Loc 设置为 TargetLocation:

用 Move To 替换 Wait 任务
删除 Wait 节点,并在其位置添加 Move To 节点。确保将 Move To 的 Blackboard Key 设置为 TargetLocation,如图所示:

编译后,点击 Play 运行游戏。双击 MyNPC_BT 打开行为树编辑器。你会看到光线穿过链接,以及黑板上 TargetLocation 值的变化,如图所示:

记得回到地图级别,看看 NPC 现在的行为。NPC 现在会选择一个目标位置,然后移动到目标位置。然后,它会选择一个新的目标位置并移动到另一个地方。
通过这个示例,你已经详细了解了如何设置 AI 行为以及让 AI 在你的关卡中工作。挑战自己,利用本节中获得的知识创建更复杂的行为。
游戏中的 AI 实现
我相信你已经注意到,我们确实需要创建更复杂的行为来使游戏更有趣。在实现方面,通常通过编程和利用编辑器功能结合使用,可以更容易地实现更复杂的 AI,并将这一过程进一步推进。因此,了解如何通过编辑器触发 AI 以及如何为你的游戏自定义 AI 非常重要。
摘要
本章涵盖了动画和人工智能,这两个主题在游戏开发中都是非常重要的,肯定还有更多关于它们的内容可以学习。我希望通过本章,你现在对这些两个主题有了深入的理解,并将你的技能用于进一步探索 Unreal 编辑器中的更多功能,以创建更酷的内容。
我们简要了解了动画的历史,以及今天如何通过各种 3D 建模软件在 3D 计算机游戏中创建动画,最后是如何将此动画导入 Unreal Engine 以在游戏中使用。动画序列是动画在 Unreal 中存储/播放的格式,你已经了解了一种简单的混合技术来组合不同的动画序列。
个人而言,我非常喜欢人工智能对游戏做出的贡献。在本章中,你学习了构成人工智能逻辑的不同组件。主要的人工智能逻辑是通过行为树来执行的,我们也学习了如何从逻辑角度构建行为树,以及如何通过使用黑板数据、任务、组合和其他节点将这些逻辑复制到虚幻引擎编辑器中。
本章的结尾,我们已经涵盖了创建游戏所需的大部分内容。在下一章中,你将学习如何将声音和粒子效果添加到游戏中。
第六章:粒子系统与声音
在本章中,我们将触及游戏组件中极其重要但往往被忽视的部分,除非它们设计不当或位置不当。是的,我们将在本章中涵盖粒子系统和声音。在大多数游戏中,它们融合得如此自然,以至于很容易被遗忘。它们也可以用来创造游戏中最难忘的时刻。
简单回顾一下,粒子系统常用于在游戏中创建火花、爆炸、烟雾、雨、雪和其他类似效果,这些效果是动态的、有点模糊且具有随机性。声音可以是环境声音,如树叶沙沙声和风声,一次性声音,如厨房里锅子掉落的声音,或重复性声音,如角色的跑步脚步声甚至收音机播放的音乐。声音可以用来设定游戏氛围,提醒玩家注意某些需要关注的事情,并为场景提供现实主义,使一个地方变得生动。让我们开始吧。
什么是粒子系统?
粒子系统是一种模拟模糊物体(如雨、火、云、烟和水)的方法,这些物体没有平滑、明确的外表面,且是非刚性的。该系统通过控制许多小几何对象或精灵的运动、行为、交互和外观,实现了一种优化方法,以获得这种流畅和动态的视觉表现。
通过使用由不同形状、大小、材料和纹理组成的不同粒子,具有不同的运动速度、旋转方向/速度、生成率、浓度、可见持续时间等因素的组合,我们能够创建出大量动态复杂的系统。
在本章中,我们将使用虚幻的粒子系统编辑器和 Cascade 编辑器来了解粒子系统的组件,并使用这些编辑器为您的场景创建一些附加内容。
探索现有的粒子系统
我们首先来看看在虚幻引擎 4 的默认包中我们能得到什么样的粒子系统。转到内容浏览器 | 游戏 | 粒子。有几个粒子系统我们可以直接拖放到场景中,并查看它们的外观。
要打开粒子系统,只需双击任何一个系统。让我们一起来查看P_Fire。您可以随意查看其他系统。然而,我将使用这个例子来了解我们为了创建我们场景的新粒子系统需要什么。此截图显示了编辑器中的P_Fire:

在左侧是视口,我们可以预览粒子系统。在右侧的发射器选项卡中,你可以看到几个带有火焰(两次)、烟雾、火星和火花字样的盒子列。
发射器可以被视为构成粒子系统的独立组件,你可以根据你想要创建的内容为每个发射器赋予不同的属性。当你将多个发射器组合在一起时,你会看到它们组合起来为你提供一个完整的视觉效果。在这个P_Fire粒子系统中,你可以看到火焰以不可预测的方式移动,伴随着一些火花和火星漂浮,烟雾模拟火焰爆发。在下一节中,我们将探讨更多具体的术语,这些术语描述了 Unreal Engine 4 中的粒子系统。
粒子系统的主体组件
简单来说,以下段落(摘自在线可用的官方 Unreal 4 文档)非常恰当地描述了粒子系统中不同组件之间的关系:
"模块,用于定义粒子行为,并放置在...发射器,用于发射特定类型的粒子以产生效果,可以在...粒子系统中放置任意数量的发射器,粒子系统是内容浏览器中可用的一项资产,然后可以反过来由...发射器演员引用,发射器演员是存在于你的关卡中的一个可放置对象,用于控制粒子在你的场景中如何使用。"
多次阅读以确保你对不同组件之间的关系有清晰的认识。
因此,正如我们在前面关于P_Fire的描述中提到的,我们知道发射器被标记为火焰、火星、火花、烟雾等等。每个发射器的不同属性是通过向其中添加模块来定义的,例如生命周期、初始速度等等。所有发射器共同构成了一个粒子系统。最后,当你将发射器放置在游戏关卡中时,实际上你是在拖动引用特定粒子系统的发射器演员。
模块
默认必需和生成模块是每个发射器都需要拥有的模块。还有一长串其他可选模块,Cascade 粒子编辑器提供这些模块以自定义你的粒子系统。在我使用的当前版本编辑器中,我有加速度、吸引、光束、相机、碰撞、颜色、事件、杀死、生命周期、位置、轨道、方向、参数、旋转、旋转速率、大小、生成、子 UV、矢量场和速度模块。
我们将通过一个基于 P_Fire 的简单练习,从这长长的模块列表中涵盖一些常用的模块。我理解,如果我只是简单地给出您可以在网上轻易找到的所有定义,那么在这里掌握基础知识将会非常无聊且不太有用。相反,我们将通过自定义 P_Fire 来创建我们关卡中的壁炉,从而进入这一节。同时,我们将了解不同模块中可以调整的关键值。这样,您可以看看这些值如何影响粒子系统的外观。
关于每个模块和参数的定义的更详细文档,您可以参考 Unreal 4 在线文档(docs.unrealengine.com/latest/INT/Engine/Rendering/ParticleSystems/Reference/index.html)。
常用的模块如下所示:
| 模块 | 它可以控制的键参数 |
|---|---|
| 必需 | 用于粒子的材质 |
| 生成 | 生成的速率和分布 |
| 初始大小 | 初始粒子的尺寸 |
| 生命周期 | 粒子保持可见的时间长度 |
| 生命周期中的颜色 | 粒子在其生命周期中的颜色 |
粒子系统的设计原则
粒子系统的设计原则可以通过研究和迭代创意过程进行配置。让我们在接下来的部分中逐一查看。
研究
细节可能是设计逼真粒子系统的关键。通常,创建粒子系统属于艺术家的领域,因为我们需要艺术感来创建一个视觉上吸引人且在一定程度上逼真的效果复制品。
首先,研究一下实际效果看起来是什么样子是很好的。以下是一些帮助您开始的步骤:
-
确定所需的不同组件(将粒子效果分解为不同的组件)。
-
确定不同组件之间的关系(相对大小的粒子、生成速率、生命周期等)。
-
接下来,看看在 计算机图形学(CG)空间中创建的其他类似效果。这样做的原因是,有时实际效果可能有点单调,而且有许多令人惊叹的视觉效果人员,您可以向他们学习,为效果增添一些活力。因此,花点时间检查一下别人已经做了什么,而不是花大量时间实验却得不到想要的结果,这是一个很好的主意。
迭代创意过程
创建你想要的完美外观的粒子系统通常需要相当多的调整和参数试验。做到这一点的关键是了解有哪些参数以及它们的影响。在设计初期阶段,你也应该尝试添加或删除某些模块,以了解它们实际上如何影响系统的整体外观。这并不意味着越多越好。此外,保存迭代备份副本也是明智之举,这样你就可以轻松地回到之前的版本。
我认为,在创建粒子系统方面非常熟练,涉及良好的设计规划、有耐心进行迭代以及进行小的调整以获得你最终想要的外观。
示例 – 创建壁炉粒子系统
在本例中,我们将复制P_Fire并编辑它以在级别中创建一个壁炉。我们还将更改当前级别的一部分,其中我们必须放置这个新的壁炉粒子系统。
前往内容浏览器 | 粒子,选择P_Fire并复制它。将其重命名为P_Fireplace。此截图显示了在粒子文件夹中创建P_Fireplace的方式:

让我们打开Chapter5Level并将其重命名为Chapter6Level。我们首先将在级别中添加一个壁炉结构,为这个壁炉效果设定上下文。这将帮助你更好地跟随创建过程。此截图显示了原始客厅空间:

以下截图显示了带有壁炉的修改后的客厅空间:

如果你打算构建它,此截图显示了壁炉结构的放大版本:

放大金属通风口将看起来像这样:

我们在这里所做的是删除灯光和低柜结构,并用这个替换:
-
TopWoodPanel(材料:M_Wood_Walnut):X = 120, Y = 550, Z = 60
-
玻璃周围的混凝土柱(材料:M_Brick_Cut_Stone)
-
ConcretePillar_L和ConcretePillar_R:X = 100, Y = 150, Z = 220
-
ConcretePillar_Top:X = 100, Y = 250, Z = 100
-
壁炉玻璃和内部(材料:M_Glass)
-
Fireglass:X = 5, Y = 250, Z = 120
-
MetalPanel和MetalPanel_Subtractive:X = 40, Y = 160, Z = 10
-
FireVent1到FireVent5
使用以下设置的 BSP 减法圆柱体,如图所示。在这里,Z 是 10,外半径 是 3,侧面 是 8:

下方扩展结构(由两个 BSP 组成)包括以下内容:
-
较薄的扩展平台:X = 140,Y = 550,Z = 10
-
较厚的底部:X = 120,Y = 550,Z = 30
制作P_Fireplace
现在,双击P_Fireplace以打开级联粒子系统编辑器。由于我们从P_Fire中复制了它,它具有与P_Fire相同的发射器:两个火焰,一个烟雾,一个火花,一个火星和一个扭曲模块。
观察当前视口。你看到了什么?原始的P_Fire效果更像是随机爆发的火焰序列,在初始爆发后很快消失。我们为创建的壁炉需要什么样的火焰?我们需要更多或更少的连续且移动较慢的火焰,这些火焰在固定位置悬浮。
带着这种差异和目标意识,我们接下来将确定我们想要保留哪些P_Fire组件作为壁炉的火焰效果。
观察系统的单个发射器
使用每个模块中的单独按钮和复选框,切换S的开关,并交替标记/取消标记复选框以观察单个组件。此截图显示了单独按钮和复选框的位置:

删除非必要发射器
第一步是删除第二个火焰发射器(第一个是最左侧的)和烟雾发射器。我认为这样做的原因是,我可以使用单个火焰来为壁炉创建火焰效果。删除烟雾发射器主要是因为这是一个气/电火焰;因此,我预计烟雾会少一些。你也可以选择先取消勾选窗口顶部的复选框,隐藏整个发射器,然后再永久删除它。
专注于编辑火焰发射器
保留唯一的火焰发射器,火焰仍然在某个半径内的随机位置出现,然后很快消失。我们将逐一解决以下问题:
-
配置寿命:因此,由于我们需要让火焰持续燃烧而不是短时间爆发,我将首先调整寿命属性,以便火焰在消失之前燃烧更长的时间。将分布浮点均匀设置为最小值为0.7,最大值为1.0,分布常数为1.2。
-
移除恒定加速度+:现在,火焰在屏幕上停留的时间更长,然后消失。然而,火焰似乎在生成后从生成位置漂移。对于一个壁炉,火焰大致保持在相同的位置。因此,我在火焰模块中取消勾选复选框以关闭恒定加速度+。现在,火焰似乎很少从生成位置漂移。
-
移除初始速度:在移除加速度模块后,火焰看起来仍然像是在远离;我猜测这是因为粒子有一些初始速度,所以我关闭了这个模块来证实我的怀疑,并且看起来效果不错。
-
配置生成:由于火焰很小,看起来相当稀疏,这会在短时间内生成区域内产生一些空白空间。我可以调整火焰的大小使其更大,但当我这样做时,火焰看起来过于扭曲。所以,我决定增加生成率,这样每分钟就能产生更多的火焰。将速率缩放分布的5.0改为20.0。将分布浮点常数从1.0增加到3.0。
查看完整的粒子系统
现在,我已经重新开启了其他发射器,以查看整个粒子系统效果,并看看是否需要更多的编辑。现在看起来作为壁炉火焰已经相当不错了,所以我在这里停止了。请随意调整其他属性以改进设计。这些都是修改现有粒子系统的基本方法,我希望你通过这次练习已经熟悉了粒子系统编辑器。
声音和音乐
声音和音乐是游戏体验的重要组成部分。你有没有看过电视,音量调到静音?仅仅看字幕和唇语是不够的。你想要听到屏幕上的人物在说什么,以及他们是如何说的。对于游戏来说,情况基本上是相似的,而且,通常,你会通过声音和音乐获得提示。如果你玩过《异形:隔离》,你需要听游戏中的声音来判断是否有异形朝你这边靠近。这在游戏中可能是生死攸关的事情。这基本上决定了你最终是成为赢家还是成为异形的美食。那么,我们现在准备好学习如何为游戏制作声音和音乐,以及如何使用虚幻引擎编辑器将它们整合到我们的游戏关卡中了吗?
我们如何为游戏制作声音和音乐?
许多游戏制作都有专为游戏场景编写的原创音乐;一些游戏还使用专业歌手演唱的实际歌曲作为主题曲。游戏中的音乐非常重要,并且被游戏粉丝深深记住。有时,音乐本身就足以唤起游戏体验的记忆。因此,游戏工作室需要花时间创作合适的音乐来补充他们的游戏。
如果你是一个视频游戏音乐的超级粉丝,你也可以去参加音乐会,那里管弦乐队演奏流行游戏的音乐(查看Video Games Live)。
为游戏创作音乐与为作品创作音乐非常相似;当它播放时,应该激发适当的情感。音乐的选择需要与游戏的节奏和情境相匹配。以 JRPG 游戏为例,你应该能够区分战斗音乐和你在菜单中、加载游戏时或刚刚赢得战斗时播放的音乐。通常,音乐是根据游戏的需求创作的,音乐作曲家可能需要提出几个不同的版本,并让团队和/或管理层审查,然后选择最佳作品。
如果你没有打算为你的游戏创作原创音乐或声音,现在网上可以找到许多免费下载的声音和音乐。在使用免费在线音乐和声音时,务必确保在将它们融入你的游戏中时,没有违反任何数字版权或版权。
音质
我们讨论音质的原因是因为音质,就像图像质量一样,在当今社会非常重要。我们今天已经使用了 4K 分辨率的图像质量,未来将有更多设备和游戏支持这一标准。那么声音呢?听觉体验需要与图像质量相匹配,并不仅仅是提供单声道或立体声声音。声音体验也已经发展到多声道环绕声,从 5.1、7.1 开始,现在甚至更高级,以获得逼真的沉浸式音频体验。这绝对是在创建、存储和播放音频文件时需要考虑的事情。
声音是如何录制的?
声音以模拟波的形式产生,是连续的波,你将在接下来的图中看到。我们可以通过录音设备录制环绕声。对于多声道录音,你需要有某些方法来录制可以使用简单录音设置的音乐,这种设置被称为十点树。在这里,麦克风以特定的方式放置,以捕捉来自源头的左、右、前和后的声音。还有许多处理技术可以过滤和转换录制的声音,以模仿每个通道所需的各个组成部分。
我们以接近的时间间隔(采样频率即为采样间隔的速率)采集钢琴产生的模拟声波样本。从模拟波中采集样本以数字方式存储的过程称为脉冲编码调制(PCM)。这些样本可以存储在未压缩的 PCM 类似格式中,或者使用音频压缩技术压缩成更小、更易于管理的文件大小。Wav、MP3、Ogg Vorbis、Dolby TrueHD 和 DTS-HD 是音频通常保存的一些格式。理想情况下,我们希望将音频保存到无损压缩格式中,以便我们得到一个包含惊人声音的小型可管理文件。
当播放数字格式的声音时,使用存储的信息重建模拟声音波。与原始模拟声音波非常相似是确保声音质量良好的方法之一。通过增加通道数量,使用基本的 5.1 环绕声创建 3D 音效,这需要五个扬声器,一个用于前左,一个用于前右,一个用于中心,一个用于后左(作为环绕),一个用于后右(作为环绕)和一个低音炮,也极大地改善了听觉体验。
Unreal 音频系统
现在我们已经对为什么游戏需要音频以及它是如何创建和录制的有了基本的了解。让我们了解 Unreal 音频系统以及可以用来将这些音频文件导入游戏的编辑器,我们还将了解可以用来编辑和控制播放的工具。
将音频导入 Unreal
我们如何将音频文件导入 Unreal?需要注意哪些事项?
音频格式
Unreal 仅支持导入.wav格式的声音。.wav格式是一种广泛使用的格式,可以存储原始未压缩的声音数据。
采样率
推荐的采样率为 44100 Hz 或 22050 Hz。如前所述,采样率决定了模拟波记录的频率。频率越高(以赫兹或 Hz 计),收集的模拟波数据点越多,这有助于更好地重建波形。
位深度
位深度设置为 16。它决定了音频波振幅可以记录的粒度,也称为声音的分辨率。对于 16 位的位深度,可以得到高达 65,536 个整数值(2¹⁶)。我们之所以关注位深度,是因为在模拟波的采样过程中,波振幅的实际值被近似为基于位深度可以存储的某个整数值。以下图显示了两种不同的位深度。左侧的图显示了位深度低时,信号采样不准确,因为它以较大的增量进行采样。右侧的图显示了位深度高时,可以以较小的增量进行采样,从而更准确地表示波形:

波形表示精度损失可以称为量化误差。当位深度太低时,量化误差会很高。
信噪比(SQNR)是用于确定这种转换质量的测量方法。它是通过最大标称信号强度与量化误差之间的比率来计算的。比率越好,转换质量越好。
支持的声音通道
Unreal 目前支持单声道、立体声、2.1、4.1、5.1、6.1 和 7.1 等通道。
当将文件导入虚幻引擎时,请注意文件命名约定,以确保正确的声音从正确的声道播放。
以下表格显示了 7.1 环绕声配置以及所有必要的文件命名约定,以确保正确播放:
| 扬声器 | 前左 | 前中 | 前右 | ||
|---|---|---|---|---|---|
| 扩展名 | _fl |
_fc |
_fr |
||
| 扬声器 | 左侧 | 低频(通常称为低音炮) | 右侧 | ||
| 扩展名 | _sl |
_lf |
_sr |
||
| 扬声器 | 后左 | 后右 | |||
| 扩展名 | _bl |
_br |
此表显示了用于 5.1 环绕声系统的文件:
| 扬声器 | 前左 | 前中 | 前右 | ||
|---|---|---|---|---|---|
| 扩展名 | _fl |
_fc |
_fr |
||
| 扬声器 | 左侧 | 低频(通常称为低音炮) | 右侧 | ||
| 扩展名 | _sl |
_lf |
_sr |
此表显示了用于 4.0 系统的文件:
| 扬声器 | 前左 | 前右 | |||
|---|---|---|---|---|---|
| 扩展名 | _fl |
_fr |
|||
| 扬声器 | 左侧 | 右侧 | |||
| 扩展名 | _sl |
_lf |
_sr |
虚幻引擎声音格式和术语
在虚幻引擎声音系统中,有几个术语我们需要熟悉:
-
声音波:这些是实际以
.wav格式存在的音频文件。 -
声音提示:这是声音波文件的控制系统。声音提示是我们用来操纵声音波音量、开始和结束的工具。因此,为了控制音频文件在游戏中的播放方式,您可以在声音提示上编辑属性,这反过来会影响与之关联的波形文件或文件。
-
环境声音演员:这是您添加到游戏关卡中的类演员。此演员与声音提示相关联,以播放您为游戏所需的音频文件。
现在,我们已准备好在虚幻引擎中使用声音编辑器。
声音提示编辑器
由于我们并非编辑实际的音频文件,因此虚幻引擎中的声音编辑器被称为声音提示编辑器。实际上,我们正在编辑通过称为声音提示的控制设备播放声音的方式。
让我们更深入地了解声音提示编辑器的功能。
如何打开声音提示编辑器
前往内容浏览器 | 音频。打开任何声音提示文件,双击以打开声音提示编辑器。此截图显示了在内容浏览器中找到声音提示的位置:

当您双击声音提示时,声音提示编辑器会打开,其外观与蓝图编辑器非常相似,具有模块和线条。此截图显示了Collapse_Cue的声音提示编辑器的外观:

注意,在前面的屏幕截图 Collapse_Cue 中,它有两个输入,分别称为 Wave Player: Collapse 01 和 Wave Player: Collapse 02。这些输入连接到一个 Random 节点,输出连接到最后一个节点,称为 Output。这样做的作用是,当播放这个声音提示时,两个折叠声音中的一个会被随机选择并播放。这为在相同情况下播放的声音创造了多样性;它们都是折叠声音效果,但略有不同。
我们将在稍后了解更多关于我们可以用来设计声音提示的组件。我们还将进行一个练习,在编辑器中创建自己的声音提示。
练习 – 将声音导入到虚幻编辑器中
你可能会遇到这样的情况,你创建了自己的音频效果文件,并想在游戏中使用它。我们将首先从导入这个文件开始。
对于这个练习,我使用了一个从维基百科网站下载的音频剪辑(en.wikipedia.org/wiki/The_Four_Seasons_(Vivaldi)),其中包含维瓦尔第的《四季》作品。这是由 John Harrison 分享的。
这个文件是 Oggs 格式,是的,虚幻引擎只支持 .wav 文件。首先,我使用 Vorbis 网站上列出的软件将文件类型从 .ogg 转换为 .wav(vorbis.com/software/)。请注意 Unreal 对 WAV 文件设置的要求。
在获得正确的 wav 文件后,我们就可以将其导入到声音编辑器中。转到 内容浏览器 | 内容 | 音频,右键单击以显示上下文菜单,导航到 新建资产 | 导入到 /Game/Audio,然后浏览到保存 .wav 文件的文件夹并选择它。这张截图显示了在编辑器中找到导入 .wav 文件功能的位置:

这张截图显示了如何将 Vivaldi WAV 文件成功导入到 Audio 文件夹中,并使用 WAV 文件设置:

接下来,为刚刚导入的维瓦尔第声音波形创建一个声音提示。为了回顾,声音提示用于控制声音波形文件的播放。声音波形文件仅包含音频文件的内容。如截图所示,右键单击声音波形资产,在上下文菜单中选择 创建提示:

双击新创建的声音提示(其默认名称与声音波形文件同名,并带有Cue后缀)。在此例中,它将是Vivaldi_Spring_Allegro_ByJohnHarrison_Cue。双击此提示以查看内容。以下截图显示了Vivaldi_Spring_Allegro_ByJohnHarrison_Cue的内容。波形播放器的输出直接连接到输出。这是声音提示中最简单的连接,我们将波形输入到输出。

现在,让我们听听我们导入的声音。在声音提示编辑器中,查找编辑器左上角的播放提示按钮。查看以下截图以确定按钮的位置。点击按钮后,你会听到我们刚刚导入的音乐。你刚刚成功地将自定义波形文件导入到 Unreal 中。现在,让我们将其转移到游戏关卡中。

练习 – 向关卡添加自定义声音
为了在关卡中放置声音,你需要使用环境声音节点将其与声音提示关联,这将反过来播放音频文件。
要创建一个环境声音节点,转到模式 | 所有类,将环境声音拖放到游戏关卡中:

点击你刚刚放置到关卡中的环境声音演员,并将其重命名为AmbientSound_Vivaldi。在详细信息面板中,滚动到声音部分,点击声音旁边的箭头以显示你在游戏关卡包中的声音资产,如下面的截图所示。选择Vivaldi_Spring_Allegro_ByJohnHarrison_Cue。

通过点击AmbientSound_Vivaldi的详细信息面板中的播放按钮,检查你是否还能听到音乐。现在,让我们构建关卡并运行它。注意,当你开始关卡时,音乐会播放。
配置声音提示编辑器
双击Vivaldi_Spring_Allegro_ByJohnHarrison_Cue以打开声音提示编辑器。注意,在右侧有一个调色板,其中包含节点列表,如下面的截图所示。这些节点可以用来控制声音的播放或听到的方式。

如果你发现无法使用列表中的节点来实现你的声音设计,你可以通过 UE4 源代码请求创建新的节点。
概述
粒子和声音都是游戏中的非常有趣的组件,它们需要非常专业的技能,非常适合它们的设计和创建。粒子系统创建者通常拥有强大的艺术和技术背景;需要艺术感来创建合适的纹理,而技术能力有助于调整分布/值,以创建适当的整体效果。音频工程师通常拥有强大的音乐背景。他们可能是作曲家和音乐家,对游戏充满热情。
在本章的前半部分,我们学习了什么是粒子系统。我们学习了粒子系统是如何用于创建游戏中的效果的,例如下雪、降雨、火焰、烟花、爆炸效果等等。粒子系统可以通过发射器的组合,有效地使用纹理渲染小型的移动模糊粒子。每个发射器都有许多可配置的模块,可以控制属性,如出生率、寿命、速度以及创建所需效果所需的加速度。在本章中,我们介绍了如何编辑现有的火爆炸粒子系统,将其转变为壁炉效果,并将其放置在客厅中。通过这个例子,我们还探讨了可以应用于粒子系统设计过程的一些基本原理,以及如何对几个流行的基本模块进行微调,以创建我们想要的效果。
本章的后半部分介绍了如何在关卡中包含声音。我们学习了声音/音乐的构思、创作、录制,以及最终导入到 Unreal 编辑器中的过程。我们还介绍了 Unreal 编辑器目前支持的音频格式,并对每个组件进行了一些解释,以便您更好地了解声音。接下来,我们进行了一个简单的练习,导入在线音频文件,并在游戏关卡中播放我们下载的音乐。
我希望您对本章中游戏所需的粒子系统创建过程和音频效果有了更深入的理解。我们将通过一些地形编辑继续提升我们的游戏关卡,并在下一章中创建电影般的效果。
第七章. 地形和电影
在本章中,我们将介绍一些增强级别的功能。我们将为我们的级别创建一些户外地形,并在游戏级别的开始处添加一个简短的电影序列。
在本章中,我们将探讨以下主题:
-
创建户外地形
-
在同一级别的开始处添加一个电影序列的快捷方式
介绍地形操作
当你想创建大型自然景观区域时,例如覆盖有植被的山地或山谷区域,就需要进行地形操作。这可能包括树木/草地、被岩石或雪覆盖的湖泊和河流等。Unreal Engine 4 中的景观工具允许你轻松地为游戏地图设计各种地形,同时允许游戏以合理的帧率运行。
当在具有大型户外地形的地图上游戏时,例如,拥有大量树木或许多海拔的地图,如山脉,由于需要在屏幕上渲染的多边形数量增加,预期的有效帧率可能会降低。因此,熟练掌握景观设计,以保持多边形数量在可控范围内,对于确保地图实际上可玩非常重要。同时,也要记住使用优化技术,如 LOD 和雾效来掩盖远处的地方,这可以给你一种无尽开阔地的感觉。如果你计划创建一个开放世界,你也可以使用 Procedural Foliage 工具(在 Unreal 4.8 及以上版本中可用)为你生成这些特征。
让我们熟悉 Unreal Landscaping 工具,并开始为我们的游戏级别创建一些户外环境。我们将学习如何使用低矮的山丘、草地和树木对户外空间进行简单的等高线绘制。然后,我们将在该区域创建一个小池塘。为了更精确的景观设计,我们可以导入高度图来帮助我们创建景观。
练习 - 使用景观工具创建山丘
让我们执行以下步骤,使用景观工具创建山丘:
-
打开
Chapter6.umap并将其保存为Chapter7_Terrain.umap。 -
转到模式,点击景观工具(图标看起来像一座山),然后点击管理。
-
选择创建新(这里的另一个选项是使用高度图,我们将在本章后面介绍)。
-
要选择材质,您可以点击搜索图标并输入
M_Ground_Grass,或者转到内容浏览器 | 内容 | 材质,选择M_Ground_Grass,然后点击景观材质旁边的箭头以分配材质。 -
对于这个例子,我们将保留所有景观设置在其默认值,如下所示。下一节将更详细地解释其余值的选项:
-
比例:X = 100 Y = 100 Z = 100
-
区域大小:63 x 63 四边形
-
组件大小:1 x 1 区域
-
组件数量:8 x 8
-
整体分辨率:505 x 505
-
以下截图显示了我们所创建的草地景观的俯视图。注意 64 个绿色方块。您需要切换到顶视图才能查看它。

现在,我们将切换到视角视图。草地景观看起来像覆盖了房子的半边。请看下面的截图:

注意,如果我们是在一个空地图上创建景观,我们就不会遇到这个问题,因为我们会在景观草地上建造房子。所以,在这里我们需要执行一个额外的步骤,将景观草地移动到房子下面,这样我们就不会有一个被草地淹没的房子。您需要从世界大纲中选择景观和景观 GizmoActiveActor,如图以下截图的右侧所示。记得将模式切换回放置,而不是我们用来创建草地的景观模式。放置模式允许选择对象的平移/旋转。将草地移动到房子下方,如图以下截图所示:

注意
注意,这一步骤是因为我们在建造房子之后添加了景观草地。
现在,我们准备好将这块平坦的土地雕刻成地形。再次转到模式 | 景观 | 雕刻。使用雕刻工具、圆形画笔和平滑衰减的组合,如图即将出现的截图所示。默认设置应如下:
-
画笔大小:2048
-
画笔衰减:0.5
-
工具强度:0.3
为了说明 2048 画笔的大小,我切换到了顶视图:

当画笔大小设置为1000时,画笔半径会减小,如图以下截图所示:

现在我们对半径的差异有了概念,我们将切换回视角视图。将您的操作屏幕调整到略微倾斜的顶视角视图,如图以下截图所示。将画笔大小设置为1000,工具强度设置为0.4:

首先,通过点击房子周围的区域来创建房子周围的低山丘。我使用了 1000 和 2048 画笔大小的混合。
以下截图显示了我在稍作处理后该区域的外观。注意,我在宽窗户前方创建了一个凹陷区域。这是通过按住Ctrl然后点击该区域实现的。这个凹陷将以餐厅前湖的形式出现。

创建两个盒子 BSP 来填充低洼区域。将湖面材质应用到盒子 BSP 上。以下截图显示了放置盒子 BSP 后的相同区域。使用平移工具确保两个 BSP 区域在低洼位置处于同一地面水平。

接下来,我润色了房屋的外部区域。使用不发光模式帮助你更好地看到房屋。以下截图显示了使用MyGreyWall材质润色后的房屋及其周围区域的外观:

返回光照模式,构建关卡,然后查看。调整地图中的任何光照,使其得到适当的照明。重建直到你对结果满意。
添加树木和植物,使该区域更加逼真。我已经从市场下载了一个包含一些叶子的包,以帮助我完成这项工作。
前往虚幻启动页面上的市场。在环境下,寻找名为开放世界演示集合的免费可下载内容。以下截图显示了市场中的免费开放世界演示集合。下载包后,将其添加到你正在工作的项目中。

现在我们已经为地图创建了一个基本的户外地形。
景观创建选项
在完成前面的练习后,你现在对虚幻引擎 4 中的景观设计的基本功能有了很好的了解。在本节中,我们将补充我们迄今为止获得的技能,并学习如何调整或利用我们可用的景观工具的功能/功能。
多个景观
在同一地图中可以有多个景观。这允许你将创建过程分成不同的层。如果你在地图中有多个景观,在修改之前你需要选择一个层。
使用自定义材质
你可以导入任何你想要用于景观的材质;你可以制作自己的草地、农作物、沙子纹理等。由于自定义材质主要用于地图的大面积,因此请记住你需要保持材质可重复使用和优化。
导入高度图和图层
为什么我们在景观设计中使用高度图?这些允许在虚幻编辑器中以更快、更精确的方式创建高程/凹槽。例如,我们可以使用高度图来存储高度为 3000 米、直径一定的山脉的高程信息。当我们导入高度图时,地形会自动根据它进行塑造。这绝对是一种节省时间的方法,帮助我们创建更精确的景观特征,而无需点击、点击、点击来雕刻。
高度图和层最初可以由艺术家使用常见的工具在外部创建,例如 Photoshop、World Machine、ZBrush 和 Mudbox。需要遵循详细说明以确保成功导入高度图。这可以在 Unreal Engine 4 文档中找到:docs.unrealengine.com/latest/INT/Engine/Landscape/Custom/index.html。
缩放
缩放设置确定景观的缩放。我们使用了 X: 100 和 Y: 100 来给出这个景观将覆盖的土地面积。Z 值保持为 100,以提供一些高度来创建地形高差。
组件的数量
组件是渲染和剔除的基本单元。与组件的总数相关联有一个固定成本;因此,它被限制在 32 x 32。超过这个值会影响您游戏级别的性能。
部分大小
部分大小确定每个部分的大小。它决定了景观如何划分。较大的部分意味着整体组件更少,因为饼被分成更大的块。管理块更少意味着整体 CPU 成本更低。
然而,与较小的部分相比,较大的部分在管理 LOD 方面并不那么有效。当有较小的部分时,我们也会得到较小的组件大小(当饼的大小相同时,将其切割成更小的块意味着如果你拿一块,你的负担会更轻)。由于组件是用于剔除和渲染的基本单元,这意味着对 LOD 变化的响应会更快,因为面积减少了。LOD 确定需要计算的顶点数量。如果 LOD 更有效,我们就有更少的计算要做,并且通过较小的部分,CPU 成本更加优化。
这里的关键是平衡部分的大小,以避免有太多的组件需要处理,而组件过少可能会导致 LOD 管理不佳。
注意
每个组件的部分
您可以选择每个组件的 1 x 1 或 2 x 2 部分。这意味着您在每个组件中可以选择有一个或四个部分。由于组件是渲染和剔除的最基本单元,对于 1 x 1 部分,您可以同时渲染一个部分。对于每个组件的 2 x 2 部分,您可以同时渲染四个部分。为了限制渲染组件所需的计算数量,每个部分的大小不应太大。
引入电影
电影、电影和电影的发展很大程度上是为了电影。今天,我们应用电影技术到非交互式的游戏序列,称为过场动画,以增强游戏体验。整体游戏体验必须考虑到过场动画,因为它们通常满足某些游戏设计目标。这些目标通常在游戏玩法之间安排,以丰富游戏中的叙事体验。
非常类似于拍摄电影,我们需要决定需要拍摄什么样的镜头,从哪个角度拍摄,需要多少缩放,需要使用多少个摄像机,以及摄像机需要采取的路径,以便发展出我们关注对象/对象的运动画面序列。用于创建此剪辑的技术被称为电影技术。
因此,在本章中,我们将首先探讨几个关键目标,解释为什么游戏需要电影,并学习一些简单的电影技术,我们可以使用。你还将了解虚幻引擎 4 提供的工具,以便应用我们学到的技术,为你的游戏创建适当的电影序列。
电影技术是由专注于为你的游戏创建过场动画的电影专家创造的。或者,你也可以聘请一个电影制作承包公司来为你专业地完成这项工作。
为什么我们需要过场动画?
当设计游戏时,相当一部分游戏设计时间被用于设计玩家如何与游戏中的对象互动,以及如何使这种互动变得有趣。游戏中的互动部分需要补充,而过场动画可以帮助填补这些空白。
在游戏中,可以使用过场动画来帮助设计师在玩家玩游戏时讲述故事。这种技巧可以在游戏开始之前使用,以吸引玩家进入任务本身,并解释为什么任务对玩家来说必须完成。这有助于玩家理解剧情,为他们的行为赋予意义,并将玩家吸引到游戏中。
过场动画的另一个目标可能是突出游戏中的关键区域,以便让玩家一瞥可以期待的内容,并给出成功赢得游戏的微妙提示。这些信息在难以击败的游戏关卡或玩家遇到游戏中的主要怪物时尤其有用。
游戏设计师有时也会使用过场动画在一场艰难的战斗后奖励玩家。它们放大了成功的效应,并演绎他们胜利的欢乐结局,以在玩家中创造积极的情绪。我相信,在游戏中利用过场动画的方法是无穷无尽的,并且我们可以以积极的方式将它们融入以增强游戏体验。
然而,确保使用剪辑场景是合理的是很必要的,因为剪辑场景实际上将游戏的控制权从玩家手中夺走。游戏应该是互动的,我们不希望当有太多剪辑场景时,将其转化为被动的多媒体体验。
在记住这些基本游戏设计目标的同时,现在让我们探讨一些技术电影基础,这将为你提供设计自己游戏电影的基础。
电影技巧
相机是用于创建电影效果的主要工具。通过调整相机功能并找到/移动相机到一个好的位置来捕捉感兴趣的关键对象,您可以实现各种电影效果。本节将提供一些技术术语,您可以用这些术语向您的同事/承包商描述如何录制特定的电影序列。
调整相机功能
这里有一些常用的功能,您可以在相机上调整以捕捉场景。
放大
对物体进行放大可以让你更接近地观察物体;提供更多关于它的细节。缩小视图将你的视角从物体移开;它提供了物体与其周围环境的关系视角。
放大是通过调整相机镜头的焦距来实现的;相机本身保持在同一位置。
视场
视场(FOV)是从空间中的特定位置和方向可见的区域。相机的视场取决于镜头,可以表示为 FOV = 2 arctan(SensorSize/2f), 其中 f 是焦距。
对于人类来说,视场是我们无需移动头部就能看到的空间区域。水平视场在眼睛的外角处结束,如下面的图像所示,左右两侧大约是 62 度(来源:buildmedia.com/what-are-survey-accurate-visual-simulations/)):

这意味着在这个视场(FOV)之外的所有事物对实体来说都是不可见的。
景深
景深(DOF)最好用照片来表示,如下面的一张,其中只有感兴趣的对象非常清晰,而其后的所有事物都是模糊的。在下面的图像中(来源:vegnews.com/articles/page.do?catId=2&pageId=2125),饺子/馄饨看起来很清晰,而在这之外,碗/瓶子是模糊的。照片中的小景深允许前景(饺子)被强调,背景被弱化。这是一种非常好的技术,可以在摄影和电影中吸引对感兴趣对象的视觉注意力。

深度场(DOF)也被称为有效的聚焦范围。确定此范围的方法是测量场景中看似清晰的最近物体和最远物体之间的距离。尽管镜头一次只能聚焦一个距离,但在正常观看条件下,清晰度的逐渐降低很难察觉。
摄像机运动
在拍摄过程中,摄像机位于不同的角度和位置,并且随着演员/车辆等移动。这种摄像机运动可以使用这里的一些术语来描述。
倾斜
摄像机的移动方式类似于你点头的方式。摄像机在固定点旋转,向上/向下转动称为倾斜。以下图显示了摄像机的侧面视图,箭头说明了倾斜:

旋转
摄像机的移动方式类似于你转动头部向左或向右看。摄像机在固定点旋转,向左或向右转动称为旋转。此图显示了摄像机的俯视图,箭头展示了旋转的工作原理:

Dolly/track/truck
拉车(Dolly)将整个摄像机向物体靠近或远离。这相当类似于拉近/推远,因为你也在靠近/远离物体,但拉车是沿着路径向物体靠近或远离,而不是像拉近/推远那样。
拖移(Trucking)是摄像机沿着轨道左右移动,即向左或向右移动。拖移常与旋转(Panning)混淆。在拖移中,整个摄像机移动,而在旋转中,摄像机保持在固定位置,只有镜头向左或向右扫动。跟踪(Tracking)是拖移的一种特定形式,它平行跟随感兴趣的物体。以下图显示了摄像机沿着路径拖移的背面视图:

脚架
脚架是摄像机在垂直轨道上上下移动。以下图展示了摄像机在垂直轨道上上下移动的情况:

捕捉场景
在捕捉场景时,整体场景最为重要。你需要考虑一些事情,比如场景的构成和照明;你选择的内容决定了剪辑场景的影响力。以下是组成良好剪辑场景时需要考虑的几个因素。
照明
光线影响场景在照片/剪辑场景中的呈现方式。我们需要设置正确的照明来捕捉场景的氛围。
构图
构图决定了拍摄方式。构图中的一切都很重要,你应该注意构图中的一切。在创建剪辑场景时,还需要考虑每个镜头如何过渡到下一个镜头。
一些构图规则
构图规则如下:
-
确保画面中的水平线是水平的,垂直线是垂直的。
-
三分法规则。这个规则将画面分为九个部分。兴趣点应该出现在画面上三分之一或三分之二的位置,而不是中心位置。例如,天空占据了画面的大约三分之二。
-
在主题的前方、上方或后方提供战略性的空白空间,以便为主题移动或观察提供空间。
-
避免半个物体被捕捉在画面中。
镜头类型
这里有一些术语用于描述可以用于画面的镜头:
-
极端广角镜头 (EWS) / 极端长镜头 (ELS): 这种镜头将主题置于环境中。镜头从远处拍摄,以便可以看到主题周围的环境。这种镜头经常用于建立场景。
-
广角镜头 (WS) / 长镜头 (LS): 在广角或长镜头中,主题占据整个画面。主题完全在画面中,周围空间很小。
-
中景镜头 (MS): 中景镜头中主题占据的画面更多,环境占据的画面更少。
-
特写镜头 (CU): 主题占据大约一半的画面。这增加了对主题的聚焦。
-
极端特写镜头 (ECU): 摄像机聚焦于主题的重要部分。
镜头计划
这是一个描述场景如何被捕捉的计划。它还描述了需要使用多少台摄像机,摄像机启动的顺序,以及为了实现场景所需的效果需要拍摄哪种类型的镜头。
熟悉 Unreal Matinee 编辑器
Unreal Matinee 编辑器类似于非线性视频编辑器,因此如果你已经使用过 Adobe Flash 等软件,那么它相当容易上手。通过为摄像机创建关键帧并将它们沿着路径移动,同时修改摄像机属性,可以创建游戏中的 matinee/cut scene。此外,你还可以使用这个 Matinee 编辑器创建或转换静态对象,使其变得动态,然后对其进行动画处理。
练习 – 创建简单的 matinee 序列
现在,让我们动手创建一个简单的 matinee 序列,用于你的游戏。计划是展示游戏开始时创建的区域。我们将从房屋的前面开始拍摄极端广角镜头。我们将使用轨道车将摄像机推向餐厅的大窗户,进入厨房区域,然后是壁炉。然后,使用第二台摄像机,从房间的角落移动到奔跑的人,并聚焦于他的脸部。
从菜单栏创建一个新的 matinee 序列,如下面的截图所示。点击 Matinee 并选择 Add Matinee:

这将打开 Matinee 编辑器,如下面的截图所示:

要创建第一个摄像机,我们将右键单击轨道区域并选择添加新摄像机组:

返回到地图,您可以在地图的角落看到一个显示摄像机正在看什么的小窗口。此截图显示了我们的第一个镜头开始的位置:

要创建下一个关键帧,下一个镜头需要拍摄的位置,回到Camera1轨道,点击运动行中 0.0 处的红色小箭头,然后按Enter。这会复制关键帧。按Ctrl并点击并拖动红色箭头到 2.00。此截图显示了如何正确操作:

现在,点击 2.00 处的红色箭头,回到地图中的Camera1。右键单击它并选择飞行员 'Camera Actor1',如图所示:

将视口移动到您想要第二个关键帧的位置。此截图显示了第二个关键帧摄像机的位置:

当视口定位,如前一个截图所示,点击视口左上角的小图标以停止飞行员模式,以便在此处固定关键帧。图标的定位如下所示:

按照我们决定的拍摄计划,我已经将Camera1沿着路径移动到壁炉处。要添加第二个摄像机,重复创建新摄像机组的步骤,并将新摄像机命名为Camera2。
现在,将第一个关键帧移动到 Camera1 最终关键帧时间轴的末尾。对我来说,这是设置为8.50 秒;我将摄像机移动到房间的角落,如下面的截图所示:

重复步骤为Camera2创建关键帧,将其沿着路径移动到跑步者处,然后聚焦于跑步者的脸部。
现在,我们有两台摄像机需要指定它们在时间轴上的播放部分。为此,我们需要创建一个新的导演组。导演组将决定哪个摄像机正在播出以及屏幕上显示什么。回到 Matinee 编辑器的轨道。右键单击并选择添加新导演组,如图所示:

这在摄像机轨道上方创建了一个导演轨道。选择 0.00 处的刚添加的导演轨道,转到顶部的功能区,并选择添加关键帧,如图所示:

上下文菜单将要求您选择Camera1或Camera2。在这种情况下,请选择Camera1。这将填充整个电影时长。要创建一个在 8.50 秒处Camera1和Camera2重叠的关键帧,请再次点击Director轨道并选择添加关键帧。这次,请选择Camera2。将此关键帧移动到8.50。此截图显示了摄像机设置的位置,以便它们可以正确播放:

最后,我们准备好播放剪辑场景。要告诉游戏在游戏开始时播放剪辑场景,我们需要使用蓝图。我希望您还记得如何使用蓝图编辑器。点击并打开关卡蓝图。添加Event BeginPlay节点,然后右键单击并搜索播放。选择播放电影演员选项,并将节点链接起来,如图所示。现在,保存并播放关卡。您将看到整个电影在您控制关卡中的玩家之前播放。

摘要
我们在本章中涵盖了地形创建和电影创建。我希望您能够利用我们探索的新技能来提升游戏关卡。
地形操作覆盖了地图的大部分区域;因此,我们还讨论了影响地图可玩性的因素。我们还进行了一个简单的练习,用一些山丘和湖泊创建我们地图的户外地形。
在开始使用编辑器之前,电影创建涉及更多的技术规划。编辑器的使用相当简单,因为它与市场上的当前视频编辑器类似。我们涵盖了创建良好电影的技术,以帮助您更好地理解它们的背景。
这是本书的最后一章和最终的总结。我真诚地希望您喜欢阅读这本书,并在 Unreal Engine 4 中玩耍。最后,我衷心祝愿您在创建自己的游戏时一切顺利。请继续努力;总有更多东西要学习,还有其他新工具可以帮助您创建您想要的东西。我相信您喜欢创建游戏;如果不,您就不会在这本无聊的书中坚持到最后。这本书仅用于向您介绍游戏开发的世界,并展示了使用 Unreal Engine 创建游戏的基本工具。剩下的旅程现在留给了您去创建一个有趣的游戏。祝您好运!别忘了给我发个消息,让我知道您未来创建的游戏。我在等待您的消息。



























浙公网安备 33010602011771号