Unity-BehaviourTree行为树的简单介绍

之前在做AI的时候用的是状态机,但后来发现,当状态增多时整个状态机会变得很臃肿,状态的切换条件也很难把控 。于是就想到了行为树,花了些时间研究了一下 。
既然是树,那就是说是各种节点构成的 。
行为树中主要的节点类型由以下
1.复合节点()
2.条件节点()
3. 动作节点()
4.选择节点()
5.顺序节点()
6.平行节点()
先来屡一下这几种节点之间的关系
1)复合节点,包含顺序节点、选择节点、平行节点,也就是说顺序、选择、平行节点就属于复合节点 。
2)条件节点,是复合节点的子节点,条件节点包含动作节点是否被触发的条件 。条件执行结果为真时向父节点返回true否则返回false 。
3)动作节点,是复合节点的子节点,达到条件时所需要执行的节点 。一般向父节点返回true 。
4)选择节点,属于复合节点,该节点下面通常包含一个动作节点和一个或多个条件节点(也可以包含复合节点) 。当选择节点下的任意子节点返回true时,如果有动作节点就执行动作节点然后向父节点返回true(类似条件逻辑中的或)否则返回false 。

Unity-BehaviourTree行为树的简单介绍

文章插图
任意一个条件达成时,执行动作节点并向父节点返回true
选择节点下也可以为其他组合节点,当其任意子节点执行结果为true时,该选择节点的执行结果即为true
5)顺序节点,属于复合节点,该节点下面通常包含一个动作节点和一个或多个条件节点(也可以包含复合节点) 。当顺序节点所有子节点都返回true时,如果有动作节点就执行动作节点然后向父节点返回true(类似条件逻辑中的与)否则返回false 。
当顺序节点下所有子节点(条件节点)执行结果都为true时,执行动作节点并向父节点返回true
顺序节点的子节点可以为其他类型的节点,当子节点执行结果全都为true时,该节点执行结果即为true
6)平行节点,该节点会执行其所有子节点 。
这里我们可以发现在一个行为树中叶子节点一定是条件节点或动作节点
【Unity-BehaviourTree行为树的简单介绍】好了,大致了解了这几种节点之间的关系后,再来用一张图来详细说明 。
上面这张树状图描述了石头怪AI
Unity-BehaviourTree行为树的简单介绍

文章插图
好吧上面树状图的结构看起来有那么点复杂,这里Berry只是先简单介绍一下几个节点的作用 。
先从根节点往下走 。
石头怪AI(根节点)这个节点是选择节点,它包含巡逻(顺序节点)和跟随玩家(选择节点)
因为根节点是选择节点我们按照选择节点的规则(只要有一个节点返回true就停止执行)开始执行,假设先判断的是巡逻节点 。
巡逻是一个顺序节点,它包含两个条件节点和一个动作节点,我们按照顺序节点的规则(所有节点都返回true就停止执行并返回true)进行执行,也就是说当两个条件节点都返回true的时候就执行动作节点(动作节点默认返回true)并向石头怪AI(根节点)返回true 。否则,返回false 。
石头怪AI(根节点)会根据根据返回结果来决定是否继续执行下一节点 。如果巡逻节点返回为true那么就不会执行其他节点,整个行为树就执行完毕 。否则就继续执行下一节点(跟随玩家) 。
好了,剩下的节点的执行规则跟上述类似 。
这里简单总结一下行为树的优点:
1.使用灵活
行为树的状态切换十分灵活
2.叶子节点可复用
行为树的叶子节点(条件节点和动作节点)可以在不同的AI或复合节点下复用(类似于策略模式的方法族)
3.可以用树状图来描述AI,结构清晰
4.可以很方便的拓展AI,增加相应节点即可