以目标为导向的行动计划构建F.E.A.R.的人工智能

2020-05-07 22:48:35

视频游戏行业一直在努力为非玩家角色(NPC)找到可访问和实用的方法,以便快速有效地做出智能决策。这导致了一系列创新,从帮助角色在3D环境中移动的导航网格,到游戏中的有限状态机,比如角色行为的半条命(Half Life For Character Behavior)。自2000年中期以来,由Halo2推广的行为树可以说是AAA视频游戏行业中最常用的技术。但在这篇文章中,我们将看看同时获得流行的另一种技术。让我们来看看目标导向的行动计划和推广它的游戏:第一次遭遇攻击侦察。

要理解以目标为导向的行动计划--以及它在F.E.A.R和其他许多游戏中是如何使用的--我们需要看看它的理论来源:一种被称为自动计划的现有人工智能技术。自动化或人工智能规划是一个过程,通过这个过程,系统试图找出一系列行动,以实现设计者设定的遥远目标:这被称为计划。要做到这一点,我们用某种语言或编码对问题进行建模,这些语言或编码告诉我们关于当时世界的所有信息都是真实的。这些称为事实或谓词。一个简单的事实告诉我们一些我们以后可能需要知道的事情。我们存储了我们拥有的所有谓词,这些谓词都是关于世界在所谓的状态内的任何时间点的样子。

例如,考虑一扇关闭的门,我们将其标记为“Door1”。我可能希望非玩家角色打开Door1,所以我需要在谓词中知道它是打开的还是关闭的。因此,我们当前的世界状态是一扇关闭的大门。现在,有了这些信息,我可以构建一个允许我打开它的操作。

现在,每个动作通常分为三个部分:动作中涉及的对象(在本例中是一扇门),动作前提条件-意味着在我可以应用动作之前,世界上的哪些事实必须为真-以及效果-它们表示由于完成动作、向世界状态添加新信息或删除不再为真的现有事实,世界将如何变化。比方说,我想让我的非玩家角色打开Door1,一些有效的开门动作的前提条件是门是关着的,并且NPC与门站在同一个房间里。一旦操作完成,效果就是门现在打开了。现在假设我们想从A房间走到B房间,但是他们之间的门是关着的。我们需要确保在我们的规划模型中解释门将房间A和B彼此连接,并且如果有一扇紧闭的门,您不能在房间之间走动。在这一点上,系统将创建一个计划,即打开门,然后从A房间走到B房间。将世界状态更改为全国人大现在在B房间的位置。

简而言之,这就是计划的全部内容:弄清楚要做什么,按什么顺序做。这种编码问题并允许计划系统解决问题的过程就是为什么几十年来它一直是一个活跃和发展中的研究领域。虽然F.E.A.R在2005年帮助将规划带到了游戏中,但早在20世纪70年代,规划就已经被用于各种现实世界的物流问题。这包括机器人技术-从较小的家用设备到月球和火星漫游者之类的设备,对风力涡轮机、发电站和制造等大型机械系统的控制,以及搜救行动、军事规划和救灾等复杂空间问题。

但这隐藏了一些更令人讨厌的细节。这些规划编码依赖于我们能够将我们正在解决的问题抽象为简单的东西,供规划者解决。回到开门的问题,我说全国人大需要在A房间,Door1连接这两个房间。这在计划模型中工作得很好,但是模型和现实生活中的工作方式之间有很多不同之处。例如,A房间通向B房间的门在哪里?人大需要朝着什么方向走向大门?事实上,在规划模型中,如果全国人大是在门相连的房间里,他们就可以打开门。这意味着这个小家伙现在显然是心灵感应的,可以从很远的地方用他们的思想打开大门?而不是更现实的解释,那就是NPC不仅需要在RoomA里,而且需要站在Door1旁边才能打开它。因此,虽然计划对于解决在给定情况下要做什么这一更大的问题很重要,但在世界上执行行动计划-无论是在现实世界中还是在视频游戏之类的模拟中-要困难得多。

现在我们已经了解了什么是计划以及它是如何工作的,让我们来看看面向目标的行动P

正如Orkin 2006年在麻省理工学院媒体实验室攻读博士学位时在游戏开发者大会上发表的文章中详细描述的那样,GOAP系统是由有限状态机驱动的。有限状态机是这样一个系统,在这个系统中,人工智能存在于一种行为状态中,然后根据发生的事件转换到另一种状态。然而,在Half Life中采用的FSM,在代码库中存在80多个独特的状态。尽管该状态是否可用由状态机控制的字符类型来确定。然而,在GOAP中,有限状态机只有三种状态:

与所谓的智能对象互动:世界上人工智能角色可以与之互动的物品。

