前言

自从其诞生之初,人工智能AI)就改变了游戏开发的格局,为玩家提供了曾经被认为是科幻领域的丰富和沉浸式体验。与其他游戏开发方法不同,在这些方法中,脚本事件决定了更严格的玩家交互,而 AI 引入了不可预测性和响应性,使虚拟世界栩栩如生。

近年来,AI 技术的进步使其更加易于获取和实施,导致各种类型的智能游戏激增。这种演变使 AI 成为现代游戏开发的核心,每天数百万玩家都能从他们最喜欢的游戏中受益于更智能、更吸引人的交互。

Unreal Engine 作为一个高级平台,对于希望在其项目中利用 AI 力量的开发者来说脱颖而出。凭借一套针对 AI 开发量身定制的强大工具和功能——例如行为树和导航系统——Unreal Engine 使创作者能够构建复杂的 AI 系统,从而增强游戏玩法和玩家参与度。

如果您准备好探索 AI 开发的世界及其改善游戏的可能性,那么现在是最好的时机来深入其中!

本书面向对象

如果你是一位游戏程序员,或者更具体地说是一位 Unreal Engine 开发者,对视频游戏 AI 系统知之甚少或一无所知,并希望深入探讨这个主题,那么这本书就是为你准备的。

精通其他游戏引擎并对理解 Unreal AI 框架原理感兴趣的开发者也将从这本书中受益;然而,强烈建议您具备基本的 Unreal Engine 和 C++知识。

对游戏逻辑的热情将帮助您充分利用这本书。

本书涵盖内容

第一章开始 AI 游戏开发,温和地引导您进入 AI 游戏开发的领域,从理解 AI 行为的基本原理开始。

第二章介绍 Unreal Engine AI 系统,向您介绍 Unreal Engine 游戏框架中包含的主要 AI 元素,如行为树、导航系统和感知系统。

第三章展示 Unreal Engine 导航系统,向您介绍 Unreal Engine 中强大的导航功能,包括导航网格生成和路径查找算法等关键概念。

第四章设置导航网格,通过一个具体的项目开始,涵盖了使用 Unreal Engine 实现导航网格的必要实用技术。

第五章改进智能体导航,向您介绍优化 AI 智能体在复杂环境中移动和交互的集成算法。

第六章优化导航系统,介绍了一些策略和技术,以最大化虚幻引擎中导航系统的性能和效率。

第七章介绍行为树,向您介绍虚幻引擎框架内强大且通用的行为树系统。

第八章设置行为树,指导您通过创建和配置行为树以在虚幻引擎中驱动 AI 代理的基本步骤。

第九章扩展行为树,深入探讨了扩展行为树功能的高级技术,以创建更复杂的 AI 行为和交互。

第十章使用感知系统改进代理,展示了如何利用虚幻引擎感知系统的力量来增强虚拟环境中 AI 代理的响应性。

第十一章理解环境查询系统,对虚幻引擎框架中的环境查询系统进行了全面和详细的解释。

第十二章使用带有状态树的状态机,向您介绍用于在虚幻引擎中实现分层状态机的 StateTree 系统。

第十三章使用质量实现面向数据的计算,介绍了 MassEntity 框架,通过该框架您将能够实现高效且可扩展的面向数据计算。

第十四章使用智能对象实现交互元素,介绍了智能对象,并展示了如何在虚幻引擎环境中集成它们。

附录 - 在虚幻引擎中理解 C++,深入探讨了在虚幻引擎框架中使用 C++编程语言的基本概念和原则。

为了充分利用本书

为了充分利用本书,强烈建议您对虚幻引擎及其主要功能有良好的理解。一些 C++编程经验也将是一个优势。对游戏的强烈热情——特别是游戏逻辑——将帮助您更好地理解最先进的话题。

本书涵盖的软件/硬件操作系统要求
虚幻引擎 5.4Windows、macOS 或 Linux
Visual Studio 2019 或 2022 和 JetBrains Rider 2023+

由于本书专注于 AI 编程而不是图形,您不需要高性能的计算机来跟随所有章节。然而,为了正确运行虚幻引擎,推荐使用配置良好的 PC 和良好的显卡。

如果您使用的是本书的数字版,我们建议您自己输入代码或从书的 GitHub 仓库(下一节中有一个链接)获取代码。这样做将帮助您避免与代码的复制和粘贴相关的任何潜在错误。

下载示例代码文件

github.com/PacktPublishing/Artificial-Intelligence-in-Unreal-Engine-5
github.com/PacktPublishing/

使用的约定

本书使用了多种文本约定。

文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。以下是一个示例:“一旦项目打开,请检查内容文件夹中有什么。”

代码块设置如下:

#pragma once UENUM(BlueprintType)enum class EBatteryStatus : uint8 {    EBS_Empty = 0 UMETA(DisplayName = "Empty"),    EBS_Low = 1 UMETA(DisplayName = "Low"),    EBS_Medium = 2 UMETA(DisplayName = "Medium"),    EBS_Full = 3 UMETA(DisplayName = "Full")};

任何命令行输入或输出都按以下方式编写:

$ mkdir css
$ cd css

粗体:表示新术语、重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词以粗体显示。以下是一个示例:“在详细信息面板中,在演员|高级类别中查找标签属性,然后按**+**按钮创建一个新的标签。”

小贴士或重要注意事项

看起来是这样的。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何方面有疑问,请通过 customercare@packtpub.com 给我们发邮件,并在邮件主题中提及书名。

勘误:尽管我们已经尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将不胜感激,如果您能向我们报告这一点。请访问www.packtpub.com/support/errata并填写表格。

盗版:如果您在互联网上以任何形式发现我们作品的非法副本,如果您能提供位置地址或网站名称,我们将不胜感激。请通过 copyright@packt.com 与我们联系,并提供材料的链接。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问authors.packtpub.com。

分享您的想法

一旦您阅读了《Artificial Intelligence in Unreal Engine 5》,我们很乐意听到您的想法!请点击此处直接进入本书的亚马逊评论页面并分享您的反馈。

您的评论对我们和科技社区非常重要,并将帮助我们确保我们提供高质量的内容。

下载此书的免费 PDF 副本

感谢您购买此书!

您喜欢在路上阅读,但又无法随身携带您的印刷书籍吗?

您的电子书购买是否与您选择的设备不兼容?

别担心,现在每购买一本 Packt 图书,您都可以免费获得该书的 DRM 免费 PDF 版本。

在任何地方、任何设备上阅读。直接从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。

优惠远不止于此,您还可以获得独家折扣、时事通讯和丰富的免费内容,每天直接发送到您的邮箱。

按照以下简单步骤获取优惠:

  1. 扫描下面的二维码或访问以下链接
  1. 提交您的购买证明

  2. 就这样!我们将直接将您的免费 PDF 和其他福利发送到您的邮箱。

第一部分:介绍游戏中的人工智能

本书的第一部分,您将获得一个面向初学者的游戏人工智能(AI)开发领域的介绍。一旦您对其关键概念有了扎实的理解,您就可以开始实施利用这些主题的项目了。

本部分包括以下章节:

  • 第一章开始 AI 游戏开发

  • 第二章介绍虚幻引擎 AI 系统

第一章:AI 游戏开发入门

欢迎来到虚幻引擎中人工智能AI)开发的迷人世界!我非常高兴您选择了我和我的书作为您在这个有时令人畏惧的 AI 编程领域的向导。请放心,我致力于让这次体验尽可能轻松愉快。

在本书中,您将获得创建涉及 AI 技术使用的虚幻引擎游戏所需的所有技能,并学习如何在运行时处理它们。我们将从基础知识开始,例如在游戏关卡内移动代理,并逐步过渡到更高级的主题,例如创建复杂的行为和管理多个 AI 实体(甚至数十个或数百个)。通过这次旅程的结束,您将能够制作出能够挑战玩家的强大对手;更重要的是,您将对 AI 开发的潜在陷阱以及如何避免它们有深刻的理解。

在本章中,我将向您介绍一些关于 AI 开发的常用关键词;这些概念将作为本书的温和引言,为您深入探索虚幻引擎中 AI 编程的迷人世界打下基础。

  • AI 介绍

  • 游戏开发中的 AI 理解

  • 解释视频游戏中的 AI 技术

技术要求

我想您已经知道,虚幻引擎编辑器在硬件要求方面可能相当苛刻。然而,您无需感到害怕,因为本书主要关注游戏编程,而不是实时视觉效果。

在本节中,我们将探讨遵循本书所需的硬件和软件要求。此外,我们还将讨论一些对您的旅程有益的先决知识。

先决知识

在我们深入游戏开发中 AI 的精彩世界之前,我想善意地提醒您,这本书是为那些已经具备一些使用虚幻引擎知识的人设计的。因此,您必须已经熟悉以下主题:

  • 虚幻引擎:了解这个软件界面、工具和工作流程的基本知识是必不可少的。

  • 游戏开发基础:掌握一般的游戏开发原则和术语将极大地帮助您理解本书中讨论的概念。

  • 编程知识:由于本书侧重于游戏开发,我们假设您有一些编程经验。理想情况下,您至少应该熟悉虚幻引擎的可视化脚本系统(蓝图),并在一定程度上熟悉 C++。

注意

如果你刚开始接触虚幻引擎,我强烈建议探索一些入门书籍或资源,以便熟悉其基础知识。一个惊人的起点是*《虚幻引擎 5 蓝图视觉脚本编程》,由Marcos Romero*,Packt Publishing编写,它将指导你了解使用蓝图在虚幻引擎中进行编程的主要功能。

在这本书中,只要可能,我会通过使用蓝图和 C++两种技术来展示技术。如果你需要 C++的温和介绍,你将在本书末尾找到一个宝贵的附录,该附录深入探讨了在虚幻引擎环境中 C++编程的复杂性。这个快速指南也旨在帮助你了解 C++在虚幻引擎框架中是如何工作的。

硬件要求

在撰写本书时,Epic Games 官方推荐以下基本要求。如果你的硬件至少满足这些规格,你可以在阅读章节时获得愉快的体验:

  • Windows 操作系统

    • 操作系统:Windows 10 或 11 64 位版本

    • 处理器:四核 Intel 或 AMD,2.5 GHz 或更快

    • 内存:8 GB RAM

    • 显卡:DirectX 11-或 12 兼容的显卡

  • Linux

    • 操作系统:Ubuntu 22.04

    • 处理器:四核 Intel 或 AMD,2.5 GHz 或更快

    • 内存:32 GB RAM

    • 显卡:配备最新 NVIDIA 二进制驱动程序的 NVIDIA GeForce 960 GTX 或更高版本

    • 视频内存:8 GB 或更多

  • macOS

    • 操作系统:最新的 macOS Ventura

    • 处理器:四核 Intel,2.5 GHz

    • 内存:8 GB RAM

    • 显卡:兼容 Metal 1.2 的显卡

我使用以下硬件编写了这本书:

  • 台式机

    • 操作系统:Windows 10 64 位版本

    • 处理器:Intel Core i9 9900K

    • 内存:64 GB RAM

    • 显卡:NVIDIA GeForce RTX 3090ti

  • 笔记本电脑

    • 操作系统:Windows 11 64 位版本

    • 处理器:Intel Core i7 13650HX

    • 内存:8 GB RAM

    • 显卡:NVIDIA GeForce RTX 4060

软件要求

本书假设你已经安装并完全在计算机上运行了Epic Games Launcher虚幻引擎 5

注意

在撰写本书时,虚幻引擎的最新版本是 5.4,但你将能够跟随任何比 5.4 更新的版本。

此外,由于我们还将使用 C++,你需要一个支持此语言和虚幻引擎的 IDE。如果你已经有了一些经验,那么你很可能已经安装了 Visual Studio 2019/2022 或 JetBrains Rider;如果没有,你需要安装其中之一来跟随 C++编码部分。

设置 Visual Studio 以进行 C++虚幻引擎开发

一旦安装了 Visual Studio,你还需要以下额外组件才能使其与虚幻引擎正常工作:

  • C++ 性能分析工具

  • C++ AddressSanitizer

  • Windows 10 SDK

  • 虚幻引擎安装程序

要包含这些工具,请按照以下步骤操作:

  1. 打开 Visual Studio 安装程序

  2. 从你的 Visual Studio 安装中选择 修改,选择你将要使用的版本:

图 1.1 – 选择 Visual Studio 安装程序版本

  1. 一旦 修改 模态窗口打开,在顶部栏中,确保你处于 工作负载 部分。

  2. 然后,通过点击复选标记激活 使用 C++ 进行游戏开发 选项。

  3. 接下来,如果它已关闭,请从右侧边栏打开 安装详情 | 使用 C++ 进行游戏开发 | 可选

  4. 选择以下字段,如图 图 1 .2 所示:

    • C++ 性能分析工具

    • 可用的最新 Windows 11 SDK 版本

    • C++ AddressSanitizer

    • IDE 对 Unreal Engine 的支持(可选)

    • Unreal Engine 安装程序

图 1.2 – 工作负载部分

  1. 点击 下载时安装 按钮(或 下载全部,然后安装)以开始安装过程。

备注

Unreal Engine 的 IDE 支持 集成是 Visual Studio 2022 中引入的一个扩展,它为 Unreal Engine 的类、函数和属性添加了一些实用的功能,例如蓝图引用、蓝图资源和 CodeLens 提示。尽管不是强制性的,但我强烈推荐使用它,因为它将使你的开发者生活变得更加轻松!

完成下载和安装过程后,你将完全准备好开始使用 Unreal Engine 开发自己的 C++ 游戏。

现在你已经成功设置了系统,是时候熟悉 AI 环境中的关键术语了。这将为你提供一个坚实的基础,以便更有效地理解和导航 AI 世界。

介绍 AI

人工智能已成为各个行业的变革力量;在广义上,人工智能涉及在机器中模拟人类智能,这些机器被编程为像人类一样思考和(有时)学习。

因此,开发 AI 意味着研究使机器能够感知其环境、从数据中学习、推理并做出决策以实现既定目标的方法和软件。

人工智能包括各种子领域和应用,包括以下内容:

  • 机器人技术:开发能够与物理世界交互的智能机器

  • 自然语言处理:计算机理解和生成人类语言的能力

  • 机器学习:使用算法和统计模型使计算机能够从数据中学习并做出预测或决策,而无需明确编程

  • 深度学习:机器学习的一个分支,利用神经网络来模拟人类大脑中观察到的决策能力

  • 计算机视觉:计算机理解和解释图像或视频中的视觉信息的能力

更重要的是,AI 在娱乐行业中取得了显著的进步,正在改变内容创作、消费和个性化的方式。以下是关于 AI 对娱乐行业影响的几个关键点:

  • 生成式 AI:这种技术可以创建故事、剧本和图像等输出,并有可能彻底改变娱乐行业的内容创作。

  • 个性化推荐:AI 赋能的工具正被用于帮助用户发现符合他们偏好的内容,通过提供个性化的建议。这些推荐基于用户行为、观看历史和其他数据,从而提升用户体验。

  • 数据驱动洞察:通过分析用户行为,AI 使娱乐行业能够从诸如偏好和趋势等数据中获得宝贵的见解,并有助于公司更好地了解他们的受众,并在内容制作、分发和营销方面做出基于数据的决策。

然而,正如古老的谚语所说,“权力越大,责任越大。”AI 的采用带来了许多挑战和考虑。关于 AI 生成内容的知识产权和版权问题的讨论已经发生,并且仍在继续。此外,人们对 AI 对各个行业就业的影响越来越担忧,因为某些角色可能会因 AI 技术的进步而面临中断或转变。

利用 AI 的伦理是一个重要的主题,它深入探讨了与这些系统利用相关的道德考虑和影响。随着 AI 技术以越来越快的速度发展,它对社会、个人和环境的影响引发了深刻的伦理担忧。

