Utility AI 一种基于权重的游戏AI

游戏的目的是带给玩家乐趣,值得玩家去玩的游戏应该是玩家可以获得乐趣的游戏,但是类似《黑暗之魂》这样的游戏,玩家如何从中获得乐趣?这其中就涉及到游戏的娱乐性,玩家可以从游玩过程中学习和利用知识,并以此解决游戏中的问题。比如:《超级马里奥》中玩家通过学习跳跃、躲避障碍物,最后通过某一关卡;Dota中玩家通过学习补兵、对线、走位等等获得金钱和经验,并以此击败了对手;《黑暗之魂》中玩家通过一次次死亡摸清了BOSS的行动规律,最终击杀了BOSS等等。对待新事物人们总是充满好奇,这种好奇心会不断促使人们探索,直到人们完全理解了这项新事物。对于游戏也是一样,玩家在游戏中的探索与学习是支撑玩家一直玩下去的动力。游戏的娱乐性体现在游戏的各个方面,这其中游戏AI是玩家在游玩过程中交互最多的系统,一个具有娱乐性的游戏AI应该是可以被玩家学习的。

无论是《吃豆人》、《魂斗罗》、《超级马里奥》这类敌人看不出任何智能的游戏;还是《Dota》、《使命召唤》、《黑暗之魂》这类敌人有一定智能的游戏。这其中或多或少都有AI的影子,虽然这些AI在行为上还是可以预测的,相较于真正的“人工智能”不值一提,但是两者要解决的问题显然并不相同,前者是为玩家服务,后者则是尽可能的模拟人类智能。

现如今游戏中的AI主要执行以下几件事情:

  • AI玩游戏:棋牌类游戏的AI,竞技类游戏AI,控制游戏中NPC的行为,甚至是创造一个Robot来和玩家来玩游戏等等。
  • AI生成游戏内容:地图关卡的自动生成,游戏场景剧情的自动生成、推演。
  • AI对玩家建模:对玩家游戏内行为建模。试图去理解游戏内玩家的行为,情感等信息,从而更好的对玩家进行用户画像,而这些信息也能够进一步的改善游戏的沉浸感。

一个无法被打败的游戏AI是毫无乐趣的,具有娱乐性的游戏AI是可以和玩家互动的,这种互动促使玩家从中学习如何在游戏中探索并解决游戏中出现的问题。如何设计出一个优秀的游戏AI?常见的方法有:状态机、行为树,另外还有一种不常见的游戏AI称为Utility AI,这个概念提出了很多年,Unity和UE4中都有相应插件支持,在许多3A级作品中都有应用。

状态机

状态机是一种常用的经典设计模式,常被用作管理事物的各种状态,最常用的是有限状态机(FSM),表示有限个状态。它定义了一些状态(State)以及在这些状态之间的转移(Transition)和动作(Action)等行为的数学模型。

状态机有三个特征:

  • 状态(State)总数是有限的。
  • 在任一时刻,只处于一种状态。
  • 在某种条件(Event)下,会从某种状态转移(Transition)到另一种状态,同时执行某个动作(Action)。

有限状态机维护了一张图,图的节点是一个个的状态,节点和节点的连线是状态间根据一定的规则做的状态转换。Unity中的Animator就是一个典型的状态机,用于控制各个动画之间的切换。

Unity中的Animator

对于简单的AI,有限状态机(FSM)就可以满足需求。通过定义一些简单状态,并定义在状态之间转换的条件,可以在决策中循环的调用。当没有条件通知FSM过度到另一状态时,FSM将持续执行其当前状态。通过指定条件,能够从任何状态转换为任何其他状态,这使得利用FSM设计AI行为非常容易。比如游戏中一个简单的敌人AI有以下几种状态:

  • 巡逻(没有发现目标时,在一定范围内来回巡逻)
  • 攻击(发现目标时,进入战斗状态并攻击目标)
  • 躲避(目标发起攻击时,躲避目标攻击)
  • 死亡(被目标击杀)

一个简单的FSM

但是,事实证明,这种设计也是FSM方法的缺点。在专业游戏中,FSM可以轻松拥有数百个状态,并且以这种规模,调试它们会变得越来越困难。为了缓解这些问题,于是将状态分类,将同类型的状态做为一个状态机,然后再做一个大的状态机,来维护这些子状态机。这就演变为分层结构,也就是分层有限状态机(HFSM)。比如敌人的巡逻状态中有:警戒、搜索等等;攻击状态有:普攻、技能、变身攻击等等;躲避状态有:翻滚、闪避、寻找掩体等等;死亡也有多个状态等等。