现在你可能会有点困惑,但这一切都是基于对非玩家角色AI是如何工作的一个非常聪明的观察。如果你认为游戏中的敌人是敌人,他们所做的一切就是在某些情况下播放动画。当动画在正确的时间在正确的位置播放时,它就显得聪明,而当几个聪明的动画在一个序列中播放时,它就显得聪明。因此,这三个状态中的每一个最终都在播放动画。

后藤:正在播放运动动画(无论是行走、跑步、跳跃、跳水还是攀登),但它也在朝一个特定的位置前进。

动画:就是简单地播放一个动画,这可以是承认玩家的存在,来射击他们的武器或者任何简单的闲置动画,这让NPC更有特色。

最后使用智能对象:这是一种情况,比如让NPC按下开关,或者打开门,或者坐在椅子上,或者打翻桌子。在每种情况下,动画都直接与对象捆绑在一起,而且经常在游戏中-比如我在关于BioShock Infinition的AI的一集中找到的-对象会告诉角色的动画系统它需要做什么。

因此,不是将每个可能的行为都枚举为单独的状态,而是在一个小得多、高度数据驱动的实现中执行整个事情,而不是更加扎实的状态机。它将执行传递到系统中的特定移动动作和动画,如果以正确的顺序执行几个移动、动画和使用智能对象状态,我们将获得一些智能外观行为。

但是它如何知道处于什么状态,以什么顺序,以及向每个状态传递什么信息呢?这就是GOAP的计划部分发挥作用的地方。使用我们前面讨论过的计划编码,系统创建解决计划编码中的特定问题的计划,并使用A*搜索来查找解决问题时要采取的最佳行动。然后,生成的计划中的动作被转换为特定的FSM状态,其中传递的数据包括要移动的位置、要播放的动画和要与之交互的智能对象。

为了更好地理解这在实践中是如何工作的,让我们揭开恐惧的面罩,探索GOAP是如何在游戏中被采用的。

因此,让我们更深入地看看GOAP是如何应用于恐惧的。游戏C++代码库的部分内容已经公开发布了好几年。首先是Monolith发布了最初的恐惧SDK,然后是恐惧公共工具,因为建模人员一直在支持它。只需很少的努力,您就可以在Visual Studio中将其打开并通读AI源代码。因此,让我们来看看GOAP是如何在代码库中应用的,对于那些想亲自尝试的人,我在描述中留下了链接,供您查看。

每个恐惧中的人工智能角色如果拥有任何类型的人工智能,都需要有指定的目标。这些目标是规划者将在动作空间中运行搜索,以便为该角色找到要执行的动作计划的目标。这适用于游戏中所有活跃的非玩家角色,从士兵和刺客到游戏结束时的噩梦幽灵,甚至是在地面上四处奔跑的老鼠,这是一个非常重要的问题,我会马上回来讨论。这意味着其他角色,如金善权和扬科夫斯基,甚至阿尔玛本人都是由设计师编写的。

没有目标,AI角色实际上什么也做不了。他们需要被赋予要实现的目标,然后规划系统将致力于解决这些目标。游戏文件中仅编码了不到70个进球。在每种情况下,这些目标都可以被初始化、更新和终止,更关键的是,这些目标具有允许它们在游戏中的该时间点计算其总体优先级的功能。例如,如果一个士兵被分配了巡逻和杀死敌人的目标,但它不知道玩家在附近,那么杀死敌人的优先级将为0,而巡逻的优先级要高得多,因为有一个巡逻节点已经分配给了该角色。然而,如果它知道附近有一名球员,巡逻队的球门优先级要低得多,因为它认识到该球员现在对它构成了威胁。

现在,为了让策划者解决这个目标,角色将拥有一个可供其搜索的动作集合。游戏中有120个动作,从简单的动画到不同的攻击变体,移动到不同的位置,使用智能对象节点,重新装填武器或只是闲置。它们都有自己对应的C++类。这些操作是在代码中设置的,但并非所有NPC都有权访问所有操作。设计者使用单独的数据库编辑器为每种敌人类型分配特定的动作,允许他们定制每个角色在解决他们的目标时的多才多艺。

有了分配给给定角色的目标,它将等待机会访问规划器,并找到解决其当前情况的方法。这就是我早些时候暗示的更大的问题浮出水面的地方。系统需要找到这个特定角色可以执行的动作,在状态空间中搜索可能的动作,找到达到目标的计划,但所有这些都需要在执行期间根据游戏重新验证。这是因为在计划期间或在执行计划时可能会发生一些事情,而这些事情可能会破坏计划。回到前面的My Door示例,如果您正在生成打开门并在房间之间移动的计划,但在计划过程中或在执行该计划时,门被其他人或某事打开,则计划将无效。