虽然不可否认 AI 有潜力提高效率和生产力,但它也可能导致特定行业的就业岗位减少;因此,有些人认为实施减轻对工人和社会不利影响的措施是强制性的。

您刚刚接触到了一些关于人工智能(AI)的常见术语。现在,让我们将焦点转向理解人工智能在游戏开发领域的具体应用。在接下来的这一节中,我们将深入探讨其基础,为您提供对其原则和运作方式的基本理解。

理解游戏开发中的 AI

当应用于游戏开发时,AI 被用于创建能够执行任务而无需明确编程的智能系统。这些系统根据经验进行适应和改进其性能,从而提升整体的游戏体验。例如,游戏角色已经使用了多年的 AI,使它们能够表现出看似智能的行为。甚至四个标志性的吃豆人鬼魂也被编程为具有独特和不同的行为!

在游戏开发中,人工智能的应用远远超出了对非玩家角色NPC)或敌人的控制。它包括一系列多样化的应用,这些应用正在革新游戏设计、开发和玩家体验。通过利用人工智能,游戏开发者可以引入创新和沉浸式的游戏元素,使玩家在游戏过程中着迷。

如果你选择了这本书,那么你很可能渴望掌握游戏人工智能编程的基本原理,并将这些知识应用到创造你的下一个大作中。作为一名人工智能程序员,你将拥有创造令人惊叹的对手、创建帮助玩家实现目标的 NPC,或者仅仅发明新的和吸引人的行为,使你的游戏达到前所未有的愉悦程度;这将是一项极具回报的挑战!

然而,重要的是要注意,人工智能视频游戏编程可能带来重大挑战,需要长时间工作,并可能导致压力。在开始这条职业道路之前,意识到这些潜在陷阱至关重要。为了避免这样的挫折,必须对人工智能的工作方式有一个坚实的理解,使玩家能够享受到无缝和愉快的游戏体验。更重要的是,理解这个主题还涉及解决可能出现的计算机问题并有效地解决它们。请放心,这些问题迟早会浮出水面!

在接下来的部分,你将得到对游戏中使用的主要人工智能技术的温和介绍,以及使它们与众不同的独特特征。

解释视频游戏中的 AI 技术

人工智能在提升游戏体验方面发挥着关键作用,使游戏更加沉浸和刺激。因此,对人工智能发展背后的基本原理及其工作方式有一个全面的理解至关重要。这种知识将赋予游戏开发者有效利用人工智能潜力的能力,创造出丰富和吸引人的游戏玩法,使玩家保持参与和着迷。

想想《刺客信条》系列,它以其开放世界的游戏玩法而闻名,其中使用了复杂的 AI 行为来控制 NPC。在更高级的水平上,像《反恐精英》这样的游戏引入了由 AI 控制的玩家角色——称为机器人(bots)——可以创建和管理来代替真实玩家。

最后,人工智能在游戏开发中的未来充满了令人兴奋的可能性和创新,因为人工智能正在被用来创造动态和自适应的游戏叙事。通过观察玩家的行为和偏好,人工智能算法可以构建独特的叙事分支、挑战和奖励,这些内容将针对每个玩家量身定制。

在本节中,我将简要概述在游戏中常用的一些 AI 技术。在本书中,你将有机会探索这些技术,并了解它们在 Unreal Engine 中的应用。对于那些本书中不会涉及的技术,你将有很多机会自己探索和深入研究。游戏中的 AI 世界广阔且不断演变,为实验和创新提供了无限的可能性。所以,如果这里没有涵盖某个特定技术,请不要气馁 – 探索之旅仍在继续,有无数资源可以帮助你开启 AI 游戏开发的全新视野。

寻路

寻路对于游戏环境中的高效导航至关重要,它指的是在模拟从一个点到另一个点的移动过程中确定最佳路径的过程。它可以由自主代理,如 NPC 或对手使用,但在点选游戏中也很有用,其中你的角色需要到达特定位置。寻路涉及在避开障碍物的同时找到从一个位置到另一个位置的最佳路径;在这些情况下,通常使用 A 算法等算法。NPC 可以使用这种技术来规划他们的移动,无论是为了避免敌方单位、找到捷径还是跟随航点。

在游戏开发中最常见的寻路技术是通过使用 导航网格 – 或 nav mesh,这是一种表示关卡可通行表面的数据结构。图 1.3 展示了 AI 在 nav mesh 中的移动示例:

图 1.3 – AI 在导航网格中的移动

基于规则

基于规则的系统指的是一种基于一组预定义规则运作的 AI。这些规则由人类编写,并决定了系统的行为和决策;这意味着根据某种输入遵循规则以产生预定的结果。简单来说,这些规则通常被称为 if 语句,因为它们通常遵循 如果某事为真,则执行另一件事 的结构。尽管有限,但这些系统相对容易实现和管理,因为规则中编码的知识是模块化的,规则可以按任何顺序编写。这为编码和修改系统提供了很大的灵活性。

有限状态机

有限状态机FSM)是 AI 开发中常用的一种技术,它涉及将对手或 NPC 的行为分解为不同的状态,其中每个状态代表特定的行为或动作。当满足某些条件或事件时,状态之间的转换被触发。例如,哨兵角色可能具有巡逻、警报或追逐等状态,当角色发出噪音或被发现时(因为他们处于视线范围内),就会发生转换。FSMs 提供了一种清晰和有序的方式来控制 NPC 的行为,尤其是在具有预定义动作序列的游戏中。

图 1.4展示了简单有限状态机(FSM)的示例,包括状态和条件:

图 1.4 – 有限状态机

行为树

行为树是用于控制 AI 行为的分层结构。它由代表特定动作或条件的节点组成。树结构允许根据条件本身进行动作排序和决策。系统将从根节点遍历到叶节点,在途中执行动作或评估条件。行为树提供了一种灵活和模块化的 NPC 行为方法,允许进行复杂和动态的决策。行为树可以包括选择器、序列、条件或动作节点。图 1.5展示了行为树,其中选择器决定将执行树的哪个部分,序列节点将按照预定义的顺序执行一系列任务。

图 1.5 – 行为树

如果你对这些术语不熟悉,不要担心!我将在第七章,“介绍行为树”中解释它们。

机器学习 AI

机器学习涉及使用数据和算法训练 AI 模型,以使 NPC 能够随着时间的推移学习和改进其行为。这种技术允许 NPC 根据之前游戏中的模式和经验来适应、做出决策和应对不可预测的情况。机器学习可以为 NPC 提供更动态、更真实和更有吸引力的交互,因为他们的行为通过迭代和学习玩家的行为而演变。

deepmind.google/technologies/alphago/

强化学习

强化学习是一种机器学习系统,其中 NPC 通过试错来学习,根据其行为获得反馈或奖励。NPC 探索游戏环境,采取行动,并从后果中学习。强化学习使 NPC 通过最大化奖励和最小化惩罚来优化其行为。这种技术可以使 NPC 表现出适应性和战略性的决策,增强游戏的挑战性和沉浸感。强化学习通常在开发过程中使用,以便在游戏发布时创建一个功能性的系统。由于强化学习的性质,有时结果可能不符合预期,NPC 可能会表现出奇怪或古怪的行为。

生成式 AI

如前所述,生成式 AI 正在越来越多地应用于游戏开发中,提供了新的可能性,并正在改变游戏开发的各个方面。其中一些方面包括创建更真实的 NPC,其行为超越了固定模式,以及使决策系统对玩家更具适应性和吸引力。

尽管生成式 AI 在游戏开发中仍处于初期阶段,其全部潜力仍有待挖掘,但它已经显示出在改变游戏行业各个方面的有希望的能力。

摘要

在本章中,我们探讨了 AI 发展的基本原理,并看到了它在游戏行业中的应用。在下一章中,我将向您介绍虚幻引擎提供的令人难以置信的潜力以及如何利用其框架在游戏中创建智能和沉浸式的 AI。准备好进行一次激动人心的探索,让我们带着您最喜欢的游戏引擎一起深入 AI 游戏编程的迷人领域!

致谢

www.flaticon.com/

第二章:介绍虚幻引擎 AI 系统

欢迎来到使用虚幻引擎进行 AI 编程的激动人心的世界!在本章中,我将向您介绍虚幻引擎的强大工具,这些工具将为您的虚拟世界带来生命和智能。通过探索虚幻引擎 AI 系统的各个方面,例如使用导航系统移动代理、通过行为树黑板实现半智能行为,以及整合智能对象和大量实体等功能,您将全面了解这个强大框架提供的卓越能力。

掌握这些技能将使你跻身精英游戏程序员的行列——谁不想成为其中的一员呢?

到本章结束时,你将清晰地了解使用虚幻引擎 AI 系统可以完成什么,这将赋予你在项目中创建高级 AI 角色的能力。

在本章中,我们将涵盖以下主题:

  • 了解虚幻引擎游戏框架

  • 展示虚幻引擎 AI 系统

  • 理解高级 AI 功能

技术要求

本章没有技术要求需要遵循。

了解虚幻引擎游戏框架

如您可能已经知道,虚幻引擎提供了一个现成的系统,称为游戏框架GF),它包含了许多开发游戏所需的功能;这包括从拥有先进的输入系统到常见的入口点,这些入口点将允许您轻松访问数据或游戏状态。

以下是一些关键点,解释为什么 GF 如此重要:

  • 结构和组织:GF 提供了一种结构化和组织化的游戏开发方法。它提供了一套系统、类和接口,它们协同工作以创建游戏的核心结构。

  • 游戏逻辑和进度:该框架包含预定义的概念,有助于定义游戏的逻辑、进度和组织结构。

  • 玩家和 AI 控制:GF 包括处理玩家输入和游戏世界中角色决策的系统。这包括玩家和 AI 控制,这对于创建交互性和沉浸式游戏体验至关重要。

  • 实用函数:该框架提供了一组实用函数库,这些函数有助于处理常见的游戏操作和交互。这些函数可以简化游戏逻辑,并提高实现各种功能的效率。

  • 灵活性和集成:GF 非常灵活,与虚幻引擎深度集成。它使用常见的游戏编程模式,并执行大量工作,使开发者能够专注于构建游戏,而不是创建自己的游戏框架。

作为个人反思,我发现多年来使用和理解 GF 显著提高了我对游戏编程最佳实践的总体理解。

显然,管理 AI 系统也是 GF 工作的一部分,因此,在接下来的小节中,我将为您提供一个关于 GF 中可用的关键 AI 功能的简要介绍,使您能够为使用它们做好准备。

演员(Actors)和组件(components)

我很确定您已经熟悉 Unreal Engine 中的演员组件,但以防万一,让我们对这两个概念进行快速复习。

在 Unreal Engine 中,Actor类指的是可以放置在关卡中的任何实体,无论是摄像机、静态网格还是玩家的角色。演员可以经历变换,如平移、旋转和缩放。

演员充当着称为组件的专用类的容器,这些组件在控制移动、渲染等方面发挥着各种作用。在演员内部有三种类型的组件,它们各自发挥着不同的作用:

  • 演员组件(Actor components): 这些主要包含演员的代码逻辑。它们处理各种功能和交互,但没有任何视觉表示。

  • 场景组件(Scene components): 这些用于在演员内定位和定位其他组件。它们作为变换(如平移、旋转和缩放)的参考点,但没有任何可见的存在,主要用于组织目的。

  • 原始组件(Primitive components): 这些负责在关卡内表示演员的视觉表现。它们可以被玩家或其他对象渲染和交互。

通过组合这些组件,游戏开发者可以创建具有功能和视觉方面的复杂和交互式演员。

主要 GF 元素(Main GF elements)

Unreal Engine 的 GF 是一个综合性的类集合,它作为构建游戏体验的模块化基础。在这个框架中,游戏开发者可以自由选择最适合游戏的特定元素,同时确保这些类被精心设计,可以无缝协作并相互增强。

在接下来的小节中,我们将介绍涉及的主要元素,以便您对事物的工作原理有一个清晰的了解。

游戏实例(GameInstance)

GameInstance类充当后台操作的管理器(即,它不是一个 Unreal Engine 演员);当引擎启动时创建一个实例,并且实例在引擎关闭前保持活动状态。其主要目的是跟踪数据和按需执行代码。

游戏实例提供了一个方便的中心枢纽,用于管理持久数据,例如保存游戏系统,并作为其他子系统的管理器,提供对游戏流程的便捷控制。

游戏模式(GameMode)

GameInstance 类不同,GameModeBase 或其直接后代 GameMode 实例仅在单个关卡中存在,并在关卡本身加载和世界构建后立即创建。这个类作为管理器来处理游戏会话,每个关卡都可以有自己的不同游戏模式逻辑。其主要作用是创建剩余的框架角色。

GameState 和 PlayerState

GameStatePlayerState 是专门的角色,在跟踪游戏状态和参与玩家的状态中扮演着关键角色。游戏状态负责存储和处理游戏中所有玩家相关的数据,而玩家状态则专注于特定玩家。鉴于它们固有的特性,这些类在多人游戏中找到其主要应用,无论这些游戏是在线上还是本地进行。

物品和角色

pawn 指的是所有可以在游戏世界中由玩家或 AI 实体控制的角色的基类。它作为实体的物理表示,处理其实体在游戏世界中的参与,包括碰撞和其他物理交互。它还通常用于确定实体的视觉外观。

Pawn 类通过更高级的 Character 类获得了额外的功能。角色类专门设计用来以垂直方式表示玩家,使他们能够在关卡内执行广泛的动作,如行走、奔跑、跳跃和游泳。顺便提一下,角色类还包含了用于多人处理的基本功能。

控制器

Controller 类负责管理决定玩家在游戏世界中行为的逻辑。两种广泛使用的控制器类是 PlayerControllerAIController;第二个选项是我们热切期待的,原因很明显。

玩家控制器类作为一个管理实体,能够处理来自人类玩家的输入,使他们能够与游戏环境互动,并促进他们的整体游戏体验。另一方面,AI 控制器通过使用行为树、状态树、导航等来管理 AI 实体的行为。

玩家控制器和 AI 控制器类可以在运行时通过拥有角色或 pawn 来管理它们。

GameplayStatics

Unreal Engine 提供了一个非常有用的函数库,称为 GameplayStatics,它为游戏相关的任务提供了各种实用函数。这些函数可以用于在引擎内执行常见的游戏操作和交互。

这些函数的一些例子包括生成和销毁演员、检索有关游戏世界的信息、管理游戏标签、操作游戏实例等。这些函数可以从蓝图可视化脚本和 C++编程中访问和使用,可以简化游戏逻辑,并在运行时作为管理和操作游戏元素的有价值工具。

现在我已经分享了一些虚幻引擎 GF 知识,准备好进入本书中最精彩的部分(至少在这个书的背景下):AI 如何深入引擎的复杂运作,为你提供踏上创造自己游戏逻辑的奇妙旅程的知识!

展示虚幻引擎 AI 系统

考虑到您可利用的先前描述框架的强大功能,虚幻引擎提供全面且强大的 AI 系统可能不会令人惊讶。

在本节中,我们将展示可用于虚幻引擎 AI 程序员的工具全面系列,以及它们主要功能的简要描述。首先,让我们检查导航系统及其功能。

导航系统

虚幻引擎导航系统允许 AI 实体,称为代理,通过路径查找算法在关卡中移动。

导航系统将通过使用碰撞来从关卡中现有的几何形状创建一个导航网格。这个网格随后被分割成瓦片,这些瓦片进一步被分割成多边形,从而形成一个图。系统内的代理使用这个图来导航到它们的目标地点。多边形有一个指定的成本,这有助于代理根据最低的总成本确定最优化路径。此外,导航系统包括一系列可调整的组件和设置,可以修改导航网格生成过程。这些修改可能包括对多边形成本的调整,影响关卡内代理的导航行为。最后,系统允许连接导航网格中的非连续区域,例如平台和桥梁,从而在这些空间元素之间实现无缝导航。图 2.1 .1 展示了在 Epic Games Launcher 上免费提供的内容示例项目中的一个关卡;绿色区域是导航网格,左侧的角色是 AI 代理。

