news 2026/4/30 22:56:27

教程2:让行为树丰富起来-–-behaviac

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
教程2:让行为树丰富起来-–-behaviac

原文

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

类似于任何一种程序语言的基本语法,behaviac组件也提供了基本的赋值、条件、循环、序列、选择等基本节点。有了《教程1:Hello Behaviac》的基本介绍,本教程将引入这些常用的复合节点,以便将行为树编辑得更加丰富多彩。

用编辑器打开本教程C++版的工作区文件tutorial_2_cpp.workspace.xml(而C#版工作区文件是tutorial_2_cs.workspace.xml),如下图所示:

注意:本教程延用了《教程一》的FirstAgent子类及其成员方法SayHello等类型信息,可以参考《教程一》的做法,打开类型信息浏览器创建该子类。此外,还为FirstAgent子类添加了int类型的成员属性p1,如下图所示:

参考《教程一》的做法,点击上图中右下方的“应用”按钮,生成“胶水”代码,并将这些代码整合到项目tutorial_2中,并添加tutorial_2.cpp文件用于使用behaviac的相关接口来加载和执行行为树,如下图所示:

循环节点

循环节点类似于程序语言中的for或while循环,用于重复执行某个操作。

新建行为树“LoopBT”,将根节点的Agent类型设置为“FirstAgent”,并为其添加循环和动作节点,如下图所示:

选中循环节点,将其参数“次数”设置为3,其他参数暂不用设置,如下图所示:

选中动作节点,为其选择“SayHello”方法,如下图所示:

导出、加载并执行该行为树“LoopBT”,得到如下图所示的结果:

可以看到输出了3次“Hello Behaviac!”,这是我们预期的结果。

如果想了解循环节点其他参数的用法,请选中循环节点,并按F1键,会自动打开该节点的使用手册。

此外,循环直到节点类似于循环节点,两者的差别可以参考手册《循环直到节点》和《循环节点》。

赋值节点

新建行为树“SequenceBT”,将根节点的Agent类型设置为“FirstAgent”,并为其依次添加序列、赋值、条件和动作节点,如下图所示:

类似于程序语言中的赋值语句,赋值节点可以将右值赋给左值。

选中上图中的赋值节点,将“左参数”选择为前面所添加的成员属性“p1”,“右参数”直接设置为6,表示程序端在执行该行为树时,会将右值6赋给左值p1,如下图所示:

更多细节请参考手册《赋值节点》。

条件节点

类似于程序语言中的条件判断语句,条件节点用于比较两个值的情况,用于跟后续节点组合使用,表示条件满足时,是否执行后续的节点。

选中上面行为树“SequenceBT”中的条件节点,将“左参数”选择为前面所添加的成员属性“p1”,“右参数”直接设置为3,“操作符”设置为“>”,表示判断p1是否大于3,如下图所示:

更多细节请参考手册《条件节点》。

序列节点

序列节点是行为树中传统的组合节点之一。该节点以给定的顺序依次执行其子节点,直到所有子节点成功返回,该节点也返回成功。只要其中某个子节点失败,那么该节点就直接返回失败,不再执行后续的子节点。

在上面行为树“SequenceBT”中,可以看到序列节点有3个子节点,分别是赋值、条件和动作节点。在依次执行该序列节点的子节点时,赋值节点(p1 = 6)永远返回成功,将继续执行条件节点(p1 > 3),该条件节点也返回成功,因此继续执行动作节点(SayHello),最后期望输出“Hello Behaviac!”。

执行该行为树,得到如下结果:

可以看到,执行结果跟期望保持一致。

如果将条件节点的右值3改为8,得到行为树如下图所示:

重新导出并加载执行该行为树,执行结果如下所示:

可以看到,并没有输出“Hello Behaviac!”,说明动作节点(SayHello)没有得到执行,因为条件节点(p1 > 8)已经返回失败。

更多细节请参考手册《序列节点》。

选择节点

选择节点也是行为树中传统的组合节点之一。该节点以给定的顺序依次调用其子节点,直到其中一个成功返回,那么该节点也直接返回成功,不再执行后续的子节点。如果所有的子节点都失败,那么该节点也返回失败。

新建行为树“SelectBT”,将根节点的Agent类型设置为“FirstAgent”,并为其依次添加序列、赋值、选择、条件和动作节点,如下图所示:

执行该行为树,得到结果如下:

可以看到,并没有输出“Hello Behaviac!”,说明动作节点(SayHello)没有得到执行,因为条件节点(p1 > 3)已经返回成功,那么选择节点直接返回成功,不再执行后续的子节点。

如果将条件节点的右值3改为8,得到如下的行为树:

重新导出并加载执行该行为树,执行结果如下所示:

可以看到,执行结果输出了“Hello Behaviac!”,说明动作节点(SayHello)得到了执行,因为条件节点(p1 > 8)返回失败,选择节点会继续执行后续的子节点,也就是该动作节点。

更多细节请参考手册《选择节点》。

导出格式

除了支持《教程一》介绍的XML导出格式,behaviac组件还支持BSON、C++和C#格式的行为树导出。

勾选上所有的导出格式,如下图所示:

XML

指定文件格式为XML,如下代码所示:

behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_xml);