这是绝大多数计划系统面临的问题,因为它们本质上是相当存在主义的,并假设只有规划者才能改变世界。所以它不能容纳其他角色作为计划的一部分在世界上做事情。恐惧中的敌人人工智能都不知道彼此的存在,而合作行为只是两个人工智能角色被赋予的目标,它们很好地排列在一起,在执行时创造出看起来像是协调一致的行为。他们不仅不能走到世界上其他角色所站的导航点,而且对那个角色的存在一无所知。因此,如果另一个角色做了会破坏提议的计划的事情,那么每个角色都需要能够认识到这一点,这样它就会停止正在做的事情,并要求另一个计划。或者在必要时改变目标。

这可以通过三种不同的方式来处理:首先,一旦制定了计划,系统将运行快速验证检查,该检查将获取世界状态的副本,在该副本上执行计划,并确保它将按预期实现目标,并且每个行动的前提条件和效果都按预期工作。其次,每个目标都可以覆盖ReplanRequired函数,该函数不断检查是否应该放弃当前计划并从计划器检索替换计划。一次很好的考试

但是,如果该操作将按预期工作,则该操作在代码库中被“激活”。当发生这种情况时,它会告诉有限状态机要转换到这三个状态中的哪一个状态。并传递完成状态执行所需的所有数据。例如,假设一名士兵需要重新装弹,然后它转换到动画状态,并传递所需的特定动画参数,以便角色重新装弹。

一旦人工智能角色成功地完成了他们设计的计划。然后,它将被分配一个新的,并可以重新计划。通过管理计划成功和失败的时间,这有助于保持游戏的节奏,确保人工智能总是知道该做什么,而不是无所事事地站在那里等着被慢动作击中脸部。事实上,恐惧中的计划长度通常相当短,通常是1-2个动作,只有少数几个达到3或4个动作的长度。考虑到游戏的整体节奏,这在很大程度上是有意义的。

这就是说,这个目标管理和计划过程确实产生了一个问题,即使是Monolith的开发人员也多年来都不知道这个问题。正如Eric[Jacopin,2014]教授在2014年的一篇研究论文中详细描述的那样,他在论文中分析了GOAP策划者在恐惧中的表现,结果发现,由于老鼠的存在,这种持续的重新规划过程在游戏的某些层面上产生了很小的性能开销。正如我提到的,恐惧中的老鼠使用与士兵和其他战斗人工智能相同的系统。通常情况下,他们的计划非常简单,搬到世界上的另一个地方,如果他们在附近,最好远离玩家。老鼠重新计划的需要没有考虑玩家是否在附近。因此,你可以在关卡的开始几秒钟内遇到几只老鼠,20分钟后,当你在地图的另一边时,它们仍然在四处奔跑,计划新的行动。

这远远不是对代码库的详尽概述,我确实鼓励任何能够使用C++的人通读一下代码,这对于游戏开发人员来说是非常有洞察力和价值的。

恐惧对目标导向行动计划的使用至今仍被认为是现代视频游戏中一些最令人兴奋和有趣的敌人对手。虽然现在距离游戏发布已经将近15年了,但GOAP仍然在视频游戏行业产生着持久的影响。虽然远不是一个详尽的清单,但也有许多非常受欢迎的或邪教经典采用了这种方法或类似的方法。

其中包括“被谴责的犯罪起源”、“S.T.A.L.K.E.R.:切尔诺贝利的影子”、“正义的原因2”、“Deus Ex Human Revine 2”、“古墓丽影”2013年的重启,以及Monolith最近推出的“中土:魔多的影子”和“战争的影子”。还有其他几集“人工智能与游戏”探索了它的应用,例如第14集的“变形金刚:为塞伯坦而战”,以及第22集的“帝国与拿破仑:全面战争”中的大幅修改的混合方法。在电子游戏中,规划仍然是一种流行的技术--尽管可以说并不像行为树那样普遍。但随着时间的推移,GOAP及其条带式方法现在不那么频繁地被采用,更多的当代游戏采用了另一种被称为分层任务网络(Hierarchical Task Network)或HTN计划的计划技术,这种技术已经在Killzone 2、Max Payne 3和Dying Light等游戏中使用。我将在未来的片段中专门介绍HTN的规划,但我已经在第14集的“变形金刚:塞贝特龙的倒下”和第37集的“地平线零点黎明”的视频中介绍了这种规划方法的实施。

但就目前而言,我希望这能帮助每个人更好地理解为什么人们继续称赞恐惧的人工智能,以及正在采用的底层技术。我在下面列出了一些关于GOAP的其他有用资源,供您查看。