图 2.1 – 导航系统

本书第二部分将致力于理解虚幻引擎导航系统以及如何对其进行优化和调试。

行为树

在 Unreal Engine 中,行为树是创建游戏中 NPC AI 的有价值工具。行为树资产的主要功能是执行包含逻辑指令的分支。在 Unreal Engine 中,行为树以与蓝图非常相似的方式创建——这意味着您将使用某种类型的可视化脚本方法——在这里,将具有特定功能附加的节点序列添加并连接起来,形成一个行为树图。

图 2.2描绘了来自 Epic Games Launcher 上可用的Lyra 入门游戏项目的一部分行为树:

图 2.2 – 行为树示例

为了确定哪些分支应该执行,行为树依赖于另一个称为黑板的资产,它作为行为树本身的大脑图 2.3显示了与之前行为树相对应的黑板:

图 2.3 – 黑板示例

行为树和黑板在 AI 游戏编程中非常重要;这就是为什么我将本书的第三部分专门用于这个主题。

质量实体

质量实体系统是一个以游戏玩法为中心的计算框架,为游戏中的行为元素提供了一种范式;它旨在处理大量实体并便于对骨骼和静态网格进行行为控制。

图 2.4 显示了来自城市样本项目(可在 Epic Games Launcher 上获取)的屏幕截图,该项目利用质量实体进行人群和交通控制:

图 2.4 – 质量实体应用

注意

在撰写本书时,质量实体仍被标记为实验性;因此,应谨慎使用,因为随着时间的推移,事物可能会出现故障或发生变化。

本书第四部分将介绍质量实体。

状态树

状态树是一种多功能的分层状态机,它将行为树的一些功能与状态机的一些功能相结合。使用这个系统(以树状结构组织)开发者将能够创建高度可执行的逻辑,同时保持结构化和适应性。图 2.5显示了上述城市****样本项目中的状态树:

图 2.5 – 状态树示例

我将在本书的第四部分中向您展示状态树是如何工作的。

智能对象

在 Unreal Engine 中,智能对象代表可以在级别中通过预留系统使用的一组活动,该系统确保一次只有一个 AI 代理可以使用智能对象,防止其他代理使用它,直到它再次可用。这些对象放置在级别上,可以被 AI 代理和玩家交互。智能对象包含进行这些交互所需的所有信息,并且可以在运行时使用专用过滤器查询。图 2.6显示了来自City Sample项目的智能对象资产:

图 2.6 – 智能对象示例

智能对象将在本书的第四部分中介绍。

环境查询系统

环境查询系统EQS)从环境中收集数据,使 AI 能够通过各种测试来查询数据。这个过程导致选择一个与提出的问题最匹配的项目。

查询可以从行为树中调用,并用于根据执行测试的结果做出如何继续的决定。图 2.7展示了来自Lyra Starter Game项目的环境查询。

图 2.7 – 环境查询示例

注意

在撰写本书时,EQS 仍被标记为实验性,因此您应谨慎使用,因为随着开发进程的进行,事物可能会出错或改变。

我将在本书第四部分的末尾向您介绍 EQS,就在您对行为树的工作原理有了扎实理解之后。

AI 感知系统

AI 感知系统为 pawns 提供了从环境中接收数据的另一种方式,例如声音从哪里传来或 AI 是否看到了什么。它通过为 AI 提供感官数据来允许 AI 产生意识。该系统允许数据源创建刺激,以便数据监听器可以定期更新它们。该系统用于在游戏中启用 AI 感知,并可以响应一系列可定制的传感器。

图 2.8显示了一个带有刺激源组件的Lyra Starter Game中的角色:

图 2.8 – AI 感知示例

本书第四部分将介绍 AI 感知,以及行为树,使您的 AI 角色能够意识到其周围的环境。

AI 调试

没有一个严肃的框架会没有调试系统。调试是软件开发的一个基本方面,允许开发者识别和修复其代码中的错误或缺陷。它在确保框架的可靠性和功能方面发挥着关键作用。

正因如此,虚幻引擎提供了一套完整的工具和功能,以帮助开发者调试 AI,包括可视化调试工具、行为树可视化以及 AI 模拟模式。这些工具允许开发者实时检查和修改 AI 行为,识别诸如路径查找错误或决策异常等问题,并在游戏环境中对 AI 性能进行必要的调整。

图 2.9 显示了启用 AI 调试工具时的城市样本项目操作:

图 2.9 – 在关卡中启用的调试工具

在整本书中,我将展示根据你将使用的工具,调试游戏的不同技术。这些技术将赋予你高效追踪和解决游戏代码逻辑中错误、bug 和其他问题的能力。

在本节中,我向您展示了虚幻引擎 GF 中可用的主要 AI 功能;在下一节中,我将介绍一些在引擎中实现的新技术,这些技术涉及机器学习ML)系统。

理解高级 AI 功能

现在你已经对虚幻引擎中可用的主要 AI 功能有了基本的了解,我想向你介绍一些最实验性和在一定程度上与游戏玩法无关的功能。

注意

请记住,这些功能目前仍处于实验或 beta 版本,因此需要谨慎处理。

学习代理

学习代理是一个专门设计的实验性插件,旨在使你能够使用机器学习训练 AI 角色。此插件提供了一个独特的机会,可以增强或甚至取代传统的游戏 AI 系统,如行为树或状态机。通过学习代理,你可以利用强化学习和模仿学习的方法来创建智能和自适应的 AI 角色。

此插件的主要目标是提供一套强大的解决方案,用于在虚幻引擎中实现角色决策。然而,其潜在应用范围远超游戏开发。例如,学习代理可以通过创建执行特定动作和场景的 AI 角色来自动化测试流程。这有助于识别潜在问题并确保游戏的健壮性。

尽管仍在开发中,这个插件已经相当令人印象深刻,随着时间的推移,你应当期待更多改进。

神经网络引擎

神经网络引擎NNE)插件为开发者提供了一个 API,允许统一访问不同的神经网络推理引擎。这使得程序员可以根据需要无缝地在推理运行时之间切换,优化他们的用例并有效地针对特定平台。

如果你熟悉虚幻引擎的渲染硬件接口RHI),你可以将 NNE 视为类似;它是一个主要目的是从不同的推理运行时抽象出来的工具。

ML Deformer

ML Deformer 是一个插件,它提供了一个 API 来访问不同的 ML 推理运行时实现,允许开发者近似复杂的变形模型并提高角色网格变形的质量。

ML Deformer 专门设计用于在实时游戏引擎中为角色创建精确的非线性变形系统。它利用一些内部虚幻引擎工具在 GPU 上执行计算,优化性能。一个名为ML Sample Project的示例项目可在虚幻引擎市场上找到,其结果相当惊人;图 2.10展示了我的同事 Giovanni Visai 从上述示例项目开始的照明测试:

图 2.10 – ML Deformer 插件在行动中

ML 布料模拟

ML 布料模拟系统为开发者提供了一个高保真和高性能的实时布料模拟解决方案。该系统在产生与预模拟数据相当质量的服装网格的同时,保持快速高效的性能,并使用最少的内存。

总之,将 ML 功能集成到虚幻引擎中为开发者打开了无限可能。通过利用这些技术,开发者将能够在他们的项目中创建更沉浸式、智能和动态的体验。

摘要

在本章中,我向你介绍了虚幻引擎 GF 中可用的关键功能。之后,我概述了主要的 AI 系统,从导航系统开始,逐步到行为树。此外,我还讨论了更高级的系统,如 Mass Entity 和状态树。最后,我向你介绍了实验性功能,如学习代理和 NNE 插件。

恭喜!你已经到达了本书第一部分的结尾。在接下来的章节中,准备好深入探索导航系统以及如何创建基本的 AI 角色,它们将在这个系统中导航。所以,卷起袖子,让我们开始创造一些惊人的东西吧!

第二部分:理解导航系统

在本书的第二部分,你将深入了解虚幻引擎导航系统的基本功能。从那里,你将创建自己的项目并学习如何实现一个由 AI 代理可导航的完整工作环境。

本部分包括以下章节:

  • 第三章展示虚幻引擎导航系统

  • 第四章设置导航网格

  • 第五章改进代理导航

  • 第六章优化导航系统

第三章:展示虚幻引擎导航系统

虚幻引擎导航系统是一个复杂的框架,它使受人工智能控制的实体能够在游戏关卡中无缝导航和交互。它提供了一套工具和算法,允许游戏开发者定义和创建路径、障碍物和移动行为。通过使用导航系统,您将能够模拟受人工智能控制的实体的真实移动和行为模式,增强虚拟环境的沉浸感和可信度。由于该系统集成了诸如路径查找算法碰撞避免动态障碍物处理等高级功能,因此理解其全部潜力对于有抱负的人工智能程序员来说是一项关键技能。

到你读完本章的时候,你将深刻理解这个特定部分的游戏框架是如何运作的。有了这些知识,你将完全准备好开始与系统本身进行积极的工作。

在本章中,我们将涵盖以下主题:

  • 介绍人工智能移动

  • 理解路径查找

  • 使用项目模板测试导航系统

技术要求

本章没有技术要求需要遵循。

介绍人工智能移动

当涉及到在虚拟环境中移动人工智能实体时,我们面临着众多挑战,并且没有通用的解决方案。解决每个问题的方法取决于将要面对的每种独特特征,这取决于正在开发的游戏类型。例如,人工智能的目标是一个静止的物体——比如一个拾取物——还是它是一个不可预测移动的物体,比如玩家角色?此外,人工智能是否只需要在没有特定目的地的情况下四处游荡,或者它是否有一个预定义的模式——比如作为巡逻哨兵?

此外,作为一名开发者,你还需要考虑不同的地形、障碍物和危险区域等因素。在更容易和更危险——但更快捷——的路径之间做出选择,在运行时可能会产生重大影响。这些只是涉及在关卡内移动人工智能所涉及的一些考虑因素,随着你遇到不同的场景,你可能会面临不同的问题。理解和正确处理所有相关变量对于提供最佳玩家体验至关重要。

那么,在人工智能运动中,特别是路径查找中,涉及的主要实体有哪些?它们如何合作以使玩家的体验完美无瑕?我将在几秒钟内告诉你所有关于它的事情!

理解导航网格

在虚幻引擎中,导航系统基于导航网格——或nav mesh——通过将可导航空间划分为多边形来实现,这些多边形随后被划分为三角形以提高效率。每个三角形随后被视为到达特定位置的图的一个节点,当两个三角形相邻时,它们的相应节点相连。图 3 .1 描述了一个带有上述网格的游戏关卡,该网格由三角形划分:

图 3.1 – 导航网格示例

使用此图表,您可以应用任何类型的路径查找算法——例如A 星A*),我将在本章后面解释——并且生成的过程将在这些三角形之间生成一条路径,AI 角色可以穿越。

幸运的是,除非您真正需要深入了解修改导航系统核心结构的复杂性,否则没有必要立即深入这种细节。了解生成的三角形集合形成一个连贯的图,该图是路径查找算法的基础,就足以充分利用导航系统。

要在虚幻引擎中生成导航网格,您只需在关卡中添加一个或多个导航网格边界体积演员,并更改其大小以适应您的需求。

注意

在虚幻引擎中,体积类指的是一种可以影响其作用区域内其他演员行为的特殊演员。体积用于定义各种效果,如照明,并可以修改玩家或其他对象与游戏世界的交互方式。虚幻引擎中常见的体积类型包括触发体积、光子重要性体积、后期处理体积,以及显然的导航网格边界体积。

图 3 .2 展示了一个添加到关卡中的导航网格边界体积演员;黄色线条标记了该体积本身。

图 3.2 – 导航网格边界体积

此演员相当简单,您唯一可以采取的操作是调整其扩展。从上一张图片中,您可能已经注意到一个由两个三角形组成的绿色网格;这个相当简单的形状是由另一个演员生成的:Recast Nav Mesh,通常在第一次将导航网格边界体积添加到关卡时自动生成。

此演员负责生成 AI 实体可使用的可通行区域,它将使用此区域进行自己的高效和准确的路径查找计算;通常,一旦您在关卡中添加导航网格边界体积,就会自动生成其实例。

应该注意的是,大多数可用的RecastNavMesh演员设置都可以在您的编辑器项目设置中使用预定义值设置——这可以通过文件菜单打开——通过选择引擎 - 导航网格部分,如图图 3 .3 所示:

图 3.3 – 导航网格设置部分

现在你已经了解了在虚幻引擎中创建导航网格的方法,重要的是要知道你可以通过使用可用的修改器系统来调整它,以增强其趣味性和现实感。

修改导航网格

导航系统由各种演员和组件组成,这些组件会改变导航网格的生成,例如穿越多边形的成本。这些调整会影响 AI 代理在你的级别中的移动方式。

导航修改器体积

最简单的一个是导航修改器体积演员,其任务是……好吧,就是修改导航网格!一旦你在你的级别中定位了这个体积,你将可以选择如何修改 AI 代理对其路径搜索的感知 – 你可以将其指定为不可通行的地形、困难地形,甚至障碍物。图 3.4 显示了设置了三种不同成本设置的三个修改器体积:

图 3.4 – 三个导航修改器在行动

如果你正在考虑创建自己的导航网格修改器,那么,这是可能的;你只需要扩展UNavArea类,设置其参数,然后你就可以出发了!

导航查询过滤器

作为调整 AI 代理生成路径时导航系统行为的额外方法,你可以利用导航查询过滤器。这种方法包括与一个或多个特定区域相关的信息,并提供覆盖分配给这些区域的成本值的灵活性。通过实现查询过滤器,你将能够根据 AI 代理在游戏世界中穿越各个区域时的导航模式进行定制,这将让你能够微调和优化 AI 实体的移动。

导航链接代理

当你开始设计可通行地形时,你很可能会引入缺口或不同海拔的区域;我想你可能需要你的 AI 角色从一个侧面跳到另一个侧面。这正是导航链接代理被创建的原因;这个演员将连接导航网格中缺少直接导航路径的两个区域。图 3.5 显示了这样一个链接,连接了两个不同高度的区域:

图 3.5 – 导航链接代理

在你的工具箱中有这样一款有用的工具,你将能够让你的角色跳跃、坠落,并执行令人叹为观止的杂技,无缝地从一种违反重力的动作过渡到另一种。

运行时导航网格生成

默认情况下,虚幻引擎设置为静态生成导航网格 – 这意味着网格是在离线生成的,无法在运行时更改。然而,如果你需要一个更灵活的生成导航网格的方式,你可以选择动态网格生成系统,这将允许你在不同情况下更新网格 – 例如,通过添加移动实体。可以通过打开项目设置,然后转到引擎 - 导航网格部分,并在运行时类别中选择运行时生成选项来为整个项目启用运行时生成:

图 3.6 – 启用运行时生成

或者,你也可以只为单个关卡启用它,通过在Recast Nav 网格演员中更改运行时生成属性。

调用者

导航调用者是一个演员组件,它将在运行时为人工智能代理生成导航网格。它用于消除预先计算网格的需求,并允许在游戏世界中动态导航。这个特性在拥有广阔地形 – 例如,一个开放世界 – 需要大量时间来生成导航网格时特别有用;通过调用者,系统将在运行时自行生成网格,但仅限于演员周围的一小片区域。

现在你已经了解了导航网格的创建和调整方法,那么让我们来探索谁或什么会通过它移动。

人工智能代理

在虚幻引擎的导航系统中,代理是一个能够通过导航网格在游戏世界中导航的人工智能角色或实体。代理将使用导航网格数据来计算路径、避开障碍物,并在环境中智能地移动。一个关卡中的每个代理通常代表一种特定的角色类型,例如玩家角色 – 例如,在一个点击式游戏中 – 敌人 AI,或任何需要在游戏世界中移动的实体。

要在关卡内移动一个代理,你通常会使用PawnCharacter演员。

将代理移动到位置或演员的最简单方法之一是使用简单移动到位置简单移动到演员蓝图节点。

图 3.7 – 简单移动节点

或者,你可以使用相应的 C++ 方法,分别称为SimpleMoveToLocation()SimpleMovetoActor()

显然,在虚幻引擎中,你可以创建比仅仅将代理移动到单个点更复杂的动作;这一点我们将在从第八章,“设置行为树”开始时进行探讨。

避免碰撞

基本路径查找算法对于寻找绕过静止物体的路线是有效的;然而,当涉及到移动障碍物——如玩家角色或其他 AI 代理——时,需要一个更合适的系统。这就是为什么虚幻引擎提供了两个避免系统,以防止移动实体之间的碰撞:

  • 互逆速度障碍RVO)系统计算每个代理的速度向量,考虑附近的代理,并假设它们在计算的每个时间步中以恒定速度移动。选择的最优速度向量是与代理期望速度方向上最接近的代理速度。此系统包含在角色移动组件中。RVO 不使用导航网格进行避免,因此它可以与导航系统分开用于任何角色。

  • 绕路人群管理器计算一个倾向于代理方向的粗略速度样本,与标准 RVO 方法相比,在避免质量上有了显著提升。任何通过ADetourCrowdAIController类扩展Pawn类的演员都可以使用此系统。

你将在第五章中了解到避免,提高 代理导航

在本节中,你已经了解了路径查找中涉及的主要元素以及它们与环境之间的交互。

在下一节中,我将提供有关路径查找工作原理的更多详细信息。

理解路径查找

如你所知,虚幻引擎使用路径查找在级别中移动代理;在本节中,我将深入探讨内部的工作原理。虚幻引擎利用了 A*算法的通用版本,这是计算机科学中广泛使用的图遍历和路径查找算法。以其完备性、最优性和效率而闻名,其主要目标是确定加权图中指定源节点和指定目标节点之间的最短路径。

此图是级别的基于节点的表示,其中节点代表相互连接并可通行的区域,并且包含有关相邻节点和到达它们的通行成本的信息。

A*使用启发式函数来估计从每个节点到目标位置的成本;这种试错系统有助于引导搜索走向最有希望的路径,提高效率。

在路径查找过程中,算法维护两个列表:其中一个包含尚未评估的节点,而另一个包含已经评估过的节点。算法通过考虑其成本以及从上一个节点到达它的成本来评估每个节点。它从开放列表中选择总成本最低的节点进行进一步评估。一旦到达目标节点,算法通过从目标节点回溯到起始节点,沿着节点之间的连接重建路径。

虚幻引擎的版本通常包括后平滑操作,以提高生成路径的质量。后平滑调整路径,使其更加自然,并更有效地避开障碍。

github.com/EpicGames/UnrealEngine

注意

要访问虚幻引擎源代码,你需要成为 Epic Games GitHub 组织的一部分。订阅是免费的,没有理由你不应该参与其中。

例如,通过检查虚幻引擎源代码中的DetourNavMeshQuery类,你可以了解 A* 寻路算法的使用方式以及成本是如何计算的,或者如何在路径上找到一个瓦片。

看来你已经对在虚幻引擎中如何处理路径搜索有了一些了解,所以我认为是时候通过探索一个真实案例场景来深入一个实际示例了;我们将从创建一个基于模板的项目开始。

使用项目模板测试导航系统

在本节中,我们将查看一个使用虚幻引擎导航系统的项目,并使用项目模板来完成它——使用预制的项目,如模板,为你提供了一个在特定主题上获得实践经验的有价值的机会,节省了你从头开始构建项目所需的时间和精力。

一旦项目创建完成,我们将快速分析导航网格生成系统以及模板如何处理运行时的人物移动。

在这里,你将开始通过使用俯视项目,这是在Unreal 项目浏览器 GAMES类别中可用的模板之一,来创建一个游戏原型。

设置项目

一旦你准备好了,你可以启动 Epic Games Launcher 并按照以下步骤操作:

  1. 从可用的模板中选择GAMES | Top Down

  2. 根据个人喜好将项目设置为蓝图C++

  3. 为你的项目命名——任何名字都可以。

  4. 将其他设置保留为默认值。

  5. 点击创建按钮。

图 3.8 – 项目设置

一旦项目创建并打开,你就可以开始分析它了。

分析导航网格

我们现在将简要浏览生成的关卡以及有助于导航网格生成的演员。

大纲视图中,你会注意到有一个名为导航的文件夹,包括三个演员:

  • 导航网格 边界体积

  • 重构 导航网格

  • 精通 Apache Camel(二)导航 链接代理

让我们详细分析每个元素。

导航网格边界体积

如您从本章前面的部分中已经了解的那样,NavMeshBoundsVolume 实体负责定义导航网格将被计算的区域。通过选择它,您将注意到一个黄色边缘的区域被显示出来,包围了所有游戏级别,如图 3.9* 所示:

图 3.9 – 导航网格边界体积

您无法对此实体做太多;只需调整其大小,导航网格将重新计算。

重新构建导航网格

RecastNavMesh 实体将负责导航网格的生成;默认情况下,它在 Unreal Engine 编辑器中没有可见的表示。但是,如果您按键盘上的 P 键,导航网格将在编辑器界面中变得可见并可访问。图 3.10* 显示了在此实体可见后级别的样子:

图 3.10 – 重新构建导航网格

第六章,“优化导航系统”中,我将向您展示一些使用此实体优化网格生成的技术。现在,您只需检查详细信息窗口中的显示类别;在这里,您将能够访问一系列可视化工具,这些工具将在本书后面的内容中非常有用。例如,在图 3.11* 中,我展示了级别的各个部分——称为瓦片——以及它们的标签和生成的多边形:

图 3.11 – Recast Nav Mesh 实体的某些显示设置

您可能已经注意到,级别上的蓝色立方体实体以任何方式都没有影响导航网格。这是因为它们已被配置为不会影响导航;由于它们是可移动对象,我们不希望它们在周围创建不可导航区域。

作为简单的测试,在详细信息面板中,您可以查找始终影响导航属性并启用它;导航网格将立即重新计算,立方体将在其中挖一个洞,如图 3.12* 所示:

图 3.12 – 蓝色立方体实体雕刻导航网格

上述属性表示该对象将是导航区域中的障碍物,并且生成的洞将是网格中的不可导航区域。

请注意,让这样的可移动对象雕刻导航网格可能会产生不期望的结果;默认情况下,导航网格是静态的,无法在运行时进行更改。这意味着即使对象被移动,不可导航区域也将保持固定,尽管看不见,但会阻碍玩家角色进入或穿越它。

导航链接代理

在此示例中,最后一个导航网格实体是一个 NavLinkProxy 实体,在我们的级别中,它将允许玩家角色从平台上跳下来。

图 3.13 – 级别中的导航链接代理

现在您已经理解了导航网格的结构,让我们来检查角色控制器,以了解玩家角色是如何操纵的。

分析角色控制器

根据您在创建项目时的选择——蓝图或 C++——您将拥有两种略有不同的角色控制器版本。

蓝图角色控制器

移动控制器角色的代码相当简单,可以在BP_TopDownController中找到——位于Content/TopDown/Blueprints文件夹中。

一旦打开蓝图类,在函数选项卡中找到MoveTo函数并打开它;您将找到用于使玩家角色通过导航网格移动的简单移动到位置节点。

图 3.14 – MoveTo 函数

这就是您需要用来将玩家角色移动到级别中预定义位置的所有内容。

C++角色控制器

同样的逻辑可以在 C++生成的项目中找到;只需打开为玩家控制器生成的**.cpp类,查找OnSetDestinationReleased()**方法;您将找到以下代码行:

UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, CachedDestination);

这个辅助函数将启动您的代理的导航过程。

测试项目

现在您已经了解了参与此项目的所有演员,您可以简单地按播放按钮开始测试导航系统的工作方式。特别是,您会注意到角色将通过选择最短路径移动到目标点。

此外,一旦在左侧的升高平台上,它将能够跳下,这要归功于在该位置添加的导航链接代理。

摘要

在本章中,我向您介绍了虚幻引擎导航系统的关键组件。我们首先讨论了生成导航网格的过程,这对于 AI 代理在环境中导航至关重要。然后,我简要解释了路径查找算法的工作原理,使 AI 角色能够高效地找到路径。最后,我强调了使用自上而下项目模板的好处,该模板有效地利用了导航系统。

到现在为止,您应该已经很好地理解了虚幻引擎 AI 导航系统提供的功能。我想您一定渴望开始编码,这正是我们在下一章将要做的!

第四章:设置导航网格

我相当确信,到现在为止,你已经意识到在 AI 游戏开发中,一个关键要素是建立一个完全功能化的导航网格。这个实体作为基石,用于精确有效地引导 AI 控制的代理穿越游戏世界。

在本章中,我们将开始将这种理解付诸实践,通过启动一个新项目。到本章结束时,你将在自己的项目中开发和完善导航系统的实际经验。

这项知识将成为塑造你作为 AI 程序员道路上的一个关键里程碑,推动你朝着创造颠覆游戏行业的突破性游戏迈进!

在本章中,我们将涵盖以下主题:

  • 介绍 Unreal 敏捷竞技场

  • 创建 AI 代理

  • 设置基本关卡

  • 添加导航修改器

  • 与导航链接代理一起工作

技术要求

要跟随本章内容,你应该已经按照第一章中解释的,设置了 Visual Studio(或 JetBrains Rider)以及所有 Unreal 依赖项,入门 AI 游戏开发

github.com/PacktPublishing/Artificial-Intelligence-in-Unreal-Engine-5

如果你在这章中迷路了,在仓库中,你还可以在这里找到最新的项目文件:Unreal 敏捷竞技场 – 第四章 结束。此外,为了完全理解本章内容,在我引导你了解设置 AI 代理的关键特征的同时,你需要具备一些关于 Blueprint 视觉脚本的基本知识。

介绍 Unreal 敏捷竞技场

要启动一个成功的项目,拥有坚实的基础至关重要。想象一下,你开始阅读一本短篇小说,开头是这样的:

在一个隐藏在不起眼的建筑下的秘密地下实验室中,一位名叫马克斯博士的古怪科学家在他的最新发明上辛勤工作:AI 木偶。这些木偶并非普通的木偶;它们配备了先进的 AI 技术,使它们能够以最 意想不到的方式与环境互动。*

马克斯博士以其古怪个性和疯狂的想法而闻名。他相信这些木偶是理解人类行为和改善社会互动的关键。在他的忠实伙伴,维多利亚教授的陪伴下,他开始了一系列 令人捧腹的实验

嗯,看起来你已经找到了创建视频游戏行业下一个大热门的完美起点,你的任务是制作出令人惊叹的 AI 智能体,它们将通过与虚拟环境的无缝交互震撼游戏世界!

解释项目概述

你将要工作的项目将是一组健身房级别,在那里你将为你的 AI 智能体创建不同的行为。

注意

在游戏开发中,健身房通常指的是一个开发者可以测试和训练他们的 AI 算法和模型的训练环境。这个术语在强化学习的背景下也经常被使用,在那里 AI 智能体通过在模拟环境中试错来学习玩游戏。为了这本书的目的,我们将坚持第一种定义。

在我看来,在健身房工作是一个游戏原型阶段中最有趣的部分之一,因为你不需要过多担心事物是否完美运行;你可以尝试各种各样的事情,最终你很可能会想出富有创意和非常规的解决方案!

因此,首先,我提供了一个项目模板——称为 Unreal Agility Arena——你将在本书的其余部分使用它。在下载并在虚幻引擎中打开它之后,我们的主要焦点将是创建自包含的级别来实验到目前为止获得的知识。这将涉及处理小任务并有效地解决它们。

一旦你达到第七章,“介绍行为树”,你将准备好迎接更具挑战性的内容,事情会变得有点困难,但我也向你保证——这将更加吸引人和有趣!

注意

由于这本书是关于 AI 游戏编程而不是游戏设计,因此平衡游戏机制不会是游戏玩法的主要焦点。相反,重点将在于确保事物有效运行。

第一步是打开项目,深入挖掘我为你准备的丰富资源。那么,让我们开始吧!

开始项目

kaylousberg.com/

图 4.1 – 凯·卢斯伯格的网站

注意

在这个项目中,我主要使用了Prototypes Bits Extra包,一旦购买了许可证,这个包就可以免费分发。如果你打算将模型用于商业项目,请考虑也从凯的网站上购买许可证。

在本章开头提供的链接中下载文件后,解压它,通过双击 UnrealAgilityArena.uproject 文件来打开项目。

一旦项目打开,请检查 Content 文件夹中的内容。您将看到以下子文件夹:

  • 一个包含我用 Unreal Engine 建模工具 创建的一些额外模型的 _GENERATED 文件夹

  • 一个包含 Kay 所有模型的 KayKit 文件夹

  • 一个包含一些预制关卡,这些关卡已准备好使用的 Maps 文件夹

  • 一个包含项目资产所需的某些材质的 Materials 文件夹

  • 一个包含项目材料使用的某些纹理的 Textures 文件夹

  • 一个包含我们将要使用的某些 Niagara 效果的 Vfx 文件夹

在我们可利用的所有资源下,我们准备开始为项目创建元素,首先是一个将在我们的关卡中导航的代理。

创建 AI 代理

作为测试路径查找系统的第一步,我们将创建一个代理,其唯一目标是到达关卡内的一个目标演员;它不会有什么特别之处,只是一个能够到达关卡内目标点的演员。

让我们从在 Content Drawer 内创建一个新的文件夹并命名为 Blueprints 开始。双击新创建的文件夹以打开它并执行以下步骤:

  1. 右键单击 Content Drawer,然后从打开的菜单中选择 Blueprint Class

  2. 从将打开的 Pick Parent Class 窗口中,选择 Character ,如图 Figure 4 .2 所示:

Figure 4.2 – Character creation

  1. 将新创建的资产命名为 BP_NavMeshAgent

  2. 双击它以打开它。

如您可能已经知道,Character 类指的是一种特定的 pawn 类型,它被设计用来以垂直方式表示玩家或 AI 代理,允许他们在游戏世界中行走、跳跃、飞行和游泳。

我们将首先给它一个视觉表示,并设置主要值。

创建代理

Blueprint 类打开且选择 Viewport 选项卡的情况下,找到 Details 面板并按照以下步骤操作:

  1. 打开 Skeletal Mesh Asset 属性下拉菜单并选择 Dummy 资产。

  2. 打开 Anim Class 属性下拉菜单并选择 ABP_Dummy 资产。

  3. Character Movement (Rotation Settings) 类别中,找到 Max Walk Speed 属性并将其值设置为 500.0 cm/s

  4. Character Movement (Rotation Settings) 类别中,找到 Rotation Rate 属性并将 Z 值设置为 640.0°

  5. 在同一类别中,勾选 Orient Rotation to Movement 复选框。

  6. Shape 类别中,将 Capsule Half Height 属性设置为 120.0,将 Capsule Radius 属性设置为 50.0

  7. Pawn 类别中,取消勾选 Use Controller Rotation Yaw 属性。

之前的步骤相当直接,它们将仅设置角色网格,分配一个动画蓝图(该蓝图已经为您创建)以及,最后,设置胶囊组件大小和移动旋转设置。代理的最终结果显示在图 4 .3 中:

图 4.3 – 代理蓝图

