游戏中AI的行为树(Behaviour Tree in Game AI)
行为树已经成为游戏AI中重要流行的实现方式,相比其他种类的ai(如神经网络,遗传算法,机器学习)更适合策划配置和控制,相比fsm更易扩展,在arpg中的怪物ai中比较流行。这里对行为树的概念做个总结。
行为树是一个树状结构,没给节点都是一个行为节点,ai的执行过程就是从树根按照一定规则开始遍历整个树的过程,通常实现上会在没帧从树根处tick一遍整棵树。这棵树完整执行完一次的过程中可能对树遍历过很多次,因为每次整个树遍历完之后,如果还有节点还在running状态,就要在从根处tick一下再遍历,当run后没有任何节点在running就是执行完了一次,这时一般会进行新的一次执行,
节点有不同的功能,有的控制遍历的顺序,有的执行确切的游戏逻辑。
节点通常包括这样几个函数 init() 第一次遍历到该节点 run()每次执行到该节点(每次tick这颗树的时候tick到) exit()离开这个节点(整棵树执行完一次)有的实现还会加一个update(),被run()调用来表示那些多帧操作的行为每次tick到的时候的操作
节点的run通常返回三种状态 success 完成 fail 失败 running 仍然在运行中(一些需要多帧完成的动作)
节点一般要存储上一次run之后的返回值状态
每次遍历到一个节点的时候可以根据节点上次的返回值状态来决定本次run的情况
节点可能还需要有中止运行的功能
根据节点的run行为主要有以下几种类型的节点:
ConditionNode:判断一个逻辑,返回T 或 F,T和F分别连接着下一个要遍历的节点,在run里面一般不管上次的返回值状态都会重新做一次判断,以让ai能够实时反馈最新的环境情况。如果本次判断和前次判断有差,则要中止前次分支下的所有节点。
ActionNode:这通常是一个叶子节点,执行一个程序逻辑。对于一个需要多帧完成的逻辑,在run里面可以根据上次的状态执行每帧操作。
SequenceNode:他的所有子节点要按顺序完成,即逐个遍历每个子节点,只有当每个节点都返回success自己才能返回success,否则自己返回running,只有前一个自节点返回成功或失败才进行下一个自节点的探测
SelectorNode:和sequeNode的and操作相反,它是or,它的所有自节点,只要有一个返回success,他自己就返回success,否则自己返回running,只有前一个自节点返回成功或失败才进行下一个自节点的探测
RandomNode:随机挑一个子节点遍历,run后就返回success,只有一次执行的第一次遍历才会进行判断要遍历的子节点,并记住这个节点,对于后面的遍历直接找到这个子节点遍历。
Invertor:将子节点的success或fail的返回值取反作为自己的返回值。子节点running自己就running
Succeeder:子节点无论返回什么,自己都返回succe
Repeator:重复执行自节点,直到达到指定条件(如执行次数之前)自己都处于running
当然这些都是常见的一些设计上的模式,我们还可以根据我们的需要定义你需要的节点,还有最重要的一点,你必须有一个好用的图形化的行为树编辑器给策划