对面会更惨编译

一、简介

《四海兄弟3》,又名《黑手党3》是一款越南战争时代背景的第三人称动作冒险游戏。主角Lincoln Clay是一名孤儿和退伍军人,他正在致力于从意大利暴民手中夺回新波尔多市(基于1968年新奥尔良的虚构城市)。但是这篇文章并不是关于Lincoln的,而是这座城市中与他战斗的各种敌人。

开放世界提供了许多内容,包含了随处可见的玩家互动与遭遇战。而Lincoln是个狡猾的人,他可以安全地与歹徒进行交涉,也可能更直接地直接参与交火,甚至与警察展开亡命追逐。这些事件在新波尔多的各个地点系统化的发生,而这让设计师们获得了足够的设计自由。

整个系统化功能由众多部件构成,这些部件让玩家感觉到了黑帮的致命性或警察无所畏惧的正义。这篇文章将介绍组成《四海兄弟3》AI的最重要的系统,例如:感知、位置选择、掩护。当项目采用行为树作为主要决策结构时,正是这些支持系统提供了让行为树做出明智决策的基本信息。

二、敌人设计

当玩家进入《四海兄弟3》的世界时,他们会发现自己身处于细节丰富且具有时代准确性的城市。播放器中可以听到60年代的美妙音乐,女士们穿着礼服或修身的裤子,脚着低跟鞋,挎着矩形小包走在街上;男士们穿着西服或者穿着衬衫配上领带……所有这些都是为了给玩家带来1968年新奥尔良风格的沉浸式体验而设计。在这样的“现实”环境中,敌人也必须令人信服,他们要有和正常人一样的样貌、举止。

真实的敌人意味着真实的感知、能力和特征。他们的生命是脆弱的,当人类敌人的头部被射中时,他应当立即死亡。

我们从一开始就知道,创建此类敌人需要大量的迭代,这需要灵活的、数据驱动的系统。数据驱动的方法通过诸如游戏中配置重新加载之类的技术,在迭代中极大减少了游戏工程的编译时间。

我们决定将敌人的设计分解成多个模块,让数据易于传递并提升整个系统的可维护性。每个NPC都有一个原型,可以提供相关NPC的外观和行为数据,但更重要的是原型包含了NPC可以使用的策略。策略包含了决策树和评分功能,例如位置选择、目标选择、掩护行为等等。

2.1原型

原型是对NPC类型的一种表述,包含诸如可使用的决策列表、感官、声音配置、武器、对玩家行为的范围、动画等等数据。每种原型可以具有多种变体并支持继承配置数据。继承的内容是原型变体的基本配置,这种基本配置将在每种变体中覆盖某些(或全部)成员。

游戏中的“保镖”就是这种原型的一个例子。在基本配置中,他们可以投掷燃烧弹,但在另一种形式下,他们则只投掷手榴弹。

2.2策略

策略定义了NPC在战斗中的行为方式。策略本身分为以下几个基本部分:

这些模块中的每一个都具有单独的数据文件,这些数据文件在独立的文件夹中,策略功能会引用这些文件。由此,诸如目标选择这样的数据文件可以用于多种策略。而运动风格、掩护动作、开放空间行为和重新加载行为被定义为决策树。稍后我们会详细说明位置选择和目标选择在系统的评分功能中的意义。

三、AI系统

通过行为树将整个AI系统连接在一起

3.1感知

没有理智的NPC是难以想象的。平民、警察和歹徒在决定行动时,都必须能够看到、听到玩家的输入。我们期望看到的是平民恐惧逃离、警察试图消除对公共安全构成威胁的东西,而黑帮则会保护自己的领地。

3.1.1视线

《四海兄弟3》中的“视线”系统用于检测并触发一些可视的AI事件。游戏中的每个NPC头部都具有视觉传感器,可以检测一定范围内的任何视线事件,像玩家不断发出可被敌人察觉到的“玩家”事件。同时该系统不仅仅用于检测玩家的行为,例如,它通过一场战斗的两个参与者发出的“近战”事件来检测正在进行的近战战斗;又如NPC检测到尸体、平民看到玩家手中的武器会做出相应反应等等。

类似于其他一些第三人称动作游戏,《四海兄弟3》的视觉引擎的核心是采用锥形检测和射线检测玩家身上的多个固定点位,就像《汤姆克兰西细胞分裂黑名单》中一样。

