刺客信条新手入门先玩奥德赛还是起源有几个世界

  • GDC Vault链接(链接为PPT,视频为付费可看,公司内部看的就不分享了,估计过一阵子就公开了):

最近在玩SIFU,其中的环境交互令人印象深刻,例如敌人AI会从地上捡起钢管来攻击玩家,或者踩墙飞踢玩家,或者用酒瓶投掷玩家。个人推测SIFU的敌人AI可能是用GOAP(Goal-Oriented Action Planning)来搭建的,因为AI和环境的交互具有明显的计划性,并且计划的步骤并不多。

在GDC2021里面,育碧参与了刺客信条奥德赛和渡神纪芬尼斯崛起项目的AI工程师,恰好就分享了项目是如何使用GOAP来搭建AI的。在分享中,演讲者梳理了GOAP是如何应用于刺客信条奥德赛的,以及在新项目渡神纪中GOAP又做了哪些针对性的迭代。整个分享呈现出了一个比较完整的开发脉络,对于了解育碧的工业化比较有帮助,甚至比GOAP本身更让人受到启发。

以下是这个演讲的详细内容。

(注:非精译,所有内容均为个人理解和再阐释)

  • 缘起:为什么要做这套AI系统
  • 效果:GOAP在刺客信条奥德赛和渡神纪中的表现

在分享开始之前主讲人特别提示:

开发过游戏就懂的,纸上谈兵没那么容易,对新系统抱有不切实际的幻想更是大可不必

缘起:为什么要开发新的AI架构

从刺客信条2开始,一直到刺客信条枭雄,所有的刺客信条AI都是使用的状态机,也就是FSM开发。尽管一直在优化,但是底层架构是没有变的。

刺客信条每代作品都在不断进化:刺客信条的世界变得更加丰富、有机和动态,世界内加入了船只、载具等单位,AI管理器(Meta AI)可以在大世界模拟AI的日常行为,游戏的任务系统也进行了革新。

与这些相比,AI的架构一直停滞不前,因此团队萌生了开发新的AI架构的想法。

(【注1】如果熟悉刺客信条系列就能明白,在枭雄之后,从起源开始,刺客信条开始RPG化和大世界化,起源是个明显的分水岭。这里分享者提到枭雄,是说在开发完枭雄之后,团队开始筹划搭建新的AI架构。从分享来看,GOAP首次应用于系列应该还是在奥德赛,因此起源可能还是用的FSM。)

