当前位置: 首页 > news >正文

教程12:并行节点的使用-–-behaviac

原文

本文档描述的是3.6.34及以后版本,对于3.5及以前的老版本请参考分类“3.5”。

并行节点用于一般意义上并行的执行所有子节点,相关的功能和属性说明详见手册《并行节点》。

并行节点容易在其属性配置上产生误用,本文将结合行为树中对并行节点的实际使用来加以说明。

1. 首先创建Agent子类“FirstAgent”及其成员属性p1和成员方法Say(behaviac::string& value, bool isLatent),Say()方法用于打印指定的参数,如下图所示:

Say()方法表示对于isLatent为真的情况,在第三帧后返回成功,前两帧返回正在执行;而对于isLatent为假的情况,在第一帧就直接返回成功,其实现代码如下所示:

behaviac::EBTStatusFirstAgent::Say(behaviac::string&value,boolisLatent){///<<< BEGIN WRITING YOUR CODE Sayif(isLatent&&behaviac::Workspace::GetInstance()->GetFrameSinceStartup()<3){printf("\n%s [Running]\n\n",value.c_str());returnbehaviac::BT_RUNNING;}printf("\n%s [Success]\n\n",value.c_str());returnbehaviac::BT_SUCCESS;///<<< END WRITING YOUR CODE}

其中,当前帧数在主循环代码中每帧进行累加,如下代码所示:

voidUpdateLoop(){LOGI("UpdateLoop\n");behaviac::Workspace::GetInstance()->SetFrameSinceStartup(0);behaviac::EBTStatus status=behaviac::BT_RUNNING;while(status==behaviac::BT_RUNNING){behaviac::Workspace::GetInstance()->SetFrameSinceStartup(behaviac::Workspace::GetInstance()->GetFrameSinceStartup()+1);LOGI("frame %d\n",behaviac::Workspace::GetInstance()->GetFrameSinceStartup());status=g_FirstAgent->btexec();}}

2. 创建行为树“ParallelBT”,其中并行节点有3个子节点,第一个是条件节点,第二和三个都是动作节点,如下图所示:

3. 该并行节点的的属性默认配置如下图所示:

  • **失败条件:**FAIL_ON_ONE表示一个子节点返回失败,那么并行节点就返回失败。
  • **成功条件:**SUCCEED_ON_ALL表示所有子节点都返回成功,并行节点才返回成功。这里需要注意,失败条件优先于成功条件。
  • **子节点结束继续条件:**CHILDFINISH_LOOP表示子节点结束后会重新再循环执行。
  • **退出行为:**EXIT_ABORT_RUNNINGSIBLINGS表示当并行节点的成功或失败条件满足并返回成功或失败后,会终止掉其他还在运行的子节点。

4. 执行该行为树,结果如下图所示:

5. 将并行节点的属性“子节点结束继续条件”改为CHILDFINISH_ONCE,表示子节点结束后不再执行(除非重入该并行节点),如下图所示:

6. 再执行该行为树,结果如下图所示:

从上图可以看到,虽然一共循环了3次,但ID为7的动作节点只执行了一次,而ID为0的动作节点由于前两帧执行时返回Running,得到持续执行,直到第三帧返回Success或Failure。

7. 将并行节点的属性“失败条件”改为FAIL_ON_ALL,并将“成功条件”改为SUCCEED_ON_ONE,如下图所示:

8. 再执行该行为树,结果如下图所示:

从上图可以看到,一共循环了1次,并行节点的所有子节点也都执行了1次。

本教程相关的工作区和代码工程详见源码包的目录tutorials/tutorial_12。

http://www.jsqmd.com/news/90150/

相关文章:

  • 随机序列节点-–-behaviac
  • 随机选择节点-–-behaviac
  • 概率选择节点-–-behaviac
  • CSP2025 游记(同步洛谷)
  • 3D点云数据重塑:突破性预处理策略与Point-E创新实践全解析
  • 如何用手机打造专业直播系统?DroidCam OBS插件终极指南
  • 告别选择困难症!Layui formSelects多选下拉框让你秒变表单高手
  • NotepadNext十六进制编辑功能的创新应用与重构指南
  • Android Studio中文界面配置教程:从零开始的本地化设置指南
  • FF14自动跳过副本动画的终极解决方案:新手完整指南
  • GridPlayer多视频同步播放器:网格布局与多源适配全解析
  • 飞桨ERNIE-4.5-VL-28B-A3B模型深度解析:多模态交互新范式与部署实践指南
  • 3D点云数据优化:Point-E预处理技巧深度解析
  • 5个步骤掌握Equalizer APO:从新手到高手的音频增强指南
  • 如何免费解锁付费内容:5个简单有效的付费墙绕过方案
  • TrafficMonitor插件配置完全攻略:3大技巧打造个性化系统监控中心
  • Nugget命令行下载工具:简单高效的极简解决方案
  • 暗黑3终极自动化辅助工具完整使用指南
  • Pyarmor静态解密工具:无需运行即可解密加密Python脚本的终极方案
  • 5分钟搞定:wvp-GB28181-pro国标视频平台Docker极速部署指南
  • 联想拯救者工具箱完整指南:解锁硬件潜能的一站式解决方案
  • 成就电子电路设计高手,探讨FPGA控制系统中的电子电路设计方法
  • 百度ERNIE 4.5大模型深度解析:多模态技术突破与企业级应用新范式
  • Applite终极指南:3分钟完成macOS软件环境完整配置
  • PiliPlus:解锁B站隐藏功能的10个实用技巧,让视频观看效率提升300%
  • [MM32软件] 突破边界:在MM32上实现FATFS与TinyUSB的协同作战——UART命令行控制的文件管理系统实现
  • DOCX.js终极指南:在浏览器中轻松生成Word文档
  • Tube MPC鲁棒控制完全指南:从理论到MATLAB实战
  • LiteLoaderQQNT防撤回插件:让被撤回的消息无处可藏
  • 飞书文档批量导出终极方案:700文档25分钟高效迁移