我们所采用的这五个监测点位,可以是数据驱动的,也可以对应到特定的骨骼点。一般情况下,它们会对应到头部、肘部和膝盖。但对于特殊情况,设计人员会为一些动画手动定义这些点。例如,当玩家位于掩体时,使用预先定义的监测点位置来代替默认的动画骨骼位置会更好,这在战斗中提供了更精确的检测。下图中展示的是设计师定义的处于掩体状态时启用的检测点。

监测点更接近胸部和碰撞盒,这对于玩家来说更有利

当敌人检测到玩家时,他们不会立即攻击。AI以该事件为启动信号,逐渐意识到自己的视野范围内存在某种东西,这一过程需要一定时间,而识别速度受到许多因素的影响,对于《四海兄弟3》来说我们采用了以下参数:

每种参数所造成的影响在配置文件中呈现为分段函数,而完全识别所需要的时间由下述公式决定:

3.1.2听觉

敌人有时需要对他们看不到的事情做出反应,为此,任何对AI来说至关重要的声音都将记录在听觉引擎中并传播给对应范围的NPC。在《四海兄弟3》中,AI的听觉引擎完全独立于音频引擎。任何NPC在系统中都将被注册为一个听觉检测器,当游戏发出任何与AI有关的声音时,我们会通知事件范围内的所有检测器。不同声音的传播距离是不同的,对于某些事件,例如射击,我们会立即做出反应,并将对应的NPC转换为战斗模式;而对于另一些声音,例如脚步声,我们仅仅在短时间内收到一定数量的事件时做出反应。

3.1.3意识

识别过程结束后,NPC可能处于下图所示的5个状态中的任意一个。这些状态与敌人的行为有关,大多数情况下NPC会经过这些所有的状态,但也有一些例外情况。

AI使用状态机在不同的识别状态中进行转换

这些状态中的每一个都可以拥有不同的视觉或听觉功能参数。例如,一个未被激活的敌人相对于战斗中的敌人来说更难发现玩家。

3.2隐秘行动

玩家在隐秘行动上具有多种不同的选择。

通常情况下,当玩家蹲下并缓慢移动时,他会进入潜行状态并更难被敌人察觉。在蹲伏动画中,玩家的视觉监测点会下移,并且在缓慢移动时不会发出任何脚步声。最重要的是,在玩家处于掩体背后时,AI对其的识别速度会更加缓慢。

在开发《四海兄弟3》的初期,只要玩家蹲下来,AI的识别速度就会变慢,但在后来的迭代中这条规则被删除了,因为它的“感觉”完全不对:蹲在街道中间的人比站立的人更难被发现,这显然是不符合直觉的。另一方面,视觉监测点位的变化对于玩家的潜行已经足够了。

同时,为了给玩家提供更多躲避敌人的机会,游戏提供了多个分散敌人注意力的方法:

3.3掩体系统

下图显示了围绕静态障碍物生成的掩体位置,包括了可以提供的保护范围及相邻掩体的连接关系,为了图片的简洁,我们省略了相邻掩体的位置信息。

在障碍物附近生成的掩体

当动态对象暂时处于静态时(如汽车、板条箱或垃圾箱),它们周围也会生成有效的AI掩体位置。而一旦它们进行移动或者被破坏,对应的掩体位置就会消失,这时AI将不会选择它们作为掩体。由于动态对象有可能移动到游戏中的任何位置,因此我们需要一个系统来保证无论在任何位置,动态对象相关的掩体位置都是有效的。

当静态或动态对象周围的掩体位置被其他动态对象占用时,我们需要禁用其被占用的部分。如果剔除后剩余的部分太小没办法作为独立的掩体位置,则将其附加到相邻的掩体位置中(如果存在)。

而当动态对象停止移动时,与其相关的掩体位置将被添加到AI的选择范围内。单单获取动态对象的位置是不够的,我们还必须判断地面的高度。例如,当汽车停在人行道旁时,其相关的掩体位置将对应汽车的高度,但由于汽车在人行道旁,所以部分掩体位置将位于人行道上,这两者之间会存在高度差。如果我们没有检测地面的高度,当AI使用该位置的掩体时,他们的头有可能从车顶上露出来。

