对游戏NPC的行为控制一般有2种,一种是状态机,一种是行为树。
状态机:
Unity对人物动画的控制是基于状态机的,如下图:
可以看到,每个状态除了包含自身的状态行为外,还需要和其他的状态打交道,需要输入状态机之间切换的条件。因为这一点,导致增加状态会使得状态机越来越复杂。
状态机是一种网状结构,耦合性很大。
行为树:
1、行为树是将游戏NPC的行为(走动,攻击,跳跃)搭建为一颗树,父节点是行为分支,叶节点是行为的具体表现。
2、行为树将NPC的行为包装为一个对象,符合面向对象的设计理念。
3、行为树的好处是将行为逻辑和状态数据剥离,降低耦合,方便策划配置,而无需对每个人物的行为进行代码控制,提高了可视性,简化问题排查,提高效率。
4、行为树把行为和状态数据剥离,可以这么理解,比如NPC要跳跃,那么前提条件可以是:已完成上一个动作,HP大于0,下一个行为状态设置为跳跃。把这些条件看作状态数据,把跳跃的Animation看做行为,那么当要切换行为的时候,就不用去管上一个状态是什么行为、和上一个状态是什么关系。构建出来的行为树,只需要判断当前的状态数据是否满足跳跃的条件,满足就执行行为,不满足就返回false。
5、行为树是树状结构,相对于状态机的网状结构来说耦合性更低。
6、行为树的子节点执行时需要返回,返回类型有:False,True,Running。
7、行为树的父节点存在多个情况,1个节点和多个节点,当父节点有多个字节点时,有几种组合顺序:
①
并行执行
:并行执行多个子节点的行为。
②
随机执行
:从多个字节点中随机选择一个执行。
③
选择执行
:从多个字节点中按照顺序选择一个能执行的行为。
④
顺序执行
:按照顺序依次执行多个子节点。