查看: 1422|回复: 1
收起左侧

[已翻译] 行动列表:一种简单、灵活、可扩展的AI框架

[复制链接]

[已翻译] 行动列表:一种简单、灵活、可扩展的AI框架[复制链接]

胖啊 发表于 2018-4-10 14:41:08 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  1 浏览:  1422

翻译:崔国军(飞扬971)  审校:天道


人们总是喜欢用自己熟悉的方法来解决问题。我们总是倾向去选择我们已经知道的办法来做事情,而不会选择最优的办法。因为总是带着这种想法,所以我们使用的技术很可能是过时的,并且会出现很难被现在的同事所理解或者效率很低的情况。所以这篇文章以及之后的文章的目的在于向大家介绍一些视野更宽阔的方法以便大家在编程的时候能给大家带来更多的帮助和选择。今天我要提及的方法是行动列表!
行动列表是一种简单却强大的AI框架,所有的游戏开发者都应该了解这种方法。虽然扩展性没有庞大的人工智能网络那么好,但是它支持相对复杂的突发行为并且容易实现。无论你是刚刚接触人工智能编程的新手还是一位正在扩展编程工具箱的资深开发者,本文都将向您详细介绍行动列表以及提供一些具体的例子来帮助你实现你自己的解决方案。让我们开始吧!
很久以前
几年前我开始 做King Randall’s Party的开发,这是一款玩家建造城堡并且与计划摧毁城堡的King战斗从而保卫城堡的游戏。我需要创建一个相当聪明的人工智能,能够瞄准玩家城堡并计划如何去摧毁它以达到自己的目的。这对我来说是个巨大的挑战,大到无法一次考虑周全。所以就像其他优秀程序员那样,我把这个任务分解成一个更加容易管理的问题集。第一个挑战是我需要单位拥有一组特定的行为,这样可以根据这些行为来决定自己的动作。
一个简单的网络搜索就让我的思维爆炸。搜索“游戏AI“会出现关于行动计划、优先状态机、群体行为、向导等种种方法。我根本不知道从哪开始,所以我做了一个任何理性的人都会做的事情。我去询问我家的狗。当然这并没有什么奇怪的。不管什么时候当我遇到一个技术问题,我总是去问我家的狗。我知道你这时候可能会想”Jesse,这太愚蠢了,你一定是疯了。。。狗怎么会懂计算机呢?“好吧,让我们先搁置这个问题。也许这里包含了某种非法的科技或者是大学课堂正在研究的内容。
但是无论如何我还是这么做了,我跟狗说到” Frankie ,AI有太多的方法来实现了,我根本不知道该如何开始。我该如何给我的游戏单位创建一个AI框架?“Frankie的表情让我觉得自己就是个愚蠢的傻瓜,尽管我的高中老师Francis先生已经告诉我不要提任何愚蠢的问题。但我很确信Frankie的想法和Francis先生的不同。“Jesse“,她问我,” 通常你是如何开始你的一天的?“
哦,我会写下这一天我要做的每一件事情然后根据任务的重要性以及需要完成的时间对任务进行优先级排序。我把这个解释给Frankie听,她回应说”恩,这就是一个行动列表“。她告诉我一个行动列表就是任务或者行为的一个列表,游戏单位每次在里面选择执行一个。这是一种有限状态机,并且可以被描述为只有一个分支等级的行为树。下面是根据我的狗描述的行动列表工作原理。
行动列表是如何工作的
首先,你要写下你需要你的AI具备的所有行为:
然后你根据优先级对它们排序,从低到高:
现在我们需要对这个列表进行遍历来检查每个行动是否能够执行,如果某个行动可以执行,那就执行这个动作。然后我们将检查行动的阻碍属性,如果它会阻碍之后的行动,我们便会退出对列表的遍历。在后面的内容里我们便会清楚为什么阻碍属性如此重要了。
在我们这个例子中,我们的第一个行动“攻击玩家”只有在AI离玩家很近的时候执行。让我们假设AI并未靠近玩家,所以它将检查是否能在以及是否应该在当前位置上创造一个梯子,它会一直检查后面的行动直至它找到一个能够执行的行动,假如这个行动是打破门。然后它将执行破门的代码。
阻碍属性便是在这里开始发挥作用的。如果破门这个动作马上执行,它便不会阻碍任何之后的行动,而之后列表的内容便可以继续执行。但通常情况下都不会出现这种情况—-行动总是需要一帧以上的时间。所以在这种情况下破门行动将调用unit.Attack(door),它会将单位的当前状态从等待变为破门,直到破门之后才会返回真。
一个简单的有限状态机
好吧,这听起来是可行的。Frankie提供了一个很好的建议,行动列表似乎很适合我的项目。但因为之前我从未听说过它们,所以我对此还是充满疑问—-我了解的大多数关于AI的内容都是使用基于跳转的有限状态机,类似于Unity3D在Mechanim对动画所做的事情。你将定义一系列状态并指出它们何时以及如何彼此跳转。Frankie向我解释说如果要做一个基于跳转的有限状态机时,你需要定义所有以后你会用到的状态,然后你也要定义所有状态之间的所有跳转。这真的会非常非常快就把AI搞得非常复杂。比如假设你拥有一个“受伤”状态,你便需要指出所有其它能够跳转成受伤状态的状态并且指出状态跳转的条件。比如行走状态变成受伤状态,跳跃状态变成受伤状态,蹲伏状态变成受伤状态,攻击状态变成受伤状态等等。这很有用,但却很快便会变得非常复杂。如果你的AI需求非常简单的话,这可能会得不偿失。
关于基于跳转的有限状态机的另一个难点是它非常难于调试。如果你设了一个断点并去看看AI当前的状态,如果没有额外的调试代码,你不可能知道AI是如何进入当前的状态,它之前的状态是什么以及怎样的跳转将状态变为现在的状态。(译注:有限状态机还是比较好调试的,因为状态有限,变换有限,所以可以非常清楚的记录下来,即可以通过额外的变量来保存,也可以直接在游戏打印在每个单位上)。
行动列表的缺点
当我对行动列表的理解更加深入一点以后,我意识到它们非常适合我的工作内容,但同时我也发现了它们的一些缺点。最大的缺陷便源自其最大的优点—-简单性。因为这是一个有序列表,所以我不能有任何形式的复杂优先层次结构。所以如果我希望“攻击玩家”状态排在“破门”状态前面,但却在“向目标移动”的状态后面,但同时我又希望“向目标移动”的状态出现在“破门”状态后面,这便很难使用行动列表来做到这点,而用有限状态机的话又会非常繁琐。
总而言之,行动列表对于简单的AI系统真的非常有帮助,但是你要建模的AI系统越复杂,要用行动列表来实现就越困难。也就是说可以通过某些方法去扩展行动列表的概念以便让它变得更强大。
扩展行动列表概念的方法
我的一些AI单位需要完成多种任务—-它们可能需要在移动的同时发动攻击。我可以创建多个行动列表,比如一个处理移动而另一个处理攻击,但这么做也存在问题,如果有些移动类型不能攻击,而有些攻击又需要单位站在原地的话该怎么办?这时候行动线路便会发挥作用。