新的动态掩体被添加到游戏世界中时,系统会将其与附近的静态掩体位置连接,这些位置会成为相邻的掩体区域。AI和玩家角色可以在不暴露自己的情况下利用这些掩体连接规则在其中间移动。如下方图片所示,一辆汽车停在了一个静态障碍物旁,静态掩体位置为了适应这一变动会进行缩小,而另一静态掩体位置会被直接禁用,其相邻的位置会进行拉伸以填充剩余的空间。此时汽车周围的动态掩体位置将被启用,所有掩体位置联结在了一起,玩家和NPC可以在两个障碍物间无缝移动。

被汽车引擎盖遮挡住的掩体位置被禁用,周围的掩体位置进行拉伸

在进行掩体位置调整时,我们采用一系列的形状转换来构成连接区域。通过创建一个新的区域使相邻的两个障碍物之间形成连接区域,让角色自由地在其中移动。

在两个相邻掩体间插入无障碍区域

3.4位置选择

让AI角色寻找最佳站位是一个较难解决的问题。当战斗突然发生时,看起来最明智的选择是在原地展开反击或是马上躲到最近的障碍物后。接着,我们需要再更广泛的范围内寻找某些更好的位置。在这方面,位置评估功能是一项常用的技术,它可以从数据列表中选择出最可能的位置。

位置评估功能通过一种算法计算每个可能位置的得分,最终AI选择的位置要么是得分最高的,要么是从得分最高的位置中随机选择一个。这种技术在现代动作游戏中非常常见。

我们使用这种评分技术进行位置选择、目标选择和搜索位置选择。输入的数据是候选项的位置或目标,以及需要进行评分的内容列表。每种评分功能都会获取一些游戏内容,并将它们转化成对应的分数。例如,到当前位置的距离、玩家的弹道、是否需要免疫玩家伤害等等。输出数据则是所有候选项中的最高分,其中得分通过下列公式进行计算:

我们使用这种方式是因为我们期望总分是可以为0的,这在某些方面为我们提供了便利。当然,加权平均、均值平均、全部求和等都是我们认为可以加入评分功能的选项。

3.4.1搜索范围

在广阔的游戏世界中,AI需要知道哪里是最先要进行搜索的,即便整个搜索过程可能是分段进行的,但搜索整张地图依然需要花费令人不可能接受的时长。通常情况下,我们规定了3种搜索范围限制:敌人周围一定范围、玩家周围一定范围和AI自身一定范围。搜索范围限制的选择由当前策略决定,采取“支援”战术的AI将在自身周围进行搜索,采取“突击”战术的敌人将在目标周围进行搜索……如下图所示:

AI通过对有效位置的评分选择出最佳的搜索位置,从而正面进攻或包抄敌人

《四海兄弟3》使用Havok物理引擎,在导航网格构建时围绕静态和动态障碍物生成掩体位置,并在战斗中自动生成候选位置。实现这些功能有很多方式,对我们来说,在导航网格上生成位置同时通过相近路径来限制搜索范围是最方便的。

3.4.2评分功能

在《四海兄弟3》中,评分功能所用的函数是一种基于输入值的分段线性函数,其所需输入值的复杂程度根据不同的评分内容而不同,像评估位置这一类的就属于简单一些的,而计算到达某个NPC的路径或进行一系列射线检测就是比较复杂的。另一方面,即便通常来说需要搜索的空间都是有限的,但任然可能会有数百个候选位置。例如在DLC“Sign of the times”之中,我们的一个AI原型需要检测玩家周围的120个位置;而在游戏中非常常见的保镖原型,会检测自身15米范围内的所有掩体位置和120个开放空间位置;而另一些复杂情况可能会产生超过300个候选位置。

我们当然希望减少那些性能消耗较高的检测,因此在某些位置的评估过程中,我们会在计算的中途的某个时刻比较分数,并选出目前为止的高分,然后仅仅对高分位置进行高消耗性检测(如射线检测和路径搜索)。我们在AI的策略配置中定义这些阈值和被允许进入下一检测阶段的候选位置数。在上文中提到的保镖例子中,实际上我们仅选取50个候选位置进行射线检测,而只有20个候选位置会进行完整的路径搜索。

然而,这种将部分低分在前期过滤的算法可能会导致一些最终分数非常高的候选位置因前期计算的分值较低而被舍弃。除非我们对所有候选位置都使用全部的检测手段,否则我们无法从根本上避免这种问题。实际上,我们通过优化评分功能中不同检测手段的参与顺序和每一阶段后保留下来的候选位置数量最大程度的减少了这类问题的发生。

