2026/2/19 3:56:50
网站建设
项目流程
成都电子网站建设多少钱,招聘网58同城求职信息,wordpress 网站前端显示,政务公开和网站建设情况总结原文
本文档描述的是3.6及以后版本#xff0c;对于3.5及以前的老版本请参考分类“3.5”。子树可以用来复用已有的行为树。通过子树节点#xff0c;一个行为树可以作为另一个行为树的子树#xff0c;而作为子树的那个行为树将被父树所“调用”。
子树还可以类似编程语言中的…原文本文档描述的是3.6及以后版本对于3.5及以前的老版本请参考分类“3.5”。子树可以用来复用已有的行为树。通过子树节点一个行为树可以作为另一个行为树的子树而作为子树的那个行为树将被父树所“调用”。子树还可以类似编程语言中的函数调用一样通过传递参数来使用。类似动作节点子树节点根据子树的执行结果也会返回一样的执行结果即成功、失败或正在执行其父节点按照自己的控制逻辑来控制接下来的运行。1. 编辑类型信息首先我们需要添加一个Agent类后面会利用这个Agent类来创建行为树。打开类型信息浏览器分别为Agent类“FirstAgent”添加成员属性、方法和任务。添加int类型的成员属性p1如下图所示添加成员方法Say该方法带有一个string类型的参数如下图所示添加任务t1该任务带有一个int类型的参数如下图所示2. 不带参数的子树首先给出子树最直接的用法——不带参数的子树首先创建行为树“subtree”将动作节点的方法Say的参数设置为“Hello subtree!”如下图所示Say方法的功能是输出指定的字符串如下代码所示voidFirstAgent::Say(behaviac::stringparam0){/// BEGIN WRITING YOUR CODE Sayprintf(\n%s\n\n,param0.c_str());/// END WRITING YOUR CODE}然后创建行为树“maintree”并将行为树列表中的节点“subtree”直接拖拽到该树中如下图所示这样行为树“maintree”就可以“调用”子树“subtree”了。加载并执行行为树“maintree”后结果如下图所示可以看到输出了“Hello subtree!”字符串说明子树“subtree”得到了正确的调用和执行。3. 带参数的子树有时候我们可能需要给子树传递参数来使用这样子树会更加模块化。对于这种需要传参的子树可以按照如下操作进行首先创建行为树“subtree_task”并为其添加的第一个子节点必须是任务节点如下图所示为上图中的任务节点在其属性窗口中配置其“任务”参数为“t1”如下图所示由于任务“t1”带有参数“param0”所以在上面行为树“subtree_task”的条件节点中可以使用该参数“param0”如上图所示。可以借鉴程序语言的说法该参数“param0”就类似于函数的形参。然后创建行为树“maintree_task”并将行为树列表中的节点“subtree_task”直接拖拽到该树中如下图所示选中上图中的子树节点配置任务的参数值“param0”为2这个参数类似于函数中的实参如下图所示这样行为树“maintree_task”就可以“调用”子树“subtree_task”并为该子树传递参数了。加载并执行行为树“maintree_task”后结果如下图所示可以看到输出了“Hello subtree_task!”字符串说明子树“subtree_task”得到了正确的调用和执行。4. 添加子树节点的补充说明如上所述可以从编辑器左侧的行为树节点列表中通过鼠标选择并拖拽一棵行为树到另一棵行为树中来生成子树节点。被拖拽的行为树的路径被设置到引用文件名。需要指出的是并非任意一个行为树都可以作为另外一个行为树的子树。3.6.32及之前版本作为子树的Agent类型必须是父树的Agent类型的同类或父类。而3.6.33及之后版本作为子树的Agent类型可以是父树的Agent类型的同类或父类或子类但是需要保证执行该父树的Agent实例是父树和子树的Agent类型的子类或更低子类的实例例如假设父树的Agent类型是A子树的Agent类型是B如果A是B的子类那么执行该父树的Agent实例必须是A或者A的子类的实例如果B是A的子类那么执行该父树的Agent实例必须是B或者B的子类的实例。另外也可以像添加其他节点那样在节点列表中选取子树拖拽到相应的位置然后点击该子树节点在右侧的属性窗口中配置引用文件名或任务。如果手工配置的子树的路径是空的或无效的在检查错误时会报错表示该树不允许被导出。如果配置的是属性或方法在编辑器中无法知其是否有效只有运行的时候才会报运行时错误如果运行过程中该值无效。本教程相关的工作区和代码工程详见源码包的目录tutorials/tutorial_5。