代理几乎准备好了,我们只需要添加一些简单的代码逻辑,使其能够到达关卡中的目标。

添加导航逻辑

打开事件图选项卡并按照以下步骤操作:

  1. 在图中添加一个获取 AIController节点,并将其输入的受控演员引脚连接到一个指向****自我节点。

  2. Get AIController节点的输出返回值引脚点击并拖动,并将一个移动到演员节点添加到图中。

  3. Event BeginPlay节点的输出执行引脚连接到移动到演员节点的输入执行引脚。

  4. Move to Actor的输入目标引脚,点击并拖动,并在释放后选择提升为变量选项;为新创建的变量命名为TargetActor

  5. 我的蓝图选项卡中,选择TargetActor变量,并在其详细面板中检查实例****可编辑属性。

    这相当简单;在游戏开始时,代理将尝试导航到目标演员;将变量设置为实例可编辑将使其在关卡中可见,以便拾取代理目的地。您刚刚创建的视觉脚本代码显示在图 4 .4 中:

图 4.4 – 蓝图图

我们可能不是那么聪明的代理现在已经完全装备好,可以导航到指定的目标位置。在接下来的部分中,我们将为代理创建一个合适的环境,使其可以自由移动和探索。

设置基本关卡

我们现在将创建我们的第一个关卡并开始测试代理的路径查找系统。项目模板包含我为您创建的一些预制件,特别是用于快速原型设计地图的打包关卡演员集和一个关卡实例用于设置照明系统。您完全可以创建自己的游戏关卡,但在这一阶段,我的建议是跟随我将要进行的操作。

注意

在 Unreal Engine 中,关卡实例允许您创建关卡或关卡部分的可重用实例;这样,您可以有效地复制和重用关卡设计的一部分,而无需从头开始重新创建。打包关卡演员是一种优化的关卡实例类型,只能包含静态网格。关卡实例和打包关卡演员在您需要在关卡中重复使用复杂或重复元素时特别有用。

创建关卡

要创建我们的第一个健身房,请按照以下步骤操作:

  1. 从主菜单中选择文件 | 新建级别

  2. 导航到Maps/LevelInstances文件夹,并将LI_Lighting的实例拖动到您的级别中;将其变换位置设置为**(0, 0, 0)**。

  3. 导航到Maps/PackedLevelActors文件夹,并将PLA_Lab_01的实例拖动到你的级别中;将其变换位置设置为**(0, 0, 0)**。

  4. KayKit/PrototypeBits/Models文件夹中,将一些障碍物拖动到级别中,以使您的代理更加有趣;我的级别如图图 4 .5 所示:

图 4.5 – 基础级别

  1. 将级别保存在Maps文件夹中,并命名为Gym_NavMesh_01

添加导航网格

现在,您可以为级别添加导航网格:

  1. 从工具栏中的快速添加到项目按钮,选择Nav Mesh Bounds Volume并将实例拖动到级别中;将自动添加Recast Nav Mesh演员以及体积。

  2. 将体积的位置设置为**(0, 0, 0)缩放设置为(20, 20, 1)**。

  3. 在级别内点击并按下键盘上的P键以显示生成的导航网格,如图图 4 .6 所示:

图 4.6 – 导航网格

如您所见,您添加的障碍物将雕刻导航网格,并为即将添加的代理增添更多趣味。

添加代理

作为最后一步,我们需要添加代理和要到达的目标点。所以,让我们先做这个:

  1. Vfx文件夹中,拖动NS_Target Niagara 系统的实例并将其放置在导航网格上的任何位置。

  2. Blueprints文件夹中,拖动BP_NavMeshAgent Blueprint 的实例并将其放置在级别中蓝色的瓷砖上;位置值应大约为**(-1650, 30, 180)**。

  3. 在选择代理后,在细节面板中找到目标演员属性,并从下拉菜单中将其值设置为NS_Target,这是之前添加的 Niagara 系统。最终级别应类似于图 4 .7

图 4.7 – 最终级别

现在级别已经完成,我们可以开始测试它。

测试健身房

现在健身房已经完成,您可以从测试代理开始,看看它在级别中的行为如何。

您可以直接在工具栏中点击播放按钮,或者使用模拟按钮,它不会进入播放模式,但会显示级别如何工作的模拟。在这个上下文中,我个人更喜欢第二种选择,因为它会保持导航网格可见。

一旦开始模拟,您将看到代理通过最短路径到达目标演员。您可以自由地实验障碍物,以检查代理在不同场景下的行为。

在本节中,你已经开始亲手实验路径查找系统的运作方式。你通过创建一个智能体和一个简单的健身房环境来实现这一点,以便智能体进行导航。

在下一节中,你将向导航网格添加修饰符,以给你的智能体增加一些挑战。

添加导航修饰符

在本节中,我们将创建另一个健身房,以便我们可以测试导航网格修饰符——这些修饰符可以用来定义进入区域成本不同于常规导航网格的区域。

我们将首先创建关卡,然后添加修饰符。

创建关卡

要创建我们的第二个健身房,请按照以下步骤操作:

  1. 从主菜单选择 文件 | 新建关卡

  2. 导航到 Maps/LevelInstances 文件夹,并将 LI_Lighting 实例拖动到你的关卡中;将它的变换 位置 设置为 (0, 0, 0)

  3. 导航到 Maps/PackedLevelActors 文件夹,并将 PLA_Lab_04 实例拖动到你的关卡中;将它的变换 位置 设置为 (0, 0, 0)

  4. 将关卡保存在 Maps 文件夹中,并命名为 Gym_NavMesh_02

    现在,通过以下步骤重复你为之前健身房所做的相同步骤:

  5. 添加 Nav Mesh Bounds Volume 行为,并设置其边界以覆盖整个可通行区域。

  6. 在关卡蓝色瓷砖的对侧添加 NS_Target Niagara 系统。

  7. 在蓝色瓷砖上添加 BP_NavMeshAgent 蓝图,并将 目标行为者 属性值设置为 NS_Target 。现在关卡应该看起来像 图 4.8

图 4.8 – 更新的导航网格

到目前为止,一切与之前的健身房相当相似;我们现在将插入一个修饰符,看看它的表现如何。

添加修饰符

我们现在准备通过添加修饰符来改变路径查找系统的行为。为此,请按照以下步骤操作:

  1. 从工具栏中的 快速添加到项目 按钮选择 Nav Modifier Volume 并将实例拖动到关卡中。

  2. 将体积的 位置 设置为 (0, 0, 0)缩放 设置为 (5, 20, 1)

    你会注意到导航网格已经被修改,并且在放置棕色(让我们说泥泞的)瓷砖的地方被雕刻出来。

图 4.9 – 添加了修饰符的关卡

如果你现在测试关卡,你会看到智能体向目标点移动,但在泥泞地形旁边停止;这是因为修饰符体积改变了导航网格,现在智能体无法到达其目标。

通过选择 Nav Modifier Volume 行为并在 细节 面板中检查 区域类 属性,你会注意到它已被设置为等于 NavArea_Null 的值。此值将该区域应用于无限成本,使其对智能体来说无法穿越。

图 4.10 – 区域类属性

如果您尝试将此值设置为NavArea_Default,您会注意到导航网格的行为将像没有修饰符一样,这正是此值所做的那样;遍历此部分的成本与常规网格的成本相同。通过现在测试健身房,您会注意到智能体会穿过泥泞地形并到达目标点。

如果您需要检查导航网格中每个多边形的遍历成本,可以通过选择Recast 导航网格演员,并在详细信息面板中检查绘制多边形成本属性来完成。图 4.11 显示了在关卡中的成本可视化:

图 4.11 – 导航网格遍历成本

让我们使关卡更有趣,并添加一些自定义修饰体积。

改进关卡

现在让我们为我们的智能体创建一个安全路径,以免它在泥泞区域弄脏脚。我们将通过使用一些额外的模型来创建一条通道。为此,请按照以下步骤操作:

  1. KayKit/PrototypeBits/Models文件夹中,找到Pallet_Large_Pallet_Large模型。

  2. 将此模型的三个实例拖放到关卡中,以在泥泞区域创建通道,如图 4.12 所示:

图 4.12 – 桥梁

是时候为桥梁添加另一个修饰符了:

  1. 修改关卡中之前添加的导航修饰体积演员的大小,使其覆盖河流左侧的泥泞通道。

  2. 在关卡中添加另一个导航修饰体积演员,使其覆盖河流右侧的泥泞通道。

  3. 在关卡中添加一个第三个导航修饰体积演员,并将其放置以创建覆盖整个桥梁的区域。

在 Unreal Engine 中,导航修饰体积是一个用于更改导航网格生成方式的演员,可以添加到关卡中以指定导航网格本身的某些区域。

您现在应该有三个修饰符创建的完全无法通行的区域,如图 4.13 所示:

图 4.13 – 带有修饰符的桥梁

现在我们已经添加了一条安全通道,我们将创建自定义修饰符以进行不同的设置实验。

创建自定义修饰符

修饰符是扩展NavArea类的蓝图;这意味着您可以通过子类化此类型并设置自己的参数来创建自己的修饰符。

我们现在将创建一个用于泥泞表面的和一个用于桥梁的修饰符。让我们从第一个开始:

  1. 打开内容抽屉,在蓝图文件夹中,右键单击并选择蓝图类

  2. 所有类下拉列表中选择NavArea类型。

  3. 将新创建的资产命名为NavArea_Mud并双击它以打开。

  4. 按以下方式更改其值:

    • 默认成本更改为10.0

    • 固定区域进入成本更改为2.0

    • 绘制颜色更改为你选择的易于识别的颜色。

图 4.14 – 污泥导航区域的成本设置

虽然绘制颜色值几乎不言自明——它将被用来为体积覆盖的导航网格区域着色——默认成本是应用于穿越该区域整体成本的一个乘数。这意味着路径查找系统将计算穿越成本乘以默认成本的值。另一方面,固定区域进入成本是一次性应用的成本——当代理进入体积覆盖的区域时。在这种情况下,我们选择了进入泥泞区域的固定成本和穿越它的高成本。

现在,让我们为桥梁区域执行相同的步骤:

  1. 打开内容抽屉,在蓝图文件夹中,右键单击并选择蓝图类

  2. 所有类下拉列表中,选择NavArea类型。

  3. 将新创建的资产命名为NavArea_Bridge并双击它以打开。

  4. 按以下方式更改其值:

    • 默认成本更改为5.0

    • 固定区域进入成本更改为0.0

    • 绘制颜色更改为你选择的易于识别的颜色。

图 4.15 – 桥梁导航区域的成本设置

在这种情况下,我们希望为代理创建一条更简单的路径,因此我们将固定成本设置为0.0,并将穿越成本设置为更低的值。

我们现在需要将这些类应用到关卡中的修饰符上。

应用自定义修饰符

我们现在准备好获取新创建的类并将它们应用到关卡修饰符上。为此,请按照以下步骤操作:

  1. 选择两个泥导航修饰体积,在详细信息面板的区域类属性下拉列表中,选择NavArea_Mud

  2. 选择桥梁导航修饰体积,在详细信息面板的区域类属性下拉列表中,选择NavArea_Bridge

导航网格应该已更新,并应看起来像图 4.16中所示:

图 4.16 – 修改后的导航网格区域

注意

根据你创建桥梁的方式,你可能会有比我更不规则的修饰区域;此外,导航网格可能生成得不够完全可通行。为了解决这些问题,你需要稍微调整模型面板的Z值和修饰区域的大小。

我们最终准备好测试这个关卡。

测试关卡

要测试你的健身房,只需开始关卡模拟;你应该看到你的代理走向桥梁,穿过它,并到达目标点。尽管泥泞的地形是可通行的,但穿过它的成本比穿越桥梁要高。

为了双重检查,请在桥梁上添加一些不可通行的障碍物,就像我在图 4.17中做的那样:

图 4.17 – 被阻挡的桥梁

如果你开始模拟,你会看到代理直接走向目标点;尽管泥泞的地形有很高的通过成本,但没有其他可行的解决方案,所以代理将选择它。

这部分内容到此结束,你学习了如何使用修饰符。在下一节中,我将向你展示另一种使用链接代理修改导航网格的方法。

与导航链接代理一起工作

如我们已在第三章中看到的,介绍虚幻引擎导航系统导航链接代理是一个用于定义代理可以导航的特定区域的演员,即使关卡的一部分无法穿越。导航链接代理放置在游戏世界中,以标记起点和终点,创建一个导航链接。此链接将在两个可能无法直接到达的区域之间提供连接——可以是单向或双向的。

为了检查这个链接是如何工作的,我们将创建一个新的健身房。

创建关卡

要创建这个新的健身房,请按照以下步骤操作:

  1. 从主菜单中选择文件|新建关卡

  2. 导航到Maps/LevelInstances文件夹,并将LI_Lighting实例拖动到你的关卡中;将其变换的位置设置为**(0, 0, 0)**。

  3. 导航到Maps/PackedLevelActors文件夹,并将PLA_Lab_03实例拖动到你的关卡中;将其变换的位置设置为**(0, 0, 0)**。

  4. 将关卡保存在Maps文件夹中,并命名为Gym_NavMesh_03

这个健身房中间有一个宽阔的水道,还有一个桥梁,如图 4.18所示:

图 4.18 – 健身房

现在,让我们添加几个导航网格——每个可通行区域一个——以及代理和目标点:

  1. 添加两个导航网格边界体积演员,并设置它们的边界,以便覆盖河流两侧的可通行区域。

  2. 在关卡蓝色瓷砖的对侧添加NS_Target Niagara 系统。

  3. 在蓝色瓷砖上添加BP_NavMeshAgent蓝图,并将目标演员属性值设置为NS_Target。现在关卡应该看起来像图 4.19

图 4.19 – 带有导航网格的健身房

如果你现在测试你的训练场,你会注意到你的智能体走向目标点,但在水道附近停下。嗯,我想这就像一只企鹅穿着燕尾服参加一个盛大的派对一样出人意料——没有联系,所以不可能有成功的路径搜索!

现在让我们让智能体穿过这座桥。

添加导航链接代理

要添加一个连接水道两边的链接,请按照以下步骤操作:

  1. 在工具栏中的快速添加到项目按钮中选择导航链接代理,并将一个实例拖到关卡中。

    你会注意到这个演员有几个菱形的小工具,分别称为PointLinks[0].LeftPointLinks[0].Right;这些是形成你的链接代理的连接点。

图 4.20 – 两个点链接之一

  1. 选择每个点链接并将它们移动到桥梁的两侧,如图 图 4.21 所示:

图 4.21 – 一个导航网格代理

点链接属性是一个可以用来在不可达位置之间创建连接的元素列表。默认情况下只有一个,但你可以添加任意多个。

测试训练场

既然这个训练场也完成了,你可以测试它来看看你的智能体表现如何。一旦模拟开始,你会看到智能体通过桥梁到达目标点,就像上面存在导航网格一样。

注意

如果你尝试在桥上放置一些障碍物,你会注意到你的智能体直接冲过去然后停下;这是因为桥上实际上没有导航网格,而是一个直接的链接。这意味着导航链接代理是一个强大的工具,但需要明智地使用。

在本节中,你看到了如何使用导航链接代理连接导航网格中不可达的部分;有了这些新知识,你就可以让你的 AI 朋友们做一些史诗般的悬崖跳水,并完成各种古怪的花样了!

摘要

在本章中,你开始使用导航系统;从简单的可导航区域开始,你添加了一些障碍物并检查了智能体的行为。接下来,你学习了如何通过添加不可穿越区域或困难地形来修改可通行区域。最后,你了解了一些如何连接导航网格不连续部分的方法。

所有这些知识都是至关重要的,因为它帮助你的 AI 代理确定他们可以去哪里而不会撞到墙壁或陷入混乱的迷宫。你可以把导航网格想象成你数字伙伴的 GPS,确保他们不会在虚拟荒野中迷路!

在下一章中,我们将更深入地探讨导航网格的领域;准备好在 Unreal Engine 中创建更多高级和迷人的内容吧!

第五章:改进智能体导航

现在你已经对 Unreal Engine 路径查找系统的基本原理有了牢固的掌握,是时候深入挖掘并开始研究增强智能体导航系统复杂运作的方法了。

在本章中,你将了解如何改进你的导航网格生成和智能体移动:从动态生成的网格开始,经过查询环境,直到有效地避开其他智能体。

到本章结束时,你将掌握一些全新的技能,让你的关卡更加引人入胜和有趣。这些知识将成为引导你走向创建复杂游戏的基础构建块,最终提升你作为 AI 游戏程序员的技能。

在本章中,我们将涵盖以下主题:

  • 运行时生成导航网格

  • 使用查询过滤器影响导航

  • 实现智能体避让

技术要求

要跟随本章中介绍的主题,你应该已经完成了前面的章节,并理解了它们的内容。

github.com/PacktPublishing/Artificial-Intelligence-in-Unreal-Engine-5

你可以通过点击Unreal Agility Arena – 第四章 - 结束链接下载与上一章结尾对应的文件。

运行时生成导航网格

让我们继续我们在第四章中开始的短篇故事,设置导航网格

在秘密研究实验室中,一项突破性的实验正在进行。由马克斯博士和维克托利亚教授开发的 AI 木偶,准备开始一项任务:配备了先进的路径查找系统,木偶被巧妙地放置在实验室复杂的走廊和 相连的房间 网络中

他们面对模拟的建筑工地、意外的障碍,甚至模拟的干扰,这些干扰阻碍了他们的路径。然而,凭借他们最先进的 AI 能力,木偶迅速适应了不断变化的情况,运用他们的独创性找到替代路线,并巧妙地穿过了 实验室 错综复杂的布局

如果你正在使用导航网格,那么你迟早会遇到移动的物体,这将导致智能体到达目标的路径发生变化。

这就是为什么静态导航网格生成将变得毫无用处;你需要某种类型的系统来在运行时更新导航网格。这就是为什么 Unreal Engine 提供了多种生成此类网格的方法。

第三章中所述,介绍虚幻引擎导航系统,生成方法可以从项目设置或层级中的Recast Nav Mesh演员中更改;由于我们只需要更改此层级的导航网格生成,我们将选择第二个选项。

但首先,我们需要为我们的木偶代理创建一个可以行走的层级!

创建层级

要创建这个健身房,请按照以下步骤操作:

  1. 从主菜单中选择文件 | 新建层级

  2. 导航到Maps/LevelInstances文件夹,并将LI_Lighting实例拖动到你的层级中;将其变换的位置值设置为**(0,** 0,0)

  3. 导航到Maps/PackedLevelActors文件夹,并将PLA_Lab_02实例拖动到您的层级中;将其变换的位置值设置为**(0,** 0,0)

  4. Maps文件夹中保存层级,并将其命名为Gym_NavMesh_04

这个健身房有一个楼梯块和一个分离的平台,如图图 5.1所示:

图 5.1 – 健身房

现在,让我们添加导航网格以及代理和目标点:

  1. 添加一个导航网格边界体积演员,并设置其边界,使其覆盖整个层级。

  2. 在隔离平台的顶部添加NS_Target Niagara 系统。

  3. 在蓝色瓦片上添加BP_NavMeshAgent蓝图,并将目标演员属性值设置为NS_Target。现在层级应该看起来如下:

图 5.2 – 带有导航网格的健身房

由于我们使用的是一个比上一章中展示的层级稍微复杂一些的层级,您可能会遇到与我的截图中描述的略有不同的网格生成;楼梯导航网格可能看起来与其它部分分离,或者您可能会遇到一些其他问题。图 5.3展示了您可能遇到的典型场景:

图 5.3 – 破坏的导航网格

要解决此类问题,您需要稍微调整Recast Nav Mesh演员的设置。例如,您可以尝试以下操作:

  1. 默认单元格高度属性值设置为40.0

  2. 代理半径设置为70.0

第一个值将使楼梯的可导航区域连接到整个层级,而第二个值将为网格的边缘添加一些额外的填充,以避免代理走得太近。只需稍微调整一下这些值,直到您得到满意的结果。

如果您现在测试层级,您会注意到代理会尝试到达目标点,但它会在分离平台的底部卡住;显然,没有通往目的地的路线,您的小代理可能无法到达那里,但它会尽力靠近。

现在,尝试在层级周围添加一些障碍物,迫使您的代理爬楼梯 – 就像图 5.4所示:

图 5.4 – 带有某些障碍的健身房

如果你测试关卡,智能体将在楼梯的第一步停下;这是由于这个可怜的家伙的步高太高了!为了解决这个问题,打开BP_NavMeshAgent蓝图,并在详细信息面板中查找角色移动:行走类别,并将最大步高值设置为55.0

这将允许智能体采取更高的步幅并爬上楼梯。再次测试关卡,你应该看到智能体正在爬楼梯并在其边缘处停下。到达最终目的地的旅程似乎对我们这位小友友来说是一个相当大的挑战!

让我们通过添加一条通往孤立平台(目标点所在位置)的路径来帮助它。

添加移动平台

为了让我们的智能体到达目标点,我们将添加一个移动平台;这将允许我们创建一个动态生成的导航网格。

创建蓝图

要做到这一点,我们将从一个静态网格开始,并将其转换为蓝图:

  1. 内容抽屉中,打开KayKit/ProtorypeBits/Models文件夹,并将一个Primitive_Cube_Primitive_Cube实例拖动到关卡中。

  2. 将其位置属性设置为**(380.0, 50.0, 60.0)**,以便连接楼梯和孤立黄色平台。

  3. 将此演员的移动性设置为可移动

  4. 选择此演员后,通过点击转换为 蓝图按钮将其转换为蓝图。

图 5.5 – 转换为蓝图按钮

  1. 将蓝图保存在蓝图文件夹中,并命名为BP_MovingPlatform

  2. 通过双击资产来打开蓝图。

我们现在将添加一些代码逻辑,以便使其移动。

添加代码

BP_MovingPlatform蓝图打开的情况下,开始执行以下步骤:

  1. 创建一个新的Vector类型变量,并将其命名为StartLocation

  2. 创建一个新的Float类型变量,并将其命名为VerticalOffset。从详细信息面板,检查实例 可编辑属性。

    这两个变量将分别存储平台初始位置和移动时覆盖的垂直距离。第二个变量也已被从关卡中设置为可编辑。

    现在,在事件图中,执行以下步骤:

  3. 添加一个Set Start Location节点,并将其输入执行引脚连接到Event Begin Play节点的输出执行引脚。

  4. 添加一个Get Actor Location节点,并将其返回值输出引脚连接到之前添加的设置节点中的Start Location输入引脚。

  5. Set Start Location节点的输出执行引脚,添加一个时间轴节点,并双击它以开始编辑。

    这部分代码存储平台的初始位置并初始化一个时间轴来设置平台动画。到目前为止的代码在图 5 .6中显示:

图 5.6 – 图表的第一部分

时间线将是一个简单的正弦曲线,它将控制平台的垂直偏移。要创建曲线,请执行以下步骤:

  1. 点击**+ 轨道按钮,从下拉菜单中选择添加****浮点轨道**。

  2. 将轨道命名为Alpha

  3. 将曲线的长度值设置为15.00

  4. 点击循环按钮使时间线无限重复。

  5. 在曲线图中,通过右键单击并选择添加关键点选项添加三个关键点。分别将关键点的值设置为以下:

    • 时间设置为0.0设置为0.0

    • 时间设置为7.5设置为1.0

    • 时间设置为15.0设置为0.0

  6. 右键单击每个关键点,并将关键点插值值设置为自动;这将使曲线呈正弦波形而不是线性。结果曲线如图5.7所示:

图 5.7 – 时间线曲线

返回到事件图,你应该会注意到时间线节点现在有一个Alpha输出引脚;我们将使用它来控制平台的垂直位置。开始执行以下步骤:

  1. 添加一个获取垂直偏移节点。

  2. 添加一个获取起始位置节点;右键单击其输出引脚,并选择拆分结构引脚以暴露结构中的XYZ引脚。

  3. 添加一个乘法节点,并将其两个输入引脚连接到垂直偏移输出引脚和时间线Alpha输出引脚。

  4. 添加一个添加节点,并将其两个输入引脚连接到乘法节点的输出引脚和获取起始位置节点的起始位置 Z输出引脚。

  5. 在图中添加一个设置演员位置节点,将其输入执行引脚连接到时间线节点的输出执行引脚,并执行以下操作:

    1. 右键单击新位置输入引脚,并选择拆分结构引脚以暴露结构中的XYZ引脚。

    2. 新位置 X输入引脚连接到获取起始位置节点的起始位置 X输出引脚。

    3. 新位置 Y输入引脚连接到获取起始位置节点的起始位置 Y输出引脚。

    4. 新位置 Z输入引脚连接到添加节点的输出引脚。此部分图表的结果如图5.8所示:

图 5.8 – 图表的第二部分

尽管代码相当长,但它相当直观;它只是简单地使用时间线节点来计算随时间变化的偏移量,并将其应用于平台的Z位置。在运行时,平台将不断上下移动,每 15 秒就会到达目标点一次——即循环的持续时间。

如果你现在模拟健身房 – 导航网格可见 – 会发生一些奇怪的事情;尽管平台会上下移动,但导航网格将保持最初生成的状态,留下一个漂浮的通道。

图 5.9 – 静态生成

这个问题发生是因为导航网格是静态生成的,在运行时不会改变;这个可怜的小家伙在试图到达目标点时会掉落,因为它相信存在一条通道!

让我们立即通过使导航网格动态化来解决这个问题。

使导航网格动态化

如本节开头所述,我们将只为这个级别设置网格运行时生成活动,因此我们需要更改Recast 导航网格演员。为此,选择Recast 导航网格演员,在详细信息面板中找到运行时类别。将运行时生成下拉值设置为动态

如果你测试健身房,你现在将看到导航网格以固定间隔更新,通道将被中断。

图 5.10 – 动态生成

你可能会注意到代理会在楼梯平台的边缘停下来,当移动平台创建通道时不会继续前进。为了修复这个小问题,请执行以下操作:

  1. 打开BP_NavMeshAgent并断开事件 BeginPlay节点。

  2. 移动到演员的输入执行引脚连接到事件 Tick节点的输出执行引脚。

  3. 打开类默认值选项卡,将Tick 间隔(秒)属性设置为0.5,使更新更稀疏。更新后的蓝图如图 5.11 所示。

图 5.11 – 更新后的蓝图

我们在这里所做的是相当简单的;我们不是在游戏开始时一次性执行代码,而是将其设置为每帧执行一次 – 设置为半秒 – 以保持设置最终目的地。这可能不是最性能高效的解决方案,但应该适用于我们的小型原型。

注意

请记住,在运行时更新导航网格计算量很大;这意味着你应该只在必要时使用此功能,并且大多数时候坚持静态生成。

现在你已经掌握了创建动态导航网格,你的小代理在向目标点导航时将面临挑战。生活 – 或者更确切地说,人工生活 – 对它来说将不再那么简单了!

在下一节中,我将向您介绍导航过滤器,这是一个功能,将允许你改变代理在导航网格上的行为方式。

使用查询过滤器影响导航

如同在第三章中提到的,展示虚幻引擎导航系统,使用查询过滤器,你可以自定义调整 AI 代理的导航路径,使你能够增强和优化它们在环境中的移动。

你可能已经注意到,在之前创建的图中,Move to Actor方法有一个名为Filter Class的属性(见图 5.11);这将允许我们自定义我们的代理在导航网格上的行为方式。

通过扩展NavigationQueryFilter类并设置一些适当的值来创建一个过滤器,因此让我们先创建这样一个类并看看它的工作方式。

创建级别

作为第一步,我们需要一个用于测试过滤器的健身房;在这种情况下,我们将复制一个现有的一个并稍作调整:

  1. 复制Gym_NavMesh_02地图,将其重命名为Gym_NavMesh_05,然后打开它。

  2. 从桥梁上移除所有障碍物(如果有)。

  3. 复制代理并将其放在第一个代理旁边,在蓝色瓷砖上。

  4. 为了使代理易于识别,你可能希望更改复制的材质;在我的情况下,我选择了MI_Prototype_B。最终级别应该像图 5.12中描述的那样:

图 5.12 – 基础健身房

如果你测试这个级别,不出所料,两个代理都会走向桥梁,穿越它,并到达目标点。

让我们稍微增加一些趣味性,怎么样?

创建查询过滤器类

我们现在将创建一个查询过滤器,将覆盖导航修改器的考虑方式;我们希望泥泞区域被视为成本较低且易于穿越,但仅针对单个代理。为此,请按照以下步骤操作:

  1. 打开内容抽屉,在蓝图文件夹中创建一个新的导航查询****过滤器类型的蓝图类。

  2. 将资产命名为NavFilter_MudWalker,双击它以打开它。

  3. 细节面板中,你会看到一个区域数组属性;点击**+**按钮添加一个元素。

  4. 打开元素并执行以下操作:

    • 区域类下拉菜单中选择NavArea_Mud

    • 打开旅行成本覆盖复选框并将其值设置为1.0

    • 打开进入成本覆盖复选框并将其值设置为0.0

图 5.13 – 查询过滤器设置

我们基本上在创建我们级别泥泞区域的不同的成本 – 也就是说,NavArea_Mud修改器放置的地方。

我们现在需要稍微修改一下 AI 代理,以便它能够接受这种修改器。

修改代理

我们需要对代理进行一些轻微的修改,因此打开BP_NavMeshAgent蓝图类并执行以下操作:

  1. Move to Actor节点,点击并拖动Filter Class输入引脚,并在释放后选择提升变量

  2. 将新创建的变量命名为FilterClass,并在细节面板中检查相应的属性使其可实例编辑

  3. 编译蓝图,并在细节面板中再次确认默认值设置为

无论何时你告诉智能体移动到目标点,它都会使用FilterClass变量——如果设置为任何值——来覆盖寻路网格成本规则。

让我们在实际操作中测试一下。打开你的健身房,选择第二个智能体;然后,从详细信息面板中,从过滤器类别下拉菜单中选择NavFilter_MudWalker

测试健身房,你现在会注意到第二个智能体直接移动到目标点,穿过泥地。这个顽皮的 AI 智能体已经叛变,决定玩弄手段,不是吗?

在本节中,你发现了覆盖寻路网格成本的能力,这为你创建高度可定制的 AI 角色提供了显著的力量。有了这项新能力,你可以让你的 AI 角色表现出独特的个性,并从人群中脱颖而出。我相当确信你会理解这为创建独特和动态的游戏体验开辟了一个全新的世界。

在下一节中,我将向你展示 AI 寻路中的另一个重要技术,那就是如何让你的 AI 智能体避免彼此。

实现智能体避免

毫不奇怪,大多数时候,你将在一个关卡中与多个智能体一起工作,这意味着他们很可能会有交叉的寻路规则;这意味着你的 AI 实体有很大的风险相互碰撞。虽然这可能很有趣,但我猜这并不是你在游戏中的预期行为。

正因如此,Unreal Engine 提供了一个开箱即用的——但默认情况下是禁用的——避免系统。在本节中,我们将考虑如何让 AI 智能体避免彼此。

和往常一样,我们将从一个全新的健身房开始。

创建关卡

作为第一步,我们需要一个带有一些障碍物的健身房。为了开始,请执行以下操作:

  1. 从主菜单中选择文件 | 新建关卡

  2. 导航到Maps/LevelInstances文件夹,并将LI_Lighting实例拖动到你的关卡中;将其变换的位置值设置为**(0, 0, 0)**。

  3. 导航到Maps/PackedLevelActors文件夹,并将PLA_Lab_05实例拖动到你的关卡中;将其变换的位置值设置为**(0, 0, 0)**。

  4. Maps文件夹中保存关卡,并将其命名为Gym_NavMesh_06

这个健身房比之前的要大一些,并有一些障碍物使事情更有趣。此外,还有八个蓝色方块——我们将使用八个智能体——如图 5.14所示:

图 5.14 – 健身房

添加智能体

如前所述,我们将添加几个智能体——总共八个——以检查它们在拥挤环境中的行为。因此,请按照以下步骤操作:

  1. 在关卡中添加八个BP_NavMeshAgent蓝图实例,并将每个实例放入关卡中的一个蓝色方块中。

  2. 添加八个NS_Target Niagara 系统实例,并将它们放在每个蓝色方块后面。

  3. 对于每个代理,将目标演员属性值设置为位于健身房另一侧的NS_Target Niagara 系统。现在关卡应该看起来像图 5.15

图 5.15 – 完成的健身房

如果你尝试测试健身房,很可能会发现一些代理会与图中5.16所示的反方向移动的其他代理相撞:

图 5.16 – 哎呀,这很疼!

幸运的是,我们的代理配备了安全头盔,而你的游戏中的角色可能没有任何保护地四处游荡!这就是为什么我们要使代理的路径寻找稍微聪明一点。

激活避障

一旦你打开了BP_NavMeshAgent蓝图,你就可以启用避障系统。为此,请按照以下步骤操作:

  1. 详细信息面板中,找到角色移动:避障类别,并检查使用 RVOAvoidance属性。

  2. 避障考虑半径设置为2000.0

第三章所述,介绍虚幻引擎导航系统,RVO 指的是一个功能,它使 AI 代理能够避免相互碰撞。

当为角色或代理启用使用 RVOAvoidance属性时,它允许它们动态调整其移动以避免与环境中的其他代理发生碰撞。避障考虑半径属性用于定义代理考虑其他代理进行避障的半径。

在此测试健身房将让你看到避障系统在工作;代理会在到达目标点的同时避免彼此。

测试最坏情况

让我们测试一些不同的事情;我们将创建一个对代理来说空间更具挑战性的健身房。新的健身房将是上一个的副本。首先按照以下步骤操作:

  1. 复制Gym_NavMesh_06地图,并将其命名为Gym_NavMesh_07

  2. 添加一些障碍物,将创造一个狭窄的路径,几乎迫使角色遵循单一、特定的路线。我的健身房在图 5.17中显示:

图 5.17 – 最坏情况

测试游戏,你会看到所有代理都在努力避免相互碰撞。你可以进行反测试,取消选中使用 RVOAvoidance属性;你会注意到所有代理最初聚集在一起,然后相互碰撞,最终解决路径并到达各自的目标点。

图 5.18 – 大规模碰撞

在本节中,你学习了如何为在导航网格上移动的代理实现避障,确保它们可以在积极避免与其他代理碰撞的同时成功导航。

摘要

在本章中,我们介绍了虚幻引擎寻路系统的一些更高级的功能。首先,我们看到了如何创建一个可以在运行时更新的导航网格。接下来,我们看到了如何覆盖代理解释导航网格部分成本的方式。最后,我们看到了如何使用内置的避障系统,以便 AI 代理不会相互碰撞。

在即将到来的章节中,我们将探讨寻路系统的最后一个组成部分:调试和优化技术。我们将探讨如何识别和解决可能出现的任何问题,并优化系统以提高性能。准备好迎接一个既激动人心又富有信息量的会议吧!

第六章:优化导航系统

随着项目的复杂性增加,确保导航网格精细调整以实现平滑高效的 AI 代理移动变得至关重要。这就是为什么在本章中,我们将深入探讨优化和调试导航系统。

在本章中,我们将探讨各种技术和策略来优化导航网格,并讨论简化路径查找计算、减少计算开销和提升整体性能的方法。

你还将获得调试导航系统内可能出现的任何问题的工具和知识。从解决路径查找错误到识别导航网格的不一致性,我们将涵盖一系列调试技术,帮助你克服任何阻碍代理平滑导航的障碍。

在本章中,我们将涵盖以下主题:

  • 理解导航网格调试工具

  • 分析导航网格分辨率

  • 精炼导航网格生成

  • 进一步改进

技术要求

要跟随本章介绍的主题,你应该已经完成了前面的章节,并理解了它们的内容。

github.com/PacktPublishing/Artificial-Intelligence-in-Unreal-Engine-5

要下载最后一章末尾的文件,请点击虚幻敏捷竞技场 – 第五章 – 末尾链接。

理解导航网格调试工具

驱使他不懈追求完美的动力,马克斯博士深入调试和改进人工智能木偶的任务。凭借不懈的精神和充满创新思想的头脑,他着手微调木偶的能力,并解决他们在实验中遇到的任何故障或不足。

在他的忠实助手,维多利亚教授的陪伴下,马克斯博士仔细分析了来自木偶之前探险收集的数据,审查每一行代码,寻找任何潜在的错误,并寻求提升他们表现的机会。

作为游戏程序员,你知道优化游戏中的代码和追踪错误对于创建成功的游戏至关重要。AI 系统也不例外。幸运的是,虚幻引擎提供了一套功能 – 调试工具,这些工具为你提供了宝贵的洞察力,让你能够实时可视化并分析导航网格。在本节中,我们将开始探索这些工具,以检查系统的行为以及它是否运行良好。

注意

在本章中,我们将考虑调试工具的一部分,这将让你分析导航网格系统,但你应该知道 AI 调试系统覆盖了 Unreal Engine 中所有可用的 AI 功能。这就是为什么我会在本书的后面部分回到调试工具,当我将涵盖其他 AI 主题时。

让我们首先检查如何启用 AI 调试工具以及如何开始使用导航网格调试功能。

启用 AI 调试工具

