规划我们的旅程
最后更新于
现在是时候开始规划我们的旅程了,然后再进入下一章。
技术术语
由于对于你们中的一些人来说,这是你们第一次踏入人工智能领域,因此了解本书(以及人工智能领域)中常用的一些技术术语是很重要的。在过去的几页中,我们已经接触过一些术语:
代理是能够自主推理以解决特定目标集的系统。
反向推理是通过向后追踪问题的原因来进行的过程。
黑板是一种用于在不同代理之间交换数据,有时甚至在代理本身内部(尤其是在虚幻引擎中)交换数据的架构。
环境是代理生活的世界。例如,游戏世界是同一个游戏中的非玩家角色(NPC)的环境。另一个例子是棋盘,它代表了与人类(或其他系统)下棋的系统的环境。
前向链式推理,与反向链式推理相对,是解决问题的过程,从前往后寻找解决方案。
启发式是一种实用的解决问题的方法,它不保证最优,也不足以满足当前目标。当找到一个问题的最优解决方案不切实际(如果不是不可能)时,会使用启发式方法来找到满意的解决方案。它们可以被视为在决策过程中减轻认知负担的心理捷径。有时,它可以代表一个代理人的知识,基于他/她的过去经验(尽管这通常是先验的)。“启发式”一词源自古希腊语,意为“发现”或“找到”。
自底向上方法
通常,在构建或研究系统时,主要有两种方法:自上而下和自底向上。前者从系统的高级结构开始,逐渐深入到系统的细微细节。后者从基础开始,逐步创建依赖于前者的更复杂结构。这两种方法都是有效的,但根据个人偏好,我选择了自底向上的方法来介绍这本书的主题。
实际上,我们将从代理人的移动方式开始,然后理解它如何感知,最后使用这些数据来做出明智的决策,甚至制定计划。这在这本书的结构及其各部分中都有所体现。
代理模式
由于在本书中,我们将探讨AI代理如何感知、移动、计划和与其周围环境互动的各个部分,因此绘制一个代理模式的图表将会有所帮助。当然,可能会有许多其他模式,它们都是同样有效的,但我相信这个模式对于开始学习AI游戏开发尤其有用。
由于我们选择了自底向上的方法,我们应该从底部阅读模式。我们将更正式地将其称为代理模型。
首先,我们可以看到代理总是与游戏世界交换信息,包括几何、物理和动画,但也包括它的抽象概念。这些信息在我们的代理模型的所有层次上都被使用。
从底层来看,我们可以看到我们的首要关注点是如何在环境中移动。这个过程可以分为运动和寻路(第3章,导航)。往上,我们可以看到代理感知世界(第4章,环境查询系统,和第5章,代理意识),并基于这种感知,代理可以做出决策(第2章,行为树和黑板)。有时,在某一时刻做出最佳决策,可能并不能在长期内带来更好的结果,因此代理应该能够提前规划。通常,在电子游戏中,一个AI系统(并不一定是NPC)可以控制多个角色,因此,它应该能够协调一组角色。最后,代理可能需要与其他代理合作。当然,我们无法在这本书中深入探讨每个主题,但请随时在线查看,以便您可以深入研究某些主题。
最后一点:通常,游戏中的AI并不会同时使用所有这些层次;有些只实现其中一个,或者将它们混合在一起。然而,在开始使用它们之前,了解它们的结构是很重要的。
Unreal Engine AI框架
尽管其他游戏引擎只提供渲染能力,但Unreal Engine附带了许多已经实现的功能(并通过插件扩展)。这并不意味着制作游戏更容易,而是意味着我们有更多工具来开发游戏。
事实上,Unreal实现了许多人工智能工具。在我们探索它们时,我们可以创建这些工具及其相互关系的图表。所以,让我们试着理解我们将在哪个层次上操作。这意味着要初步了解Unreal游戏玩法框架(您可以在这里找到更多信息:https://docs.unrealengine.com/en-us/Gameplay/Framework)。
有一个控制器类,可以分成两个子类。第一个是玩家控制器;顾名思义,它提供了游戏和玩家之间的接口(当然,这本书不涉及这个,因为我们将专注于AI而不是一般的游戏玩法)。第二个类是AIController,它提供了我们的AI算法和游戏本身的接口。
以下图表展示了它们如何相互交互:
控制器(Controller)与玩家控制器(Player Controller)之间存在虚线连接,表示拥有关系。AI控制器(AI Controller)与AI系统(AI Systems)之间通过箭头连接,表示交互和运行关系。AI控制器与木偶(Pawn)之间也存在拥有关系。木偶可以由两种类型的控制器拥有:对于玩家来说,这可能是主要角色;而对于AI控制器来说,木偶可以被视为虚拟角色,AI控制器的敌人,试图击败玩家。
在这本书中,我们将只关注AI控制器,以及围绕它并帮助其赋予生命的所有工具(这里不会涵盖前面图表中的虚线部分)。我们会在后面的阶段理解我所说的内容,但关键概念是我们要在AI控制器的层次上操作。
以下是我们旅程的概述:
现在我们已经了解了我们将要使用的架构的大致概念,让我们来分解一下我们将要在本书中覆盖的内容。订单或多或少是根据我们将要面对的主题进行排序的(我说或多或少,是因为有些主题在超过一个章节中分布,并且在我们扩展了对AI的知识后需要重复迭代)。
然而,你可以将这本书分为三个部分:
第2-7章:介绍了不同的内置AI系统
第8-10章:如何在前几章探讨的AI系统中使用的一个具体例子(因为我认为这部分与了解系统本身同样重要)
第11-13章:游戏AI的不同调试方法描述(因为我认为这部分与了解系统本身同样重要)
让我们详细谈谈这本书的内容。
使用行为树进行决策(第2、6、8、9和10章)
一旦代理能够感知周围的世界,它就需要开始做出决定,这些决定会产生后果。一些决策过程可能会变得如此复杂,以至于代理需要制定一个适当的计划来成功实现目标。
内置于Unreal Engine的AI框架围绕行为树展开,这在本书中占据了很大一部分。当然,这并不排除在Unreal中自行实现其他AI系统进行决策的可能性,但是,通过选择行为树,你将有一组强大的工具可以使用,我们将在本书中详细介绍这些工具。
导航(第3和第7章)
除非游戏是离散或回合制的,否则每个AI代理都需要在其环境中以连续的方式移动。Unreal提供了一个强大的导航系统,让你的AI代理能够在环境中轻松导航,从掉落、跳跃、蹲伏到游泳,到不同的区域和不同类型的代理。
这个系统非常庞大,很难全部涵盖,但我们将尽最大努力在第三章“导航”中涵盖你需要的一切。
环境查询系统(第4和第12章)
环境查询系统(ESQ)可以从代理周围的环境中收集信息,从而使代理能够据此做出决策。这本书专门用一整章来介绍这个系统。实际上,它位于第5章“代理意识”和决策之间,是Unreal中已经内置的一个很好的资源。
智能体意识(第5章和第12章)
智能体意识(或感知)涉及赋予AI智能体感官的能力。具体来说,我们将涵盖视觉,这是最常见和最广泛使用的,但也将涵盖听觉和嗅觉。
此外,我们将开始探索这些数据将如何在更高级别的结构中使用,以便智能体能够相应地行动。
人群(第7章)
当你的地图中有许多AI智能体时,环境很容易变得过于拥挤,各种智能体可能会相互干扰。人群系统允许你控制大量的AI智能体(同时它们可以保持个体行为),使它们能够避免相互干扰。
设计行为树(第8章、第9章和第10章)
对于AI开发者来说,知道行为树是如何工作的还不够:他/她需要知道如何设计它们。实际上,你的大部分工作就是创建一个抽象系统来协调所有的AI智能体,只有在这之后,你才会花剩余的时间来实现它。因此,我们将涵盖一个大的设计示例,介绍如何从头开始设计、创建单个部分并构建一个完整的行为树。
游戏AI的调试方法(第11章、第12章和第13章)
一旦你了解了所有不同的AI系统,你可以开始试验这些系统或编程游戏,但如何判断你的AI是否按照你的计划执行和/或表现良好呢?调试方法在任何软件中都至关重要,但在游戏AI中,你还需要视觉调试。因此,Unreal Engine提供了许多调试方法(包括一些专门为AI设计的),我坚信了解这些方法非常重要。你将不仅学习这些工具,还将学习如何根据你的需求扩展它们。
超越(第14章)
这本书的最后一部分将探讨目前在AI领域正在进行的令人兴奋的想法和创新,并将激发你继续这段精彩的旅程。我将介绍一些正在应用于游戏的AI正在进行的研究,以及这最终如何使你的游戏受益。了解新技术和算法在这个领域至关重要,以便你总是与时俱进。
为C++用户启用AI
如果你作为C++用户阅读这本书,当你在项目中编写C++代码(或项目的特定模块或插件)时,你需要确保添加正确的依赖项,以便你可以访问AI系统,否则你将遇到编译错误。我们将在下一章中更详细地查看这一点,届时我们将创建一个项目,插入我们在本书中产生的所有代码。然而,这是在.cs项目文件中插入/修改代码的代码行(粗体部分是AI工作所需的):