子树的介绍
通过子树节点
,一个行为树可以作为另一个行为树的子树
。作为子树的那个行为树被“调用”。如同一个动作节点一样,子树
节点根据子树的执行结果也会返回执行结果(成功、失败或运行。),其父节点按照自己的控制逻辑来控制接下来的运行。
递归
一个行为树可以“调用”自己,这么做的时候形成递归,形成递归的时候需要注意不要造成死循环,这可以通过变量的使用来避免。
如下图所示,利用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及以后的版本中,子树节点引用的子树可以是”动态”的。