基于行为树的ai

     我们现在做的游戏,包括手游,网页游戏,ai部分策划那边的需求并不复杂(待机,巡逻,行走,逃跑,攻击,被击),而且ai需求定了,也不会有太大的改动。所以用状态机是一个不错的选择,因为状态机确实很简单(我们一直都是用状态机)。行为树,实现ai的另外一种方式,先简单介绍一下行为树的概念,然后我们用行为树的方式实现一套简单的ai。

行为树,从名字看肯定是一种树形结构,树的结点可以分为叶子结点和非叶子结点。在行为树中非叶子结点      负责控制ai的逻辑走向,叫做控制结点,叶子结点负责执行逻辑。

控制结点又可以分为以下几种类型:

    root:根结点,没有具体的意思,每次计算ai的逻辑需要从它开始, 逐个遍历子结点。

    selectNode: 选择结点,有一个子节点返回true,分支就结束,不再遍历。

    sequeceNode: 序列结点,有一个子节点返回false,分支就结束,不在遍历。

    parallelNode: 并行结点,子节点可以在同一帧中都执行,返回结果由子节点的逻辑决定。

叶子结点分为:

    conditionNode: 条件结点,是actionNode的前置条件。

    actionNode: 执行结点,执行具体的逻辑,比如行走,攻击。

以上是我个人对行为树的理解,肯定又不合适的地方,欢迎指正。

 

策划同学的需求:小明养了一只兔子,兔子在草地上吃草,有一只狼要吃兔子,如果离兔子比较远,狼会慢慢的趴着走,如果走近了狼会冲刺过去,兔子看到狼接近了会停止吃草

向小明跑过去。小明如果看到兔子跑到距离自己一点范围会给他一个胡萝卜,如果看到狼靠近了小明就得赶走狼。等狼赶走了,兔子又去吃草,整个过程需求就这样循环。

我们先分析以下这段需求,行为树结点怎么设计,很显然有3个物体需要有ai,小明,兔子,狼,它们3个的ai也是不同的, 我们分别画出它们对应的树形图, 然后对应图来说明。

从兔子开始,他的ai最简单,它有2种行为:吃草、逃跑。当狼靠近了时他就往小明跑,所以逃跑需要一个前提条件,狼靠近了,我们用AiCondition_1来处理,这个类负责处理兔子的预警。兔子的图:

 

 接下来是小明的ai,小明有3种状态,待机,喂兔子,驱赶狼。

待机:这个简单就是个动作,所以是行为结点。

喂兔子:这个需要条件(兔子靠近了),所以这个点就做成选择结点,它下面有2个子节点一个条件结点,一个行为结点

驱赶狼:这也是一个选择结点,它下面有2个子结点,一个是条件结点,一个是行为结点



 最后是狼,描述它的这棵树要复杂些。看图

不一样的地方是狼的行为中定义了一个并行结点searchRobbitNode, 它下面有2个行为结点,observeAction和moveAction,上面的observeAction应该是红色的,它是个行为点。狼找兔子要一边看,一边走,眼睛和腿同时运动。其他的结点都比较简单,都是一个条件配上一个行为,然后它们的父结点是一个选择结点。

以上就是我对这个需求的简单分析说明。下面说一下主要的代码:

 Xiaoming,Robbit,Wolf 分别代表小明,兔子和狼,他们的一个重要属性agent,是管理ai的类。

agent里面有所以的ai,如果物体需要某种类型的ai(idle,move,attack...),实现相应的接口就行。

control这个包里的是主要的代码,虽然很简单,但是它是整个树的控制模块。

代码放入附件里,没有写完,小明的攻击ai没有实现,呵呵,我有点懒。如果对大家有所帮助,就好,有在生产环境中用过行为树的同学,欢迎赐教

 

猜你喜欢

转载自arthur-3726.iteye.com/blog/2175035