前段时间,谈到了一种层次化的AI架构,通过“请求”来隔离出“决策层”和“行为层”,这种架构的核心是通过“请求”来起到承上启下的作用,并由此得出当前AI所应当有的行为,所以可以称之为“请求导向(Request-Oriented)”的结构。这种结构比较适用于需要频繁做AI决策的游戏场合,比如体育类游戏等,一旦变换了请求之后,行为层就可以迅速的找到相应的行为来完成请求的内容。
这次我们换一种思路,来讨论一种“目标导向(Goal-Oriented)”的AI结构,这种结构对于一些持续性相对较长的AI策略来说,是非常适用的。还是先举个例子吧,我平时很喜欢玩星际(没玩过的同学,可以看我下面的描述),那假设我用单个农民(SCV)造一个人族的重工厂(Factory),造重工厂的前提是需要200水晶(Mineral)资源,100气体(Gas)资源,而且必须要先造好兵营(Barrack),兵营是150水晶资源,还有在采集气体资源前,需要造一个气矿(Refinery),气矿也需要100水晶资源,具体流程图如下:
在这个流程里,我们为这个农民设定的“目标”就是“造一个重工厂”,由于在游戏中,要完成这个目标前,需要有其他一系列的预备行为,如果我们为这个农民写AI的话,它就需要根据上面的流程一步步的来完成我们要求它的“造一个重工厂”的目标。由于所有的AI行为决策都是由指定的目标引起的,所以我们把它称之为“目标导向(Goal-Oriented)”的AI架构。
由上面的例子我们可以看到,一个目标之后,必然会有一系列的行为与之对应,而这些行为就是为了最终完成这个目标,那这些行为是如何串联的呢?或者说,我们如何来做这样的行为计划呢?在“目标导向(Goal-Oriented)”的AI架构中,一般都会存在一个称之为“计划器(Planner)”的模块,由这个模块负责生成这样的行为序列,计划器有两种工作方式,一种是静态的,一种是动态的。
静态的计划器是在游戏设计时,对于所有已定义的可用目标,预先设计好计划流程,就像我们上面这个例子,我们就对“造一个重工厂”这个目标预先设计了一套计划流程,当游戏中的农民收到这个目标后,就会按照我们定义的这个流程来做。
动态的计划器是在游戏运行时,实时的根据目标来计划行为,因为我们看到,计划中每一个单步的行为都存在“前提(Precondition)”和“效果(Effect)”两个部分,“前提”就是做这个行为需要满足的条件,“效果”就是这个行为对于游戏世界的影响。还是用上面这个例子,像“造兵营”这个行为,它的前提就是“需要有150水晶资源”,它的效果就是“当前存在一个兵营”,再如“造重工厂”,它的前提就是“需要200水晶资源”,“需要100气体资源”,“当前存在一个兵营”,它的效果就是“当前存在一个重工厂”,可以看到,前一个行为的效果会成为了下一个行为的前提,所以有了这样的定义,我们就可以通过一些算法,来把可用的行为串联起来,形成一个计划,这样最后一个行为的效果,就是我们所定义的目标。
除了核心的计划器模块,我们还需要目标选择(Goal Selector)模块,来选择我们当前要完成的目标(相当于更高层的决策层),还有一个就是计划实施(Plan Stepper)模块(相当于行为层),用来按部就班的完成计划中各个行为,这两个模块比较好理解,就不多说了,有了上面几个部分的定义,我就可以画出这样的“目标导向(Goal-Oriented)”的AI架构图:
由上图可以看到这种架构也是相当清晰的,核心的计划器部分在具体实现的时候,还有各种各样值得讨论的地方,本文作为抛砖引玉的作用就不多提了,以后可以继续讨论。现在的游戏AI中,这种Goal-Planner架构的也占了相当大的比例,在动态的计划器的驱动下,可以呈现出多样和逼真的AI行为,希望这篇文章对大家了解这种架构起到一些帮助。
————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————
valve的source engine貌似用的就是这种系统。
这种系统不好实现,有挑战的:)
最近看到GOAP的架构,的确很灵活,究竟用行为树还是GOAP,没有头绪。
感觉行为树会相对简单一点,因为行为树的逻辑是静态的,GOAP的逻辑是动态串接的,所以还是要看你的需求