在游戏的开发过程中,我们还有另一套机制,该机制不会将分数低的候选位置过滤掉,而只是将其标记为“待删除”,并留在整个检测流程中。最终结果是所有候选位置都将经过全部的检测评分阶段,以此得到最佳位置的列表。如果最佳位置列表中的位置有“待删除”标签,日志中会留下记录,随后设计师或工程师会查明这种情况发生的原因。

3.4.3处理游戏中的动态变化

在实时游戏中,世界的状态一直在变化,而游戏中的角色应该立即对这种变化做出反馈,而不是具有延迟。当NPC选择了一个可以向玩家射击时的位置,它需要先移动至该位置,但在这过程中,玩家可能已经去了别的地方。

最简单的解决办法是在NPC向目标位置进行移动的过程中继续对候选位置的评分检测,并给已经选择的位置一些分数加成,当然,这是一个高消耗性的解决方案,因此我们基本不会使用它。另一种解决方案是仅仅对已经选定的位置进行评分检测,如果其分数下降太多,就放弃该位置。最重要的是我们需要对此使用一组不同的评分功能:下方表格中展示了我们在最开始搜索位置时使用的一组评分函数和在所选位置不断进行更新时使用的函数。可以看出,一旦NPC选择了一个位置并开始向其移动,那么路径和距离就变得无关紧要了。

完全搜索和所选位置更新时的评分功能差异

通过这种方式,我们可以确保当前选择的位置仍然有效的同时,尽可能少的搜索其他位置。一些NPC每12秒才会进行一次候选位置的检测,但每秒会更新5次当前选择位置的得分。

这种系统在实现上比较简单,但确定一个有效的评分算法并不断地对其进行优化是非常困难的。我们在《四海兄弟3》的开发过程中发现了一些小技巧:

当已选择位置的评分在NPC移动过程中突然大幅下降时(通常为50%)它会被丢弃,此时NPC会停止,同时行为树也将切换为开放空间中的默认行为。值得注意的是,如果此时NPC无法切换为默认行为模式,就很可能会做出错误的决策,从而破坏沉浸感。例如,NPC可能在没有任何威胁时突然进入掩体寻求保护。我们还尝试了另一种选项:NPC仍然移动至低评分位置,但同时会快速找到新的有效位置,但这种行为模式看起来很不稳定。显然,开放空间中的默认行为——停下来并开始射击,让AI显得更加直觉。

3.5目标选择

我们知道了AI是如何选择移动的位置的了,现在我们还需要知道他们如何决定向谁射击,或者谁应该成为他们的主要目标。如上文所述,位置的选择是通过评分算法来确定的,目标选择使用相同的系统来计算每个潜在目标的得分并由此选择最佳目标。它们的区别在于使用的评分函数不同。

AI将获得所有潜在目标列表,其中包含其他NPC、玩家和虚拟目标(NPC对于玩家可能来袭的方向)。在脚本化场景中,我们可以将门窗设置为潜在虚拟目标,以向敌人暗示玩家的期望位置。这些信息将与评分功能列表一起输入选择系统中,最终,系统将输出评分最高的目标。这整个过程会比位置选择要快得多,因为需要评估的候选目标相对较少,并且需要进行的检测项目也更少一些。

3.6射击与瞄准

创建一个使用射线检测并在几秒钟内杀死玩家的AI是一项非常容易的工作,AI只需要对准玩家头部并射击就可以了;真正困难的是让AI以直觉且正确的方式,且具有一定随机性的命中。

行为树本身并不能决定何时击中或者打偏,它只决定何时开始射击以及该向谁射击,实际的射击逻辑是在代码中完成的。这是因为行为树的更新频率太低了,而游戏代码每帧都会进行更新。行为树为射击代码提供了目标和其他需要验证的功能功能的列表,当游戏射击代码执行之前,行为树会验证一些功能选项,如果其中任意一个值返回false,则NPC无法在此帧中进行射击。最常用的功能选项是:

四、综合决策

上诉所有这些AI系统都能很好完成相应的工作,但彼此间是各自独立的。因此我们需要有一个综合系统将它们全部整合在一起,并最终形成一个“人类”NPC。这就是决策发挥作用的地方,在我们的游戏中,决策是由行为树实现的。