BSON

点击右下方的“导出”按钮后,可以看到在导出目录tutorials/tutorial_2/cpp/exported下,除了原有的*.xml文件之外,还有了*.bson.bytes文件,如下图所示:

加载使用BSON文件,只需要把文件格式改为BSON即可,如下代码所示:

behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_bson);

加载某个行为树时,文件名并不需要指定后缀,只要指定相对于导出位置的路径和文件名,如下代码所示:

g_FirstAgent->btload(“LoopBT”);

这里,我们使用行为树“LoopBT”,执行后的结果如下图所示:

可以看出,跟XML格式的执行结果保持一致。

C++

在代码生成目录tutorials/tutorial_2/cpp/behaviac_generated/behaviors下,导出了行为树的C++源码文件,如下图所示:

需要把这些文件整合到自己的项目中一起编译,如下图所示:

所有C++版教程的项目都包含在源码包中projects/vs2013目录中的工程behaviac.sln,打开该工程文件后,可以看到里面有behaviac组件的源码和所有的教程项目,如下图所示:

找到tutorial_2项目,打开里面的tutorial_2.cpp文件,将文件格式改为C++,如下代码所示:

behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_cpp);

这里,我们使用行为树“LoopBT”,执行后的结果如下图所示:

可以看出,跟XML格式的执行结果保持一致。

C#

打开本教程C#版的工作区文件tutorials/tutorial_2/workspace/tutorial_2_cs.workspace.xml,该工作区的参数配置如下图所示:

类似于前面介绍的导出窗口配置,选中所有的格式并进行导出,如下图所示:

打开位于源码包tutorials/tutorial_2/cs目录中的tutorial_2.sln工程,可以查看本教程的C#示例代码。

可以通过修改文件格式来加载不同类型的行为树文件,如下代码所示:

加载XML版的行为树:

behaviac.Workspace.Instance.FileFormat=behaviac.Workspace.EFileFormat.EFF_xml;

加载BSON版的行为树:

behaviac.Workspace.Instance.FileFormat=behaviac.Workspace.EFileFormat.EFF_bson;

加载C#版的行为树:

behaviac.Workspace.Instance.FileFormat=behaviac.Workspace.EFileFormat.EFF_cs;

编译并执行C#工程,可以查看加载和执行行为树后的结果。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:23:43

Deep-Live-Cam自动化构建指南:从代码到可执行文件的完美旅程

在开源项目开发中,自动化构建已成为提升开发效率的关键技术。通过GitHub Actions配置,Deep-Live-Cam项目实现了从代码提交到Windows可执行文件生成的全流程自动化,让开发者能够专注于功能创新而非繁琐的工程化工作。本文将带你深入了解这个实…

作者头像 李华
网站建设 2026/4/29 16:36:09

0.8秒修复1080P视频:SeedVR2重构行业效率标准,成本直降90%

0.8秒修复1080P视频:SeedVR2重构行业效率标准,成本直降90% 【免费下载链接】SeedVR2-3B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-3B 导语 字节跳动开源的SeedVR2-3B模型通过"一步式扩散对抗后训练"技术…

作者头像 李华
网站建设 2026/4/23 16:49:34

如何打造灵活的终端界面:FTXUI ResizableSplit全攻略

如何打造灵活的终端界面:FTXUI ResizableSplit全攻略 【免费下载链接】FTXUI :computer: C Functional Terminal User Interface. :heart: 项目地址: https://gitcode.com/gh_mirrors/ft/FTXUI 还在为终端界面布局僵化而烦恼吗?FTXUI的ResizableS…

作者头像 李华
网站建设 2026/4/30 9:58:31

国产的视频裁剪框架AndroidVideoTrimmer

《FFmpeg开发实战:从零基础到短视频上线》一书的“第 12 章 FFmpeg的移动开发”介绍了如何使用FFmpeg在手机上剪辑视频,方便开发者更好地开发类似剪映那样的视频剪辑软件。那么在Android系统上还有一款国产的开源视频裁剪框架Android-Video-Trimmer&…

作者头像 李华
网站建设 2026/4/30 18:51:12

Llama-Factory能否用于代码生成模型微调?实测结果

Llama-Factory能否用于代码生成模型微调?实测结果 在软件工程领域,一个能“读懂”函数签名、理解注释语义,并自动生成高质量代码片段的AI助手,早已不再是科幻场景。从GitHub Copilot到通义灵码,大语言模型(…

作者头像 李华
网站建设 2026/4/29 20:13:08

Kickstarter Android开源项目:从零开始的完整入门指南

Kickstarter Android开源项目:从零开始的完整入门指南 【免费下载链接】android-oss Kickstarter for Android. Bring new ideas to life, anywhere. 项目地址: https://gitcode.com/gh_mirrors/an/android-oss Kickstarter Android开源项目是一个功能丰富的…

作者头像 李华