(【注2】分享中提到的Meta AI,也就是大世界的AI管理器,应该是在刺客信条起源中开始应用的。关于这部分也有一个育碧的GDC分享,有兴趣的可以看看:

从技术目标上来看,团队希望新的AI架构能够实现从反应型AI向慎思型AI(也就是自己能思考的AI)的转变。

  • 反应型AI(Reactive AI):先接受刺激输入,然后执行对应行为
  • 慎思型AI(Deliberative AI):将环境和背景条件纳入决策考量,可以胜任复杂决策

之所以有这样的目标,是因为在旧的AI架构下,随着游戏复杂度增加,游戏设计师必须要耗费大量时间去处理AI的边际情况,而设计师不可能考虑到所有的边际情况,因此建立一套新的AI架构并让AI有一定的自我决策能力,可以使设计师的负担大大减轻。

开发新的AI架构的另一个技术目标是将大的系统分解为一些较小的、更容易编辑和维护的模块。

这里分享者提到的巨大的系统就是之前AI使用的状态机。开发到刺客信条枭雄这一代,游戏中有战斗(Fight)、搜索(Search)和调查(Investigation)三大状态机。设计师一旦想要添加或者修改某个行为,就必须处理这个行为对整个大的状态机带来的影响,这使得系统的维护变得困难了起来。

既然状态机本质上是一系列的行为和这些行为之间的过渡关系组成的,那么,完全可以将这些行为拆分出来,再通过一个胶水系统(Glue System)将不同的行为根据不同的条件以合理的顺序连接起来,从而取代复杂的状态机。而这个胶水系统,就是GOAP里的行为规划器(Planner)。

行为规划器与GOAP的简史

行为规划器是一个决策系统,这个系统会根据给出的行为目标,选择一系列可以完成目标的行为进行预演算模拟,从而筛选出在接下来一段时间内应该采取的最合适的行为序列。

要理解行为规划器,预演算模拟(Simulating)是个很重要的概念。行为规划器预先模拟了采取某种行为之后可能带来的后果,从而挑选出对AI而言在接下来几帧或者几秒钟之内最合适的行为序列,而非选择AI当下时间点最合适的单一行为。

用行为规划器来搭建的AI架构有几种,刺客信条奥德赛和渡神纪采用的是GOAP(Goal-Oriented Action Planning)。GOAP系统起源于斯坦福大学的STRIPS,并在2001年被应用于游戏F.E.A.R。此后,包括古墓丽影、变形金刚:赛博坦之战(Transformers War for Cybertron,2010)在内的游戏,都使用了此系统来构建AI。

(【注1】关于GOAP的前身STRIPS以及F.E.A.R如何应用GOAP构建AI的,可以参考知乎内另一位好心人的分享:

(【注2】育碧分享者提到变形金刚:赛博坦之战使用的是GOAP系统,这里额外补充一点,两年后也就是2012年发售的变形金刚:赛博坦陨落(Transformers Fall of Cybertron)使用了HTN系统来搭建AI。GameAIPro上有一篇关于HTN在这款游戏中详细运用的分享

个人水平有限,感觉GOAP和HTN其实挺类似的,从分享中看出的区别,除了HTN引入了层级概念之外,还有一点就是HTN是从行为出发模拟到最终目标实现,而奥德赛使用的GOAP,则是从目标出发,倒推可用的行为)

行为规划器的决策流程大致可以分为三大阶段:

  • 决策前置阶段(Pre-Planning):这阶段会用到包括世界状态(World State),决策目标(Goals),可用行动(Actions)三部分概念,这三部分实际上也是规划器工作的前提

其中中间黑色的方块代表的是规划器的决策算法部分,分享者指出这是一个由算法组成的黑盒。育碧当然知道里面是怎么运作的,不外乎各种条件算分,模拟出各种行为执行带来的后果。从整个系统外部看,系统根据决策前提,通过决策算法,直接输出一个结果用于决策执行。分享者指出,在刺客信条奥德赛和渡神纪中,这套系统只被用于NPC决策,实际上可以扩展到非NPC领域。

规划器的决策前提,第一点就是世界状态。世界状态并不是简单指的游戏的地图环境,而是指所有可用于决策规划的信息。在规划器需要进行决策的时候,就会像截图一样提取当前时刻的一系列游戏信息,这些可用于决策的信息存储在一个黑板中(如果使用过行为树应该就能理解黑板是什么东西)。这些信息根据需求可以包含很多种,例如NPC血量、目标,近期发生一些事件的标记,各种描述游戏状态的布尔值等等。规划器可以随时从黑板中读取世界状态,游戏中其他的组件单位和逻辑则可能改写黑板的数据。

决策目标指规划器想要通过规划来解决的问题,或者说是希望达成的某种世界状态(例如希望某个NPC在夜晚的时候把武器放到武器架子上然后去床上睡觉)。分享者提到,决策目标依据的条件(Condition)指的是存在黑板上的数据,而不是游戏中实时的数据。分享者这么说是因为规划器的决策是周期性的。例如,规划器有个目标是希望某个怪物在距离玩家3-5米的时候释放技能A,这里3-5米就属于条件,释放技能A是目标。如果规划器每过几秒钟tick一次,在某次tick的时候恰好满足了怪物距离玩家3-5米的条件,并记录在黑板上,那么就会让怪物开始释放技能A,哪怕在开始执行的时候玩家和怪物的距离已经不满足条件了。

另外,育碧在使用GOAP的时候给目标划分了优先级(Prioritized),这是因为针对一个目标规划器很可能无法找到可行的方案,因此游戏中每次会给规划器一个包含多个可选择目标的清单,这样在有多个目标都有可行方案的时候,通过优先级决定选择哪个目标来执行。这个优先级通过一个简单的整数形数据就可以定义。

可用行动是指规划器在决策过程中可以用于达成目标的行为。例如目标是到达A地,那么走路是一种可用行动,找到一个共享单车停放点、扫码、骑车是三种可用行动。

在育碧使用的这套GOAP系统中,可用行动包含以下要素:

  • 条件和后果:满足条件的时候,这个行动才可以被执行,而行动执行之后会带来一定的后果,后果影响后续的行动规划。
  • 行动成本:指执行此行动需要耗费的成本,这是一个设定值,用来定义行动的难易程度。成本包含基础成本(Base)和一些可变参数成本(Modifier)。例如策划设定一个行动的基本难度是5,另外一个可变成本与玩家和NPC之间的距离正相关,那么最终的行动成本就是基础成本加上计算的与玩家距离相关的可变成本之和。
  • 运行时行动列表:(【注】此处不太确定,没怎么听明白,随便看看)似乎是说每种行动实际上封装了一系列子行为用于执行,并且每种行动可以对应不止一种子行为。例如NPC的嘲讽是一种行动,而这个行动可能封装了好多种不同的嘲讽动画和场景交互用于实际执行的时候随机选择。

在这部分的最后分享者举了一个简单的例子来说明什么是一个完整的行动计划(Plan)。如下图:最终目标是对玩家造成伤害,而造成伤害就必须击中玩家,要击中玩家就需要使用剑挥砍的技能,而使用这个技能的前提是装备剑,为了装备剑,就需要把剑捡起来。

这个例子的重点是,形成计划的过程是从目标倒推向起始行动的,这种倒推的方式正是育碧使用的这套GOAP系统的核心。

这一部分讲的就是上面提到的决策算法,也就是决策中的黑盒部分。

在决策前提部分,规划器获得了一系列目标、可用行动以及世界状态。下图列出了规划算法的基本原理:蓝色代表可用行动,蓝色前面的三角形代表行动所需要满足的前置条件,后面的三角则代表行动带来的后果。绿色和绿色前面的三角分别代表目标和目标所需要满足的前置条件。

算法的核心原理就是找到一条行动线路,能够从行动出发,满足每一步的行动条件,最终达到一个可用的目标,并将这条可用的行动路线输出为最终的行动计划。

规划器的规划算法有两种:正向规划和逆向规划。育碧采用的实际上是逆向规划,但是分享者还是介绍了正向规划。

所谓正向规划就是从行动出发,遍历行动路线,找到能达成目标的解决方案。如下图:分享者举例,初始世界状态ABCFG默认都是False,蓝色的每个可用行动和绿色的目标要求的前提条件都是指定字母状态为True,蓝色的行动在执行之后都会把自己绑定的字母状态变为True(以下图的最上面蓝色行动C-Light Torch-B为例,意思是执行Light Torch行动要求状态C为True,并且在行动执行完之后,会让状态B变为True)。绿色目标右上角的圆圈数字则代表目标的优先级或者成本,可以任意理解,总之是用来决定在正向规划中首先尝试找到哪个目标的解决方案的。在下图的例子中,会优先尝试数字小的目标。

在图例的正向规划中,首先尝试为目标Hurt Target寻找解决方案,下图展示了这一过程:从没有前置条件需求的Goto Position行动出发,遍历所有可能的行动路线,发现没有满足的方案可以到达Hurt Target,因此将放弃此目标,开始寻找下一个目标的解决方案。

下图展示了寻找第二个目标Work的解决方案的过程:依然从最初可用的行动出发,最终找到了一个可用方案,于是将此方案输出用于执行,并不再寻找下一个目标的解决方案。

从上面的例子可以看出,正向规划在为第一个目标寻找解决方案的时候消耗了运算量,但最终结果是没有找到可用方案。针对这一个过程进行优化,于是有了逆向规划的算法。

逆向规划顾名思义就是从目标出发,倒推可以用的行动。这里分享者引入了两个小的概念:

  • 待满足条件(Open Condition):指要执行的行动/目标需要的前置条件
  • 已满足条件(Solved Condition):规划器找到可解决待满足条件的行动,就会将这个待满足条件调整为已满足条件

还是以下图为例,和正向规划类似,这里依然首先为目标Hurt Target寻找解决方案。此目标的前置条件是要求状态F为True,因此把状态F放入待满足条件。这时候发现没有任何行动能够在执行后满足此条件,因此将直接放弃此目标,寻找下一个目标的解决方案。

下一个目标是Work,此目标的前置条件是B为True,因此将B加入待满足条件。

规划器发现有Light Torch和Burn Object两个行动可以达成B,因此将B放入已满足条件,并进行下一步规划。

由于有两个行动路线,因此规划器会分别尝试两条路线,并为每条路线计算各自的待满足条件和已满足条件。尝试的顺序则由行动成本决定,会优先尝试行动成本低的,并输出总行动成本最低的路线。以下图为例:Burn Object的行动成本只有5,而Light Torch行动成本高达1500,因此规划器会优先尝试Burn Object。此行动需要的前置条件是C为True,因此将C加入待满足条件。

要满足C条件,寻找到的行动是Pickup Torch,而Pickup Torch需要的前置条件是A,因此规划器到这一步将C移入已满足条件,并将A加入待满足条件,如下图。

需要注意的是规划器在这一步会计算这一决策分支的总成本。目前Pickup Torch和Burn Object的总成本为10,依然小于1500,因此这个决策分支可以继续走下去。继续规划,发现Goto Position可以满足A,因此将A移入已满足条件。此时已经没有待满足条件了,这样就得到了一个可行方案。

这里分享者还提到,这个方案并不一定是最优方案,但是从CPU效率出发是可以接受的较好方案。我举一个例子:在上图中,假如Pickup Torch成本是1500,Light Torch的前置条件是X,在这种情况下,规划到Pickup Torch的时候会发现这条路线的成本已经超过1500了,那么是否要返回上一条路线呢?如果返回了,会发现上一条路线是死路,那还要再回来。因此,纯粹从效率出发,并不追求最优解,而是追求相对最优,那么只在有限步骤内按照行动成本排序,并找出可行路线即可停止运算了。在分享者的举例中,实际上应该只有第一步选择了行动成本最低的行动开始评估,直接一条路走到底,就不会再尝试其他方案了,哪怕其他方案总成本可能会更低。

最终下面的方案被输出为可执行方案。

GOAP在刺客信条奥德赛中的效果

在刺客信条奥德赛中引入GOAP,有其想要实现的技术尝试需求,也有游戏玩法侧想要实现的目标。最主要的玩法侧目标就是希望增加NPC和游戏世界环境的互动。在刺客信条前作中,尽管玩家和大世界的互动已经足够动态、有机和丰富,但是NPC和世界的互动是缺失的。分享者举了个最简单的例子,就是NPC应该可以抄起身边合适的家伙做武器来打玩家。在刺客信条枭雄中,由于做不到这点,NPC会在身边摆着一把剑的情况下赤手空拳来打玩家,因为NPC无法读到周边环境的信息,这无疑是可以改善的一个点。

为了实现NPC与环境的互动,刺客信条奥德赛引入了智能物件(Smart Object)。我们可以简单将其理解为蓝图或者Prefab,里面封装了可调用的接口信息以及NPC或者玩家与其交互的方式(例如用什么动作之类的)。在GOAP系统中,智能物件本身包含了可用行动,可以被决策器在决策中调用。刺客信条奥德赛中,智能物件包含的可用行动是在决策前置阶段被动态加入进规划器可用行动备选池的,只有周围可交互的智能物件包含的行动才会被加进去,这样可以避免规划器计算一些并没有智能物件可调用的行动。

分享者举了一些刺客信条奥德赛中的智能物件,包括:

  • 藏身草从:NPC可以用火把点燃,用来确定里面是否藏着玩家
  • 藏身点:在墙边、箱子、某些障碍物附近生成,NPC在搜寻玩家的时候可以走到这些点附近做一个探头的动作,显得搜寻更生动
  • 武器架:NPC可以在睡觉之前走到武器架附近把武器放在上面,在打架的时候会跑过去把武器拿起来
  • 某些可用作武器的生活用具:例如扫帚、铲子,这解决了之前提到的NPC不会利用周围工具而是赤手空拳和玩家战斗的尴尬问题(【注】同一套骨骼就是很方便,需要为不同工具制作的攻击动画数量完全可控,年货准时出货毫无问题

分享者随后展示了几段刺客信条奥德赛中智能物件用于GOAP的效果视频,我这里放几个截图。

在墙边生成藏身点,NPC搜查时候向藏身点探头看并发现玩家
市民武德充沛,抄起身边的铲子殴打玩家
营地士兵睡觉之前把武器放在武器架上(决定NPC睡觉的是Meta AI,参见前文分享链接)
进入战斗之后士兵会尝试去武器架上拿回自己的武器(当然如果规划器判断打拳更合适他们就会打拳)
搜寻中的士兵尝试点燃藏身草丛来暴露玩家位置

这是本分享中我最喜欢的部分之一,它展示了一个成熟的工业化游戏公司迭代自身开发能力的一个切片。

GOAP的开发改变了刺客信条奥德赛的AI了么?分享者指出:GOAP确实实现了NPC和环境的互动,但是整体效果而言,和前代作品相比,并没有太大差别。GOAP让AI的表现产生了一丢丢进步,但是当然也带来了系统本身产生的新问题。分享者强调,这次迭代实现了刺客信条系列作品在漫长的开发历史中的一次中途的技术路线切换,他认为是一次里程碑,为今后的开发迭代提供了可能性。

【注】这是很有意思的一部分分享,就我个人理解而言,游戏工业化于公司而言是类似漫长旅途的一样东西,在前进途中不断修正路线、完善工具、搭建中台、迭代技术。每一次技术迭代从最终结果来看可能效果只能和迭代之前勉强一样,甚至不如迭代前,但是这可能是推翻之前屎山并开始搭建新的屎山(是的还是屎山)的第一步。当然,工业化是属于公司的宏大叙事,开发者可能只会陪公司走过漫长旅途中的一小段。

分享者随后总结了GOAP在刺客信条奥德赛中实现的技术成果:

  • 短规划:每个规划只包含1-2个行动,方便决策。对于一些复杂的不适合拆分的行为,或者发生概率较低的行为,则不纳入GOAP系统来触发。
  • 有限的世界状态:世界状态是规划器决策依赖的前提,刺客信条奥德赛只提供了有限的世界状态,这是出于性能考虑,也使得GOAP决策的结果是有限的,有时候会出现错误的决策结果。但是由于玩家不仔细看根本察觉不出来,开发者决定对此不做调整。
  • 行为模块化:正如分享最初提到的,GOAP是为了解决复杂状态机难以维护的问题,实际上它也确实做到了。模块化行为对项目开发是极大的提升,不管是debug还是原形开发都更为方便了。这就是最重要的优化成果了。

GOAP最常被提及的缺点就是它不是实时反应的AI系统,也就是慢。在刺客信条奥德赛中,开发者根据项目需要对GOAP做了一系列针对性优化,以缓解GOAP决策滞后的问题,具体措施包括:

  • NPC状态与可用行动绑定:这里称为Context,实际意思就是NPC有自己的状态划分(可能是上一级的状态机之类的),每种状态下只有特定的可用行动会被加入规划池。例如NPC处于战斗状态,那么所有的攻击行动都可以在规划池中备选,但是如果NPC处于搜查状态,就不会把这些行动加入规划池,而只加入搜查状态可用行动。这相当于提前筛选了一次,减少了计算量。另外,如果NPC处于Idle之类的状态,完全被Meta AI控制,这时候规划器就完全不会工作。
  • 条件分类:规划器在工作时会首先去评估那些最不可能达成的条件(【注】这是规则匹配很常见的思路,另外越难达成也就意味着越精确,因此一旦达成了一般都是最优解,而越容易达成的,一般都是保底方案,反而应该最后去判断)。
  • 周期性规划:GOAP滞后的原因在于它的规划是周期性的,刺客信条奥德赛的GOAP会在一次Plan执行完之后开始下一次规划,同时也会每0.1s周期性规划一次,以尽量保证行动的时效性(【注】这里并没有提到Plan执行中如果周期性规划的结果和正在执行的Plan不一样该如何解决,是立刻打断开始新Plan,还是有一个优先级,只有高优先级行动会打断低优先级行动,个人猜测是后一种,优先级可能是根据状态、COST或者设计师人为规定来划分的)。

分享者总结,所有这些优化都是为了达成以下的目标:

  • 前置有效性检查:通过上面提到的优化项减少规划器在决策前置阶段需要评估的可选目标和行动数量
  • 生成行动依赖图:分享者并没有说明这个Graph的结构,仅说明其作用:在决策前置阶段,如果某些行动没被加入规划备选池,那么依赖这些行动造成的后果的行动也不会被加入规划备选池。这听起来非常合理,但是分享者特别提到,他们在刺客信条奥德赛中应用了这项优化,但是在后面的渡神纪中就把它取消了,因为这项优化反而让NPC失去了很多行为的可能性,并且这项优化并没有节省很多CPU(【注】单纯从优化思路看我完全想不到会有这样的缺点,我不理解但我大受震撼)。

GOAP在渡神纪中的效果

分享者接着谈起GOAP在渡神纪中的迭代优化。渡神纪是育碧的一款全新IP的作品,分享者提到,渡神纪与刺客信条系列不同,有以下几个特点:

  • 丰富、明艳、有趣的大世界地图
  • 自由探索、物理驱动的玩法
  • 与身形比主角巨大很多的敌人战斗的体验
  • 动态变化的世界/NPC等

(【注】渡神纪我之前云过部分流程和所有BOSS战,坦白讲就是一款很平庸的作品,物理法则、大世界外加NPR渲染,这些加起来怎么看都是一款模仿塞尔达荒野之息的作品。育碧做这么一款产品无非就是技术能力的试水,这就是工业化公司的一部分了,会搞一下看起来不会太成功的实验性项目,对公司而言是战略的必然,对团队成员而言就……算是一段四平八稳的经历吧。)

由于渡神纪这款游戏完全就是育碧试水新技术的产品,因此分享者将重点也放在GOAP在渡神纪这个项目中面临的挑战和优化方法上。

在渡神纪开发中,项目组针对GOAP有以下两个技术目标:

  • 扩展规划器的规划能力(准确性、针对性等)

在扩展规划器的规划能力方面,需要实现的目标包括:

  • 在规划的每一步重新估算行动的成本

行动成本在刺客信条奥德赛的GOAP系统中是固定的,奥德赛的GOAP中,规划器只会在决策前置阶段计算一次行动成本,之后的决策过程和决策分支中这个行动的成本将不会发生改变。而在每一步重新估算行动成本意味着规划器调用的世界状态将会更加精确,规划本身也将具有更多可能性。分享者提到,做这项优化主要针对的是成本与距离相关的一些行动。在奥德赛中,一项行动(例如去取一个物品)被纳入最终规划,基于的是规划时NPC与对象的距离,那么如果在前置的行动中NPC移动了,可能会导致随后的行动不合理(例如移动中NPC变得更加靠近另一个物品)。这个在大多数时候是不明显的,但是在渡神纪中他们还是做了针对性优化(【注】工业化的齿轮开始转动了)。

  • 根据怪物的体型做不同的规划(引入攻击范围参数)

与刺客信条奥德赛中写实的人类敌人不同,渡神纪中的怪物很多是体型庞大的神话生物,并且攻击手段也不再局限于写实的攻击,可能具有魔法、撼地、蓄力、跳跃等多种攻击手段。因此有必要为每个怪物设定不同的攻击范围参数(例如近战可打到的距离和高度之类的),这种设定靠策划直接配置可能相当麻烦,因此交给规划器是个不错的选择。

分享者在这里举了一个例子:在刺客信条奥德赛中,如果敌人想要近战攻击玩家,会首先通过寻路到达玩家的位置,然后进行攻击。但是在渡神纪中,如果不对GOAP进行优化,一个8米高的独眼巨人想要近战攻击玩家,但是玩家恰好处于一个寻路不可达的位置,那么独眼巨人将只会进行远程攻击(丢石头,这是GOAP的保底方案)。

下图就描绘了这样一种情况。在渡神纪中,导航网格是预先构建好的,图中红色部分斜坡就是导航网格缺失的位置(这个在游戏开发里很常见了,没设置好的话有时候一棵树枝都能导致导航网格缺失,而且也并没有100%设置好的导航网格)。设想在红色区域右侧有个8米高的独眼巨人要攻击左边的玩家,那么他不论是放远程技能,还是从A路线沿着上面有导航网格的地方绕过来近战攻击玩家,都是非常奇怪的,他明明可以走到B然后原地一巴掌呼死玩家。

所以针对敌人的体型不同,可以有不同的规划方案:对于人型的敌人,可以走A路线到玩家身边然后使用近战攻击;对于独眼巨人,可以走A路线到玩家身边使用攻击范围0.7米的践踏,也可以走到B直接使用攻击范围3米的回手掏(Backhand Swipe)。由于行动成本(Cost)和距离相关,而走到B更近,因此规划器会让独眼巨人选择走到B攻击的行为。

【注】这段分享其实只是说给技能规定了一个释放范围,有这个很正常,之前没有这个参数倒是让我感觉很奇怪,不知道之前刺客信条是怎么处理攻击距离这个问题的,难道只有贴身近战和远程射箭两种行为么

分享者提到,在把GOAP引入刺客信条奥德赛的时候,开发组必须面对这个IP系列留下的长期遗产,因为玩家对刺客信条怀有期待,他们希望在游戏中看到NPC的某些行为,这些行为可能贯穿了刺客信条系列的历史。而在渡神纪中开发组则没有这样的包袱,这意味着他们可以从底层开始构建一个相对干净的行为体系,对GOAP而言意味着更加纯粹的规划数据和更加合适的应用场景,而不必去面对历史遗留的复杂行为。

渡神纪想要实现的游戏玩法侧的另一个目标,是通过改进智能物件的使用,使渡神纪的世界表现出更高的自由度。渡神纪的世界引入了更多的互动和物理法则,GOAP通过智能物件规划NPC的行为,使得NPC与环境的互动更加频繁。例如,独眼巨人可以拔起身边的树,将树干丢向玩家,也可以抄起身边的巨石砸向玩家。

下面是分享者展示的独眼巨人与环境互动战斗的视频内容截图(每一步行动都是用GOAP规划的):

独眼巨人抄起身边树的树干
独眼巨人将树干丢向玩家
如果玩家距离较近,巨人可以用树干做挥击攻击

相比于刺客信条奥德赛,渡神纪针对GOAP开发了更完善的Debug工具,分享者在这里提到了两种工具:

规划管理器会输出每次规划评估的所有分支的Log,包括各种最终选择执行的规划,以及其他评估的规划分支,以及更详细的各个行动条件的满足情况以及成本等。分享者提到,这个工具要比断点好用,对于策划而言,策划很少用VS Code,断点操作并不习惯,用这个界面无疑会更友好,即使对程序员而言,提前输出所有需要的信息,也会让Debug相对于断点更加高效。

分享者展示的下面这张截图可以看到这个管理器工具的更多细节:包括用于规划的可用目标(Available Goals)、可用行动(Available Actions),以及事先被过滤掉的行动(Discarded Actions),包括这些行动是哪个条件不满足才被过滤掉的。

另一张截图则显示了规划器在为不同行动打分时候的Debug细节:在下图中可以看到,规划器已经决定了第一步行动是TriggerMeleeCoolDown,也就是等一个近战冷却时间,下一个行动有两个可选,分别是Stomp践踏和Swipe Left向左横扫。绿色的践踏行动被选择了,因为它的Cost更低(109.20低于142.39)。从分享者这张图中可以看出一些和行动Cost计算相关的参数。Base Cost应该是基础行动成本,是策划配置的。Time Since Last Excution是指此行动上次执行到现在的时间,推测是时间长度乘以一个负数的因子,从而达到距离上次时间越短扣分越少(相当于成本越高)的效果,减少行动连续被选择带来的重复感。最后一个Random应该是一个简单的随机值,用来防止得分一样的情况出现。

  • GOAP自动化统计模块

此工具是一个执行模式,可以记录下各种条件在GOAP规划中的情况(成功、失败、被选入最终规划)。(【注】这一部分大意是理解的,但是没理解Reordering是指什么,是自动化测试每次重排计划么……

这个工具应该是可以导入导出数据,Reordering部分不懂是什么意思,比较能理解的是最后一部分Usage Report,这里会记录哪些行动从来没有被选取过,从而方便开发者了解是不是某些条件过于严格,或者是行动本身不合理,或者是数据存在错误。这个数据资料无疑是很方便针对性优化的。分享者指出,最终他们会优化到没有任何一个行动是从未被选取过的。

分享者最后总结了通过两部作品搭建和迭代GOAP之后得出的经验要点。

开发者思维模式需要转变

和之前基于状态机的AI系统不同,开发者必须放弃一部分对AI系统的控制欲望,而应该提供更丰富的选择,至于决策则交给GOAP。从复杂状态机中解脱出来之后,去编写更多更丰富的NPC行为其实应该是更容易的。

另一个开发者需要转变的思维模式是,GOAP做决策是需要时间的,因此必须承认它的慢,而不应该在某个行为之后希望AI立刻开始某个特定行为。如果真的需要一些即时反应的行为,也不必一定在GOAP中实现。要尊重GOAP本身的应用场景,不要求大求全。

要为规划器提供足够多的选择

对于GOAP而言,选择越多,它的表现也就会越好。GOAP的能力在于通过合理决策将不同的行动联系起来,这其实能够带来一种涌现式的体验,增加一种行动选项可能会增加许多的行为组合。如下图,如果能够让更多的行动选项相互联系,就能创造出多样的行为组合。

要为规划器提供决策依据

对于GOAP而言,每个行动选项应该是有各自不同的意义的。如果有两个行动适用完全一样的条件,或者开发者想要的只是简单随机,那么GOAP系统就会丧失其价值。能权衡利弊的决策才是合理的决策。

分享者这里举了渡神纪开发中的例子,可以配合上面Debug部分参数看:可能有的时候某个敌人的最优决策永远是使用一个挥砍技能,但是开发者希望敌人的行为具有多样性,因此最开始开发者引入了随机参数,通过随机的成本(Random Cost)来改变一个行动的总成本,但是这样有时候还是得不到合理的结果,因为只是一个简单的随机。因此最终他们在渡神纪中引入了一个参数Time Since Last Excution,作为计算额外行动成本的一个因子,这样一个行动不被执行的时间越久其行动成本就变得越低。这不但解决了NPC行动多样性的问题,也顺便形成了某种技能循环。

不要刻意追求计划的行动长度

分享者提到他们的GOAP计划的长度只有1-2个具体的行动。分享者指出,越长的计划越容易在执行中途因为条件改变而失败,因而并没有什么意义。能够执行长计划并不应该成为评价AI决策体系是否强大的指标。短的计划花费的时间更短,反应也更加灵活。

【注】根据我个人的知识积累,HTN似乎比GOAP能支持更长步骤的行动规划,具体可以参看本文我提到的有关HTN的链接。另外GDC2021实际上有一个分享是关于ART HTN的,全称是Advanced Real Time HTN,分享者来自日本的SE,分享中他们演示的视频看起来是一个机甲射击游戏,声称他们让HTN能够更好地工作,支持更长的行动步骤,但是由于分享者的日式英语让我完全听不懂他在说什么,因此我准备忽略他们所谓的优化了。

设定合理的颗粒度非常重要

这里的颗粒度包含世界状态、目标、行动,以及分享者单独补充的行动成本(Cost)。

分享者举例说,你在为规划器设置目标(Goal)的时候,是把杀死玩家作为一个目标,还是对玩家造成伤害作为一个目标。如果你的目标太精细,以至于目标只用一步行动并且只有一个行动可以完成,那么相当于没有选择决策的余地。但是如果目标太大,包含太多可用行动,决策很困难且费时,也是不合适的(【注】说人话,就是把大象装冰箱是个合理的目标,把冰箱门打开就不是,只能算是一个具体行动)。

同样的例子也适用于世界状态。例如检查与玩家之间的距离,如果具体到厘米,当然是可以的,但是相应就要处理这个维度的复杂性,如果只需要与玩家是近距离,就不存在这种问题。规划器需要用来决策的世界状态应该是必要的有限的状态,不应该过于细致导致决策复杂化。

对行动成本的描述也是如此。随着可选行动的增加,策划预设的成本参数可能无法保持一贯的合理性(【注】我理解这里的意思是,如果最初成本只设置了1-5这5个整数的等级,可能是不够的的,因为太粗糙,决策不精确,但是如果最初设置某些行动的成本是类似1385021这种的精细度,那么在与另一个成本1385022的行动比较的时候,应该反思一下这两个行动的相对成本值得这种细分么,它们和另一个成本为10的行动,成本差距是值这个数量级的么)。

不要吝惜在工具开发上的投入

这一块其实没啥好讲的,Debug工具有多重要,懂的都懂。

分享者最后分析了GOAP在什么项目中适合被使用。

如果想要NPC对特定输入进行特定反应,那么可能GOAP并不适合,因为决策需要时间。状态机和行为树在这点需求上比GOAP更合适。

如果项目中包含了各种互动和涌现式体验,那么GOAP是一个不错的选择。

还是回到开头的引子,我最近因为玩SIFU才又想起这个分享。目前我已经20岁稳定出夜店了,但是这个游戏中敌人和场景的各种互动还是让我惊叹。

我推测SIFU的AI行为大致框架:

  • 在出招决策上,使用了GOAP来决定采用什么招数,因为看起来确实非常合适,例如蹬墙踢,捡瓶子,捡棍子,这些行动所需的步骤最多就两步,使用GOAP也不至于反应缓慢(其实SIFU的AI行为中间待机的时间还算挺久的)。
  • 可能有群体AI控制器,例如使用类似战神的Token框架,获得Token才会出招攻击,但是不同于战神希望玩家连得爽,即使怪物受击也不会交还攻击Token,SIFU可能敌人受击了就直接交还Token了,所以每次刚打一个敌人出受击,旁边另一个敌人就打过来了。
  • 某些行为,例如反击格挡、完美闪避、韧性击破这些,应该是没走GOAP,因为这些是需要快速即时反应的行为。

最后,育碧这位大佬的分享挺不错的,最好的部分在于告诉观众,工业化的一次系统迭代,最好的结果就是能达到和不迭代之前一样的效果,但是这却是摆脱一座屎山,开始搭建另一座屎山的美好开始。工业化是渐变积累和精细化,不是神启和大跃进。

上海佰美半导体科技有限公司

上海佰美半导体科技有限公司是一家集代理、分销、直销的电子器件供应商。主要代理英飞凌、优派克、西门康,艾赛斯、富士、三社、美国IR等公司生产的IGBT、IPM、可控硅、整流桥、二极管等,欢迎点击咨询报价! 点击进入详情页

本回答由上海佰美半导体科技有限公司提供

我要回帖

更多关于 新手入门先玩奥德赛还是起源 的文章

 

随机推荐