行为树可以从位置和目标选择中得出有效信息。让我们假设一个场景:一个NPC在汽车内,他需要在车边寻找掩护从而更好地保护玩家。行为树会开始一个序列,将NPC从汽车中移出,移动至新的位置同时进入掩体。

NPC在掩体内的行为也可以通过行为树来确定,但我们使用了决策树大大简化了行为树:不同的策略不需要新的行为树或分支。行为树运行决策树,并将结果用于其中;由于其将做什么与如何做分开了,因此也简化了调试和设计的难度。添加一个新的策略或更改原有的策略不会影响到行为树本身,下图中显示了机枪手原型模板在其“攻击”策略中所使用的决策树。

现在,假设我们的NPC已经进入了掩体,并藏在了它背后。如果此时NPC的战术是“准备”,那么此时他就不会给玩家施加压力。在这个过程中,NPC会执行的两个动作是保持隐蔽和探出头来寻找。我们运行决策树,如果结果是继续隐藏,那么行为树就会在此循环播放隐蔽动画;接着我们再运行一次决策树,这次的结果可能就是寻找玩家了,因为已经有一段时间没有这样做了。

对于开放空间来说,我们也使用了类似的方法。我们使用决策树来选择NPC应该去做的事情,然后让行为树执行必要的动作序列。它们的区别仅仅在于,在开放空间中,我们会采取一系列的操作,敌人也可以移动到掩体的另一侧来躲避玩家的子弹。

五、结论

无论我们使用哪种系统进行AI决策,输入至系统的相关信息越多,它所能做出的决策就越好,这就是支撑系统如此重要的原因。优秀的做法是让各个系统彼此独立,并严格让它们扮演自己的角色。遵循这些原则让我们受益匪浅,特别是在游戏快要发布这种时间非常宝贵的时刻——我们可以轻易的调试或变动系统。

在开发《四海兄弟3》的过程中,“麻烦”的数据驱动系统证明了它们的价值,设计师拥有了更大的创作自由,可以在不依靠工程师技术支持的情况下试验敌人的各种战斗行为。

另一方面,增加数据的继承性也同样中央。最终的游戏中有18种AI基本原型和它们的120种变化形态。这会定义很多变量,如果继承性不好就完全无法维护了。实际上,我们的大多数变化只需要覆盖其中的几个值。最后,游戏中的有几个系统是代码直接写死的,但我非常希望在今后的项目中它们也能成为通过数据驱动的系统。

参考文献

Michele Colledanchise, Petter Ögren. 2018. Behavior Trees in Robotics and Al: An Introduction. Boca Raton, FL: CRC Press

Jason Gregory. 2014. Game Engine Architecture. Boca Raton, FL: CRC Press

Mike Lewis, Dave Mark. 2015. Building a Better Centaur: AI at Massive Scale. GDC 2015.

Mike Lewis. 2017. Guide to Effective Auto-Generated Spatial Queries. 《Game AI Pro3: Collected Wisdom of Game AI Professionals》, ed. S. Rabin, 309-325. Boca Raton, FL: A K Peters/CRC Press

Mike Lewis. 2018. Winding Road Ahead: Designing Utility AI with Curvature. GDC 2018.

Sergio Ocio Barriales, Kate Johnson. 2018. Triage on the Front Line: Improving 'Mafia III' AI in a Live Product. GDC 2018.

Chris Simpson. 2014. Behavior trees for AI: How they work. Gamasutra.

Robin J. S. Sloan. 2015. Virtual Character Design for Games and Interactive Media. Boca Raton, FL: A K Peters/CRC Press

Remco Straatman, William van der Sterren, and Arjen Beij. 2005. Killzone’s AI: Dynamic Procedural Combat Tactics. GDC 2005.

Martin Walsh. 2015. Modeling Perception and Awareness in Tom Clancy’s Splinter Cell Blacklist. 《Game AI Pro2: Collected Wisdom of Game AI Professionals》, ed. S. Rabin, 313-326. Boca Raton, FL: A K Peters/CRC Press

原文地址:

https://www.gamasutra.com/blogs/JiriHolba/20200518/363119/Openworld_Enemy_AI_in_Mafia_III.php

https://zhuanlan.zhihu.com/p/144048967