行动线路是对阻碍概念的扩展。有了行动线路,行动本身便能够识别阻碍执行的特定行动类型并允许其它行动继续顺利的进行。让我们进一步展示这个概念。
行动线路只是决定哪个行动执行的一种附加方法。每个行动都属于一条或多条线路,当行动的阻碍属性变成真时,它将阻碍行动线路里面的其他行动的执行,因为每个行动都属于一条或多条行动线路,所以它只是阻碍其它属于这些线路的行动。
举个例子,攻击玩家属于行动线路,向目标移动属于移动线路,建梯子同时属于这两种线路,因为单位在建梯子的时候必须保持不动并且不能发动攻击。然后我们对行动进行排序,如果某个行动执行了,它会阻碍它所属线路后面行动的执行。
一个实现的例子
现在我们已经对这个理论有了一定的理解,对这个理论实践一次会非常有帮助。首先让我们设置行动列表和行动项目。对于行动项目我希望能够与实现解耦,所以让我们创建一个接口。

DSC0005.png
下面就是一个基于IActionItem 实现的BreakDoor行动项目:

DSC0006.png
对于行动列表本身可以使用一个简单的List类。然后我们将数据保存到IActionItems。

DSC0007.png

之后我们将设置一个方法在每帧中遍历列表。请记住还需要每帧处理阻碍属性。

DSC0008.png

如果你想要使用行动线路的话事情会变得更复杂一点。我们将把行动线路用bitfield类型表示然后修改IActionIteminterface。

DSC0009.png
然后我们修改遍历以便支持行动线路。如果行动线路被阻碍,后面的行动项目会被跳过,否则的话仍然进行正常检查。如果所有线路都被阻碍了,我们会跳出循环。
结论
所以这篇文章有非常多的内容需要理解。在某天编程的时候Frankie让我总结下学到的内容。于是我仔细考虑了这个事情,对我来说这里面有一些关键点。
·         行动列表比小的基于跳转的状态系统更加容易设置和维护。
·         行动列表构建了一个可识别的优先系统。
·         存在一些方法可以用来进行扩展功能。
与编程中的其他部分一样,AI框架通常并没有什么最佳方案。重要的是在你的工具箱里面有非常多的编程工具,以便在遇到问题的时候可以根据需求选择合适的工具。行动列表被证明非常适合King Randall’s Party。也许它也是你的项目的合适解决方案?
本文最初是在gorillatactics.com发布的。

关于作者

Jesse是Gorilla Tactics的创始人,这是一家位于Amherst MA的一个山顶废弃核设施里的外包游戏开发公司,仅仅通过降落伞、崎岖的登山或者雪橇才能到达。Jesse开始他的游戏开发是在一次沿着迪尔菲尔德河游了200英里到城里去接收一些伐木工人的装备,他通过一个窗户看到一些PS2的画面然后决定放弃他美丽而孤独的生活转而通过视频游戏这个媒介来把快乐带给大众。他合作过的客户包括华纳兄弟、微软、库尔斯酿酒公司、Firaxis和明尼苏达州政府。他现在正在开发King Randall’s Party,这是一个建造城堡并进行防御的游戏。你可以在www.gorillatactics.com看到他的工作。

授权文件
根据授权文件,我们可以翻译这篇文章。

+1
1415°C
1
  • 五UUIC
过: 他们
因分享而快乐,学习以自强!
五UUIC 发表于 2018-4-11 14:28:03 显示全部楼层
学习学习.........
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