要启用调试工具,你只需要按下键盘上的撇号键()。请注意,在某些键盘布局中——比如我的——这个键可能不可用;你可以通过以下步骤添加自己的快捷键:

  1. 从主菜单中选择编辑 | 编辑器首选项

  2. 选择通用 – 键盘快捷键类别,并在搜索栏中输入show ai debug

  3. 显示 AI 调试字段中,插入你喜欢的快捷键。在我的情况下,我选择了数字键盘上的**/**字符。

图 6.1 – AI 调试器快捷键

  1. 启用 AI 调试工具后,你可以使用以下数字键盘键来切换 AI 信息:

    • 数字键盘 0:显示或隐藏当前可用的导航网格数据信息

    • 数字键盘 1:显示或隐藏一般 AI 调试信息

    • 数字键盘 2:显示或隐藏行为树调试信息

    • 数字键盘 3:显示或隐藏 EQS 调试信息

    • 数字键盘 4:显示或隐藏 AI 感知调试信息

    • 数字键盘 5:显示或隐藏 AI 感知系统调试信息

让我们开始检查这些工具,使用我们在前几章中创建的健身房级别。

检查 AI 调试工具

要开始使用 AI 调试工具,你需要一个级别。所以,首先打开Gym_NavMesh_01级别并执行以下操作:

  1. 通过按下P键禁用导航网格可视化工具——如果已启用——以避免混乱 AI 信息显示。

  2. 启动级别模拟并立即暂停。

  3. 通过按下撇号键启用 AI 调试工具;这将打开一个侧边栏,你将看到一些显示消息,如图图 6.2所示:

图 6.2 – AI 调试工具在实际应用中

  1. 启用调试工具后,请确保导航网格AI类别已启用,并且所有其他类别都禁用,使用相应的数字键盘键。启用的类别将以绿色突出显示,如图图 6.3所示:

图 6.3 – 启用类别

游戏暂停状态下,请执行以下操作:

  1. 查找BP_NavMeshAgent,你会注意到它现在有一个红色图标与之关联。

  2. 点击演员以选择它;这将显示一些关于它的信息。其中最重要的是相关的 AI 控制器。

图 6.4 – 人工智能代理

此外,在显示中,你将看到有关人工智能代理的附加信息,如图图 6.5所示:

图 6.5 – 人工智能代理信息

如您从图中所见,这种显示提供了大量信息,包括控制者、控制器和代理正在行走的网格。

最后,你可能会得到关于导航网格和寻路系统最有趣的信息之一;如果你在关卡中移动,你会看到组成通往目标点的路径的多边形的突出显示。

图 6.6 – 寻路多边形

作为额外的练习,你可以打开所有其他关卡,看看你可以从工具中获得哪些信息。例如,你可以查看Gym_NavMesh_04关卡,并检查当移动平台上下移动时会发生什么。

在本节中,你已经了解了将提供有关人工智能系统有意义信息的工具;在下一节中,我将向你展示如何从你的关卡中提取关于导航网格生成的见解,以便优化它们。

分析导航网格分辨率

Unreal Engine 提供了一个导航网格分辨率系统,允许开发者在单个导航网格内创建三个不同细节级别的网格瓦片。这意味着你可以生成具有高、中(默认选项)或低精度设置的瓦片集。通过选择不同的精度级别,用户可以在游戏进行时实现动态导航网格的更快生成(从计算时间来看)。

注意

当我们谈论分辨率时,我们指的是为了绘制特定导航区域而产生的单元格的精度和数量。

高分辨率瓦片可能会将给定区域划分为更多的多边形,以更精确地近似其形状。相反,低分辨率瓦片将包含相同区域,但多边形数量较少。这种权衡使得瓦片生成更快,但可能会在过程中牺牲一些精度。

作为第一次测试,我们可以开始分析我们的一个健身房:

  1. 打开Gym_NavMesh_01关卡。

  2. 为了更好地查看关卡,选择俯视图

图 6.7 – 选择俯视图

  1. 大纲中,选择重铸导航****网格演员。

    要获取关于你的导航网格成本的总体信息,请执行以下操作:

  2. 在仍然选择重铸导航网格演员的情况下,检查细节面板中的绘制瓦片边界属性。

  3. 检查绘制瓦片边界次数属性。你应该得到如图图 6.8所示的视图:

图 6.8 – 瓦片和瓦片生成时间

绘制瓦片边界时间 属性显示了处理特定瓦片的时间成本;您会发现更复杂的区域需要更多时间来计算。如果您想要更直观的成本表示,可以检查 绘制瓦片构建时间热图,这将启用成本的热图可视化,如图 图 6.9 所示:

图 6.9 – 热图可视化

注意

如果你对这个功能不熟悉,热图是一种使用颜色编码系统来显示特定属性在定义区域或数据集中体积或强度的视觉表示。热图具有适应性,并在多种场景中得到应用,包括数据分析、用户行为分析和地理表示。在我们的场景中,通过将颜色与不同级别的强度相关联——蓝色代表成本较低的区域,较浅的颜色代表成本较高的区域——热图可以照亮成本增加或减少的区域,使观察者能够识别模式和关键情况。

这种视图在处理大型区域并希望获得资源密集型区域概览时特别有用。在前面的图中,红色区域是导航成本较高的区域。

在本节中,您已经掌握了分析导航网格以识别潜在问题的过程;在下一节中,我们将探讨解决和改进其生成的策略。

精细化导航网格生成

环境的复杂性直接影响系统生成导航网格所需的时间,这不足为奇。相反,如果生成时间较短,生成的导航网格可能不够精确。在大多数情况下,您的最终系统将涉及计算速度和精度之间的权衡。这意味着作为游戏开发者,了解如何正确设置您的导航网格生成是强制性的。

在本节中,我将为您提供一些关于如何优化导航网格生成方式的建议。

影响导航网格分辨率

下一个测试我们将执行的是修改导航网格的分辨率。首先按照以下步骤操作:

  1. 打开 Gym_NavMesh_02 级别。

  2. 如果它尚未启用,选择 顶视图

  3. 大纲 面板中,选择 Recast Nav Mesh 对象。

  4. 细节 面板中,检查以下属性:

    • 绘制 瓦片边界

    • 绘制瓦片 构建时间

    • 绘制瓦片构建时间 热图

    您应该得到类似于 图 6.10 的视图:

图 6.10 – 热图可视化

如您从热图中所见,中心部分成本较高。然而,整体几何形状相当简单;我们有泥泞区域和一座桥,它们基本上是矩形、未旋转的区域。让我们降低我们的网格成本。开始执行以下步骤:

  1. 大纲面板中,选择三个导航修改体积 – 两个泥泞区域和桥梁区域。

  2. 详细面板中,搜索导航网格分辨率属性,并在下拉菜单中选择

    你会注意到地图中央部分的时间成本会立即下降,如图图 6.11所示:

图 6.11 – 改进的导航网格

当你查看热图可视化时,你可能会看到一些未被前一次修改触及的瓦片 – 那些在边缘的瓦片 – 改变颜色并显得更昂贵。然而,不要被这个现象迷惑 – 系统只是突出显示在整体导航网格中成本更高的区域。实际上,如果你检查这些区域,你会发现成本根本没有改变;它们只是比中央地图的对应区域更昂贵。这意味着特定区域的成本相对于系统分析的所有其他区域是相对的。

作为另一个实验,你可以将桥梁的导航网格修改器演员设置为导航网格分辨率值为,看看结果。剧透一下!包括桥梁在内的瓦片将成为级别中最昂贵的部分!

改变导航网格分辨率

如果在这个时候,你还在想是否可以调整你级别的导航网格分辨率,答案是出人意料的肯定!

通过选择重铸导航网格演员,在详细面板中,你会找到一个导航网格分辨率参数选项,有三个字段 – 默认 – 这将让你决定你级别的单元格大小。

图 6.12 – 导航网格分辨率参数

作为一条经验法则,只需记住,单元格大小越高,区域成本越低。

改变瓦片大小

你已经知道导航网格被划分为瓦片,这些瓦片用于重建导航网格的特定部分。由于每个瓦片由单元格组成,重建瓦片意味着用更新的信息重新创建所有单元格。

较大的瓦片包含更多的单元格,因此重建成本比较小的瓦片更高。然而,在处理瓦片时,系统也会处理瓦片边缘的相邻单元格。在确定瓦片大小时,考虑这种额外的开销成本是很重要的。在某些情况下,处理多个较小瓦片的累积开销成本可能会超过重建单个大型瓦片的成本。因此,在选择合适的瓦片大小时,应仔细考虑以优化性能。

为了在运行时重建瓦片时实现最佳性能,Epic Games 的建议是将每个单元格大小属性(默认)设置为彼此的倍数,并将Tile size UU属性设置为可以除以所有单元格大小值的数值。例如,在图 6.13中,我为Gym_NavMesh_02关卡设置了以下值:

  • Tile Size UU960.0

  • 低单元格大小60.0

  • 默认单元格大小30.0

  • 高单元格大小15.0

图 6.13 – 单元格大小示例

如你所见,低单元格大小值可以除以默认单元格大小高单元格大小,得到一个整数值。同样,对于Tile Size UU,它可以除以低单元格大小默认单元格大小高单元格大小

作为额外的示例,图 6.14显示了具有这些值的相同关卡:

  • Tile Size UU1280.0

  • 低单元格大小80.0

  • 默认单元格大小40.0

  • 高单元格大小20.0

图 6.14 – 单元格大小替代示例

在第二个示例中,使用了更大的瓦片大小。然而,很明显,优化并不那么有效,导致空间利用效率低下。

在本节中,我向你提供了一些关于如何分析你的导航网格生成以及如何通过更改单元格分辨率和瓦片大小来有效优化的宝贵建议。在下一节中,我将提供一些额外的建议,帮助你使导航更加出色。

进一步改进

调整导航网格可能需要很长时间——这取决于你想要达到的目标——有时,这更多是试错和个人经验的问题。在本节中,我将为你提供一些额外的建议,帮助你改进地图,使其更加实用。

调整分辨率

选择合适的导航网格分辨率不仅是一个计算性能的问题;有时它甚至可能影响你的智能体导航。

例如,考虑一下图 6.15显示的Gym_NavMesh_07关卡的一部分:

图 6.15 – 导航网格分辨率

在这种情况下,默认单元格大小值已设置为20.0,如你所见,障碍物之间没有可通行区域。然而,如果你将值降低到5.0,你将得到一个完全不同的场景,如图 6.16所示:

图 6.16 – 改进的导航网格分辨率

如你清晰可见,障碍物之间现在有了开放通道;硬币越高,酒越精致!

禁用网格影响

有时,你的导航网格可能会因为可能导致无法到达路径的网格而变得杂乱,但它们被包含在导航网格生成过程中。在这种情况下,建议隐藏它们以防止它们影响生成时间。例如,考虑图 6.17中描述的情况:

图 6.17 – 无法到达的路径

如你所见,红色矩形区域是无法到达的,但中央的立方体在导航网格生成过程中将被计算。这意味着,尽管它不会影响任何路径查找解决方案,但它仍然必须被计算。在这种情况下,你可以通过完成以下步骤来排除它:

  1. 选择网格。

  2. 详细信息面板中,查找始终影响导航属性并取消选中复选框。

    网格现在将不会被排除在导航网格生成之外,但整体结果将保持不变,正如你从图 6.18中可以看到:

图 6.18 – 改进后的区域

你可以通过以下方式更进一步:

  1. 选择其他两个框,并取消选中两个的始终影响导航属性。

  2. 添加一个导航修改器体积演员,并将其缩放以包含整个区域。

  3. 将体积区域类属性设置为NavArea_Null

图 6.19显示了最终结果:

图 6.19 – 优化后的区域

如你所见,我们现在使用单个修改器来避免三个网格对最终导航网格生成的影响。想象一下,一旦你的关卡充满了各种道具和障碍物,你将节省多少时间!

摘要

在本章中,我们介绍了一些更高级的技术来帮助你改进导航网格生成。从调试工具开始,我们学习了如何分析和调整网格生成过程。最后,我们学习了几个技巧,这将帮助我们制作更有效的关卡。

有了这个,本书的第二部分到此结束;从下一章开始,准备好面对在游戏开发中讨论 AI 时可能最有趣的话题之一:行为树。

准备好。你的 AI 伙伴即将进行一次重大更新,它们将永远不再相同!

第三部分:决策制作

在本书的第三部分,你将全面了解 Unreal Engine 框架内强大且通用的行为树系统。此外,你还将了解高级功能,以便你可以实现自己的复杂游戏 AI 逻辑。

本部分包括以下章节:

  • 第七章 ,“介绍行为树”

  • 第八章 ,“设置行为树”

  • 第九章 ,“扩展行为树”

  • 第十章通过感知系统改进智能体

  • 第十一章理解环境查询系统

第七章:介绍行为树

在游戏开发的世界里,行为树是控制 AI 角色决策过程的分层结构,决定他们在游戏中的行动和反应。作为一名游戏程序员,深入研究行为树的复杂性至关重要,因为它将赋予你制作动态、智能和吸引人的虚拟实体的能力,从而增强玩家的游戏体验。

本章旨在提供对行为树和黑板以及它们在虚幻引擎中的应用的温和介绍。

在本章中,我们将涵盖以下主题

  • 解释行为树

  • 理解虚幻引擎中的行为树

  • 理解黑板

技术要求

遵循本章没有技术要求。

解释行为树

在更广泛的意义上,行为树是一种在计算机科学的许多领域使用的数学模型,包括视频游戏。它以模块化的方式概述了有限任务集之间的转换。行为树的力量在于它们能够从简单的组件中创建复杂的任务,而不必深入了解每个组件的实现细节。虽然行为树与分层状态机有一些相似之处——状态以分层组织,允许更好地重用行为——但主要区别在于任务,而不是状态,是行为的基本元素。主要优势在于它们的直观性,使得它们更不容易出错;这就是为什么它们在游戏开发行业中非常受欢迎。

今天的视频游戏越来越复杂,导致 AI 角色的复杂性成比例增加。因此,这些角色或代理的维护至关重要。与状态数量增加时难以维护的有限状态机系统不同,行为树为决策过程提供了实际且可扩展的解决方案。当代理执行行为树时,它会进行深度优先搜索以定位和执行最低级别的叶节点。

行为树相较于其他系统的关键优势在于它们的可扩展性、表达性和可扩展性。与其他系统不同,行为树不涉及状态之间的显式转换;相反,树中的每个节点都指定如何运行其子节点。这种无状态的性质消除了跟踪先前执行节点以确定下一组行为的需求。行为树的表达性源于对各种抽象级别、隐式转换和复合节点复杂控制结构的运用。

此外,在行为树中,转换是通过树节点之间交换的调用和返回值发生的,促进了双向控制转移机制。

行为树结构

行为树以树结构的形式直观表示,节点分为根节点控制流执行——或任务。在这个表示中,每个节点可能有一个父节点和一个或多个子节点。特别是以下几点值得注意:

  • 根节点没有父节点,只有一个子节点

  • 控制流节点有一个父节点和至少一个子节点

  • 执行节点有一个父节点,没有子节点

行为树的执行从根节点开始,它向其子节点发送执行触发器。

每当达到控制流节点时,它将控制树内的执行和决策流程,根据某些条件或规则确定应该执行哪些任务或子树。

每次触发执行节点时,它将执行一个特定的任务,如果任务正在进行,则向其父节点报告状态为运行,如果目标实现,则报告状态为成功,如果任务未成功,则报告状态为失败

图 7.1 显示了一个行为树执行示例,从根节点开始,到控制流节点,最后执行一个任务:

图 7.1 – 行为树示例

注意

行为树节点从上到下、从左到右执行;这也是它们通常编号的方式。

不言而喻,实现行为树的方式不止一种。这就是为什么在下一节中,我将深入探讨虚幻引擎系统的所有细节。

虚幻引擎中的行为树是什么?

在虚幻引擎中,行为树是类似蓝图——即,通过添加和链接具有特定功能的节点集来形成行为树图的资产。在行为树中执行逻辑时,使用一个称为黑板的单独资产——关于这一点将在本章后面提供更多详细信息——来保留行为树需要做出明智决策的信息。

行为树由一个BehaviorTreeComponent实例处理,该实例由AIController实例持有。需要注意的是,组件不是自动附加到控制器上的;您需要通过 C++或蓝图来添加它。如果没有组件,它将在运行时自动创建。

当比较虚幻引擎的行为树与其他行为树系统时,需要记住的一个关键区别是它们的事件驱动特性,这防止了代码的持续执行。而不是持续检查相关变化,虚幻引擎的行为树会监听可以触发树修改的事件。使用事件驱动架构提供了性能提升和调试能力的好处——这一点我将在接下来的章节中展示。

行为树节点实例化

需要注意的是,行为树在您的项目中作为共享对象存在;这意味着所有使用行为树的代理将共享相同的实例,并且所有共享对象都无法存储特定于代理的数据。使用共享节点的主要优势是提高 CPU 速度和减少内存使用。

可以通过多种方式利用特定于代理的数据 – 其中一种是我们将在本章后面看到的黑板 – 以提供更多关于如何使用行为树的灵活性。

另一种方法是实例化单个节点;这将使每个使用行为树的 AI 代理获得节点的唯一实例,但代价是更高的性能和内存使用。使用此方法的一个节点示例是播放动画任务。

执行顺序

如前所述,行为树节点是从上到下、从左到右执行的,虚幻引擎也不例外。节点按照此惯例编号,以便轻松跟踪执行顺序。图 7.2展示了来自Lyra 入门游戏项目的行为树,显示了带有相应序列号的节点:

图 7.2 – 行为树序列

备注

在虚幻引擎中,根节点不会被编号,因为它不被视为序列的一部分。

在本节中,您已经得到了对行为树及其执行方式的温和介绍。下一节将深入探讨虚幻引擎系统,帮助您更好地理解如何有效地将行为树融入您的游戏中。

理解虚幻引擎中的行为树

理解行为树及其构成对于在虚幻引擎中设计有效的 AI 系统至关重要;在本节中,我将向您介绍与行为树相关的关键概念,以帮助您开始开发自己的 AI 角色。

在虚幻引擎中,行为树有五种类型的元素:

  • 根节点

  • 任务节点

  • 组合节点

  • 装饰器

  • 服务

为了让您对每种类型有一个全面的理解,我将分别介绍它们,确保清晰地展示它们各自的功能。

根节点

根节点作为行为树的起始点;它在树中占据一个独特的位置,并受一套特殊规则的约束:

  • 树结构中只能有一个此类节点

  • 它只能有一个连接,如果此连接被移除,则整个树将禁用

  • 它不支持附加装饰器或服务节点

图 7.3 – 根节点

任务节点

任务节点负责执行诸如移动 AI 或调整黑板值等操作。任务将不会停止其执行,直到报告失败或成功的结果。

任务节点也可以附加一个或多个装饰器或服务,允许在游戏环境中实现更复杂的行为和交互。

任务节点

任务以紫色标识。

图 7.4 – 任务示例

Unreal Engine 包含一组预构建的任务,这些任务可供使用。这些任务解决了开发者可能需要的大多数通用场景。然而,任务可以被扩展,以便您创建自己的自定义节点。

这里是部分任务列表,这些任务将作为标准功能提供:

  • 完成结果:一旦执行,此节点将立即以定义的结果完成 - 成功失败中止进行中

  • 移动到:一旦执行,它将通过使用导航系统将 AI 代理移动到目标位置

  • 直接移动:一旦执行,它将不使用导航系统将 AI 代理移动到目标位置

  • 等待:一旦执行,它将使行为树在此节点上等待,直到经过指定的时间

  • 播放动画:一旦执行,此节点将播放指定的动画资源

  • 播放声音:一旦执行,此节点将播放指定的声音

正如您所看到的,任务代表 AI 代理可以执行的单个动作或操作;您可以使用它们创建简单的动作,或将多个任务组合以创建更复杂的行为。

复合节点

复合节点定义了分支的根并设置其执行规则;此外,它们是唯一可以应用于行为树根节点的节点。

复合节点也可以应用装饰器和服务,从而使其逻辑更加复杂。一旦应用了服务,它将在复合节点的子节点执行期间保持活跃。

复合节点

复合节点以灰色标识。

有三种复合节点可用:

  • 选择器

  • 简单并行

  • 序列

让我们逐一检查它们。

选择器

选择器节点按从左到右的顺序执行其子节点,并且它们会在任何一个子节点成功时立即停止执行。当一个选择器节点的子节点成功时,选择器本身被认为是成功的。另一方面,如果选择器的所有子节点都失败,选择器节点本身将被标记为失败。

图 7.5 – 选择器节点

简单并行

简单并行节点允许在完整树的同时执行单个主任务节点。主任务完成后,您可以通过完成模式属性决定节点是否应立即完成,停止次要树,还是等待次要树完成后再完成。

图 7.6 – 简单并行节点

序列

序列节点从左到右依次运行其子节点。当子节点失败时,将停止执行。如果子节点失败,序列也会失败。与选择器不同,序列的成功只有在所有子节点都成功时才会实现。

图 7.7 – 序列节点

装饰器

装饰器——有时也被称为条件——用于确定树中的分支,甚至单个节点是否可以执行。它们必须附加到复合节点或任务节点上。

装饰器在确定行为树中分支的执行路径方面起着至关重要的作用;它们本质上充当决策者,评估特定分支或单个节点是否应该继续执行。它们作为条件,评估继续沿着特定分支前进的可行性,如果任务——或子树——注定要失败,则发出预防性失败的信号。这种预防性操作有助于防止装饰器尝试执行注定要失败的任务——或子树——这可能由于各种原因(如信息不足或目标过时)而失败。

装饰器

装饰器以蓝色标识。

图 7.8 – 应用到选择器的装饰器

Unreal Engine 包含一组预构建的装饰器,这些装饰器可以随时使用,但可以扩展以允许您创建自己的自定义装饰器。

这里是一个部分列表,列出了一些您将作为标准功能可用的任务:

  • 黑板:将检查在给定的黑板键上是否设置了值——或者没有设置值

  • 复合:通过使用ANDORNOT节点,可以创建比内置节点更高级的逻辑

  • 冷却:将锁定节点或分支的执行,直到经过预定义的时间

  • 路径存在:将检查两点之间是否存在路径

  • 循环:将无限期地循环节点或分支——或者如果设置了次数,则循环指定次数

大多数装饰器都包括一个逆条件属性,这将让您……反转条件,从而提供更多灵活性。例如,您可以在行为树中使用相同的装饰器,在相反的条件下执行不同的任务。

例如,您可以使用路径存在将 AI 代理移动到目标点,并在另一个路径存在实例上使用逆条件来寻找替代目标点。

总之,装饰器作为决策点,确定行为树中的特定动作或分支是否应该执行。

服务

服务可以附加到复合节点或任务节点上,并在其分支活动时以特定间隔运行——在间隔属性中定义。它们通常用于执行检查和更新黑板。

一旦由任务或组合触发,服务将保持执行,无论在所属节点下执行的父级-子级级别数量如何。

服务

服务以绿色标识。

图 7.9 – 应用到选择器的服务

服务对于您正在开发的行为树非常具体;这意味着,很可能会需要创建自己的自定义服务。然而,虚幻引擎提供了两个预先构建的服务,它们可以随时使用:

  • 默认焦点:这允许从 AI 控制器快速访问一个演员,而不是使用黑板键。

  • 运行 EQS:这可以用来定期执行 EQS – 更多内容请参阅第十一章理解环境查询系统 – 在指定的间隔。它还可以更新指定的黑板键。

在介绍了构成行为树的各种节点类型之后,现在是时候进入下一节,以便深入了解黑板资产。

理解黑板

在虚幻引擎中,黑板是行为树的关键组件;它充当一个内存空间 – 类似于大脑 – AI 代理可以在其决策过程中读取和写入数据。这意味着开发者将能够查询和更新其中存储的信息。

黑板作为黑板数据资产创建,将被分配给行为树,并包含一组变量 – 命名为键 – 存储预定义类型的特定信息。这些键可以在运行时访问和操作,以影响 AI 角色的决策。

图 7.10 – 黑板示例

键可以设置为实例同步;在这种情况下,键本身将在所有黑板实例之间同步。这种同步确保对键值的任何更改都将一致地反映在共享相同行为树和黑板的 AI 代理的所有实例中。

图 7.11 – 实例同步属性

黑板可以存储多达 255 个键,并支持以下数据类型:

  • FVector

  • FRotator

  • 布尔值

  • Int32

  • 浮点数

  • UClass

  • UObject

  • FName

  • UEnum

  • FString

注意

黑板不能存储数组。

BlackboardComponent实例将允许您从黑板查询数据并将数据存储在黑板本身中。创建系统遵循与BehaviorTreeComponent类似的模式,如本章前面所述。

尽管它表面上看起来很简单,但理解黑板的工作原理对于确保您的 AI 代理有效运行至关重要。

摘要

在本章中,我们介绍了行为树系统。从简要的理论概述开始,我们了解了行为树在虚幻引擎中的工作方式,并学习了构成整个系统的关键组件。最后,我们讨论了黑板资产,这是行为树有效运行的关键元素。

准备迎接下一章,我们将引导你重新投入行动,并为你制作一个专门为我们的虚拟角色构建的行为树。具体来说,你将创建自己的自定义服务和任务,以便为即将到来的 AI 代理提供一个合适的 AI 大脑。做好准备吧,因为事情即将变得有趣而狂野——有时甚至令人愉快地混乱!