分层的FSM

当然真实情况可能比这个复杂许多,层次结构的想法扩展了管理许多状态的能力,但是并没有消除FSM随着大小和复杂性的增长而变得无法调试和管理的问题。最终,这种状态分层组织的想法导致了以树状结构(也称为行为树)代替组织任务的想法。

行为树

行为树是一种用于控制 AI 决策行为的、包含了层级节点的树状结构。树的最末端——叶子,就是这些 AI 实际执行的命令;连接叶子的树枝,就是各种类型的节点,这些节点决定了AI 如何从树的顶端根据不同的情况,沿着不同的路径来到叶子的这一过程。与HFSM相比,行为树在许多情况下提供了一种更易于理解和易于阅读的AI设计方式。而且,组织良好的行为树在实践中更容易调试。还是上面的简单敌人AI,如果使用行为树则如下:

行为树实现简单敌人AI

行为树的一个特点是它会一层一层地去对节点依次进行检查,而这每一层都需要花费一个 Tick 的时间,在每个Tick中,将评估整个树,如果选择了除上一次调用之外的其他行为,则可以更改执行状态,否则该行为将继续执行。以此方式,可以克服FSM的许多缺点,例如在某个状态中陷入死循环以及状态变化冲突的状态。对于非常大的行为树,遍历整个树的成本可能令人望而却步。因此,在传统行为树中引入了子树的概念。一方面子树可以用来复用已有的行为树,另一方面执行子树无需调用整个树,直到满足某些条件才能退出子树。但是,这又陷入了控制和调试有限状态机的状态转换之间相关复杂性问题。行为树的主要问题在于,即使该技术更好地组织了行为,它也没有提供改进决策的模型。决策被锁定在条件节点,而没有指定如何利用决策来调用不同的子树。

Utility AI

这个概念其实早在2010年的GDC上就已经提出过,与传统的行为树相比,Utility AI不再是一层一层遍历需要执行的任务,而是利用“权重”告诉AI需要执行的任务。在《杀戮地带2》、《极度恐慌》、《文明》、《光环2》等一系列3A游戏中都使用了此技术。相比于传统的行为树,Utility AI有以下优势:

  1. 设计简单:Utility AI通常可以用自然语言进行设计,这使AI程序员可以轻松地与游戏设计师对话。无需谈论一些神秘概念,例如条件,状态,序列和装饰器。相反,可以用“如果AI受到攻击,请优先寻找掩体”之类的术语来解释预期的AI行为。请注意如何使用模糊术语(例如“优先化”),这在人类对话中很自然。
  2. 易于扩展:规则-通常称为计分器,可以轻松添加到现有规则的顶部。与有限状态机相反,不需要破坏当前的结构。取而代之的是将计分器简单地添加到现有计分器之上,从而轻松扩展AI功能和保真度。
  3. 更高的质量:设计的简单性和可扩展的便捷性大大减少了错误并显着提高了生产效率。反过来,这为在给定的预算和时间框架内开发更复杂且行为良好的AI留出了更多空间,从而总体上提高了AI的质量。

Utility AI会根据当前所处环境对需要执行的任务进行评分,然后从中选取分数最高的一项任务执行。还是上面的简单敌人AI,以Utility AI的方式表述如下:

Utility AI实现简单敌人

整个Utility AI系统的简单框架如下所示,计分系统会根据当前环境状况对每个将要处理的任务进行评估,然后从中选取分数最高的一项任务。

Utility AI框架图

以这种方式实现的AI相较于常规方式更加灵活,也更加直观。当然以上只是一种简单描述,实际要构造出这样的AI系统是一项复杂的工程。也并不是所有游戏都适用Utility AI,对于绝大多数游戏,状态机或行为树就能很好满足需求。但是对于某些追求真实代入感的游戏Utility AI更加擅长创造出更复杂,更智能的AI,如:为AI添加情绪、模拟人类行为、战术推理、过程推演、群体行为、与上下文相关的动态规划等等这些高级特性。

参考文献:

  1. https://www.tomlooman.com/journey-into-utility-ai-ue4/
  2. https://www.gamasutra.com/blogs/JakobRasmussen/20160427/271188/Are_Behavior_Trees_a_Thing_of_the_Past.php
  3. http://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf
  4. https://www.gamasutra.com/view/feature/130663/gdc_2005_proceeding_handling_.php
  5. https://github.com/Jay2645/UnrealUtilityAI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值