目录
1.定义
行为树的概念会比状态机要复杂些——行为树是一个包含逻辑节点和行为节点的树结构,每次需要找出一个行为的时候,会从树的根节点出发,遍历各个节点,找出第一个和当前数据相符合的行为。
为了弄明白这个概念,我们讲一个英雄的故事:
从前有一个胆小如鼠的英雄,
- 他看到哥布林就会跑过去打它;
- 他看到半兽人就会逃跑;
- 他看不到哥布林也看不到半兽人就会休息;
- 他看到哥布林也看到半兽人也会跑。
用行为树表现出来:
Root是根节点,每次需要寻找行为的时候都必须从这里开始。
Priority Selector是一个逻辑节点,它的意思是让从左到右遍历自己的子节点,如果子节点的准入条件符合信息的话,就执行该子节点。如果英雄只看到哥布林,那么Orc in sight这个准入条件不符合,Escape不执行;Globlin in sight符合,于是执行Fight;因为Fight在Idle的左边,所以Fight的优先程度更高,于是Idle不执行。在我们的例子中,Idle可以看作是default behavior。
2.优点
从简单的行为树和有限状态机的对比,我们就可以看出,行为树由于引入了逻辑节点,它的转换条件更加少(线更少,更清晰),让拓展AI变得更加容易。
行为树还有另外一个优点:行为的重用(reuse)。
例如,Escape有一个跑的行为,而Fight则有跑的行为,和砍怪的行为。请看图:
Sequence同样是一个逻辑节点,它的意思是从左到右按顺序执行子节点,并且仅仅在一个子节点执行完成后才执行下一个子节点。在例子中,Do Run需要有一个自己判断到达目的地的方法,当该方法返回end的时候,才会执行Do Slash。
Escape和Fight的Do Run行为节点是一样的,只是Fight多了一个Do Slash行为节点而已。所以Do Run是一个可以重用的节点。
在行为树中,我们能够编写好Do Run,Do Slash这些基础的行为节点,和设定一些准入条件,就可以组成千变万化的AI了!
我们希望英雄在逃跑的时候群众发出嘘声,而在攻击的时候出现欢呼声:
省略了其他部分,只画Escape部分。
Parallel是一个逻辑节点,它的意思是让所有子节点同时运行,那它什么时候结束呢,可以使当所有子节点都完成的时候结束,也可以让任一子节点完成时结束,视乎需要来做出选择。
那么在攻击当中会是怎么样实现的呢?大家可以尝试画出来,习惯一下行为树的思维方式。
3.总结:
- 行为树拥有3种节点:
- 根节点 Root
- 逻辑节点(可拓展):
- Priority Selector
- Sequence
- Parallel
- 行为节点
- 行为树在复杂的情况比有限状态机更清晰,更可拓展
- 行为树有利于逻辑的重用
- 设计得好的行为树可以千变万化!
转载自: