如何使用行为树去创造游戏中boss的AI

发表于2015-11-30
评论5 3k浏览

作者:Cody Olivier

在本文中,我将谈论我们的boss是如何决定发动怎样的攻击,我是如何想出我们现在所使用的方法,以及为何我会选择该方法。让我们先说说《FireFight》的背景。这是一款自上而下的2D行动射击游戏,在这里玩家需要击败一波又一波的敌人。同时玩家也拥有一个同伴将通过发出叫声(就像雷达那样),在艰难的情况下提供保护盾牌去帮助你,并协助你攻击其他敌人。关于boss行为的整体感觉是受到早前/复古行动游戏以及《塞尔达》系列游戏的启发。这便是我们想要呈现的内容:攻击将以一种可预测的频率发生,并且每次攻击的发生都有特定的标准(如玩家的健康状况或敌人与玩家的距离),在决定攻击时,如果两个攻击都满足标准,那便存在一些随机性。

游戏中的所有AI都使用了行为树(你们可以从这篇文章中获得更多了解:http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php)。行为树真的很棒,从视觉上看它很容易辨别与创造,并且也具有强大的灵活性。而根据行为的复杂性,行为树也可以变得非常巨大。

在为第一个boss设计AI时,我和团队成员讨论了该boss将发动怎样的攻击与何时发动攻击。我们决定了三个主要攻击,并且其中一个攻击拥有一个较弱的变体。这便是行为树的基础,如下所示:

grassbosssm(from gamecareerguide)

grassbosssm(from gamecareerguide)

这看起来还不错。行为树的左半部分将决定攻击类型,而右半部分则是围绕着地图的移动。攻击分支同时也包含了一个定时器装饰节点,如此便能有效间隔成功的攻击。这样的设置非常合理。不过有一个主要的缺陷便是如果我想要调整一个特定攻击的条件,我便必须改变管理该攻击的子树的结构。除此之外,如果我想要测试一次攻击,除了将我自己置于具体条件下去触发攻击外,我将很难避免其它攻击的发生。不过从整体看来它还是运行得很好。

当我开始执行下个bossAI时,问题便出现了。尽管遵循了一个类似的AI风格(游戏注:根据不同条件间隔性地发动攻击),但是攻击次数和风格却是不同的,因此我们只能复制一半的行为树,而剩下的一半将是不同的。我觉得比起考虑保留同样的风格,这样的内容需要投入更多精力。我不仅需要编写一个全新的攻击分支,同时我还要在最初分支完成后调试逻辑,而这是一项较困难的工作(在不改变行为树的前提下测试特定攻击并不简单)。如果不存在一个明显的解决方法,我便会在表格中记下每次攻击的距离条件,如下图:

waterboss(from gamecareerguide)

waterboss(from gamecareerguide)

为了让内容更加复杂,Heal拥有一些不是基于距离的其它条件。

首先我想到了能够评估每次攻击标准的执行,并确保每次攻击能够满足它们的标准,然后随机选择攻击。这不仅能够保留随机性,同时还能修改攻击标准,从而确保只能选择一种攻击。这能够帮助我轻松且分开调试每一次攻击。如果说这里所存在一个缺陷的话便是我需要在每一次攻击时检查所有的标准(如果攻击计时器结束了而boss又还未选择攻击的话)并且我也需要保存任何可能的攻击选择(这并不是什么大事,但我还是需要考虑这点)。

这一执行最终变得非常简单,并伴随着行为树上的一个随机选择器节点。该节点将筛选可能的攻击,并观察每个检查是否满足标准,并以此做出选择。因为这一系统,我从不需要确保一个包含所有可能攻击的列表,我只需要在满足攻击标准时检查它便可。最糟糕的情况是,所有攻击都未能满足标准,所以将执行所有攻击(但这也比之前提到的一帧一帧执行它们好多了)。以下是带有全新系统的行为树攻击选择图表:

waterboss(from gamecareerguide)

waterboss(from gamecareerguide)

这看起来更简单,更灵活且更容易浏览了。而唯一添加的复杂性,也就是人类在理解这棵行为树时需要清楚的是,选择行动分支上的每片叶子都拥有如下形式:

如果攻击未能满足条件

回到失败

执行攻击

回到成功

我这么做只是为了保持行为树足够简单,就像在行为树上执行这些行动能够取代树上的每片叶子一样:

waterboss(from gamecareerguide)

waterboss(from gamecareerguide)

这不仅能让调试/测试特定攻击变得更轻松,同时这也能够容纳更多新加入的攻击。这一整体结构并不是只针对于一个boss,也就是说我还可以将其用于其它boss上。我仍然需要决定何时以及如何执行攻击,而这也是我不得不做的事。

尽管行为树拥有许多灵活性,但我敢保证这绝对不是我们能够想出的唯一解决方法。

 

转自:游戏邦

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引