状态机和行为树

  • Post author:
  • Post category:其他


对游戏NPC的行为控制一般有2种,一种是状态机,一种是行为树。

状态机:

Unity对人物动画的控制是基于状态机的,如下图:

可以看到,每个状态除了包含自身的状态行为外,还需要和其他的状态打交道,需要输入状态机之间切换的条件。因为这一点,导致增加状态会使得状态机越来越复杂。

状态机是一种网状结构,耦合性很大。

行为树:

1、行为树是将游戏NPC的行为(走动,攻击,跳跃)搭建为一颗树,父节点是行为分支,叶节点是行为的具体表现。

2、行为树将NPC的行为包装为一个对象,符合面向对象的设计理念。

3、行为树的好处是将行为逻辑和状态数据剥离,降低耦合,方便策划配置,而无需对每个人物的行为进行代码控制,提高了可视性,简化问题排查,提高效率。

4、行为树把行为和状态数据剥离,可以这么理解,比如NPC要跳跃,那么前提条件可以是:已完成上一个动作,HP大于0,下一个行为状态设置为跳跃。把这些条件看作状态数据,把跳跃的Animation看做行为,那么当要切换行为的时候,就不用去管上一个状态是什么行为、和上一个状态是什么关系。构建出来的行为树,只需要判断当前的状态数据是否满足跳跃的条件,满足就执行行为,不满足就返回false。

5、行为树是树状结构,相对于状态机的网状结构来说耦合性更低。

6、行为树的子节点执行时需要返回,返回类型有:False,True,Running。

7、行为树的父节点存在多个情况,1个节点和多个节点,当父节点有多个字节点时,有几种组合顺序:



并行执行

:并行执行多个子节点的行为。



随机执行

:从多个字节点中随机选择一个执行。



选择执行

:从多个字节点中按照顺序选择一个能执行的行为。



顺序执行

:按照顺序依次执行多个子节点。



版权声明:本文为PresleyGo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。