子树的介绍

通过子树节点,一个行为树可以作为另一个行为树的子树。作为子树的那个行为树被“调用”。如同一个动作节点一样,子树节点根据子树的执行结果也会返回执行结果(成功、失败或运行。),其父节点按照自己的控制逻辑来控制接下来的运行。

递归

一个行为树可以“调用”自己,这么做的时候形成递归,形成递归的时候需要注意不要造成死循环,这可以通过变量的使用来避免。

如下图所示,利用testVar_0来避免死循环:第一次进入的时候testVar_0 == 0,所以可以执行下面的序列,先把testVar_0赋值为1,那么在下面的递归重入的时候由于testVar_0 == 1,所以testVar_0 == 0的条件不满足,所以下面的序列不会进入从而避免了死循环。

子树节点的属性

当选取子树节点的时候,在属性面板中显示如下图的属性:

  • 引用文件名,作为被调用的子树的行为树的相对路径。该属性不允许为空,需要是有效的路径。没有提供有效路径会导致报错并且该树不允许被导出。引用文件名可以是const常量,可以是变量(其值是行为树的相对路径),或函数(其返回值需要是字符串,是行为树的相对路径)
  • 任务,如果子树的根节点是任务节点,这里会出现该任务,并且允许提供参数。如在最上的图中,8号节点travel(x, ax),4号节点travel(ay, y)。如果子树的根节点不是任务节点,或者引用文件名不是常量,任务属性就是空的。

添加子树节点

  • 在编辑器中,可以通过鼠标拖拽一棵行为树到另一棵行为树中生成子树节点,被拖拽的行为树的路径被设置到引用文件名。需要指出的是,并非任意一个行为树都可以作为另外一个行为树的子树。作为子树的行为树的Agent类型需要是“父树”的Agent类型的子类或同类。
  • 也可以像添加其他节点那样,在节点列表中选取子树,拖拽其到相应的位置,然后配置引用文件名任务
  • 如果手工配置的子树的路径是空的,或无效的则会报错,该树不允许被导出。如果配置的是变量或函数,编辑器中无法知道其是否有效,只有运行的时候才会报运行时错误,如果其运行时的值无效的话。

版本

在3.4.0之前的版本中,子树节点只允许配置常量,只允许使用鼠标拖拽一棵行为树到另一棵行为树中生成子树节点。在3.4.0及以后的版本中,引用文件名可以是常量,也可以是变量或函数,也就是说3.4.0及以后的版本中,子树节点引用的子树可以是”动态”的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注