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

Cplusplus运行时端的使用上手-–-behaviac

原文

运行时(游戏)端使用行为树之前,需要确保行为树文件已经成功导出。

如何注册和导出类型信息请参考C++类型信息的注册和导出,如何导出行为树请参考导出和使用XML/BSON行为树。

通过编辑器导出行为树文件后,运行时端的执行主要分为三个部分:

  • 初始化
  • 循环更新
  • 清理

1 初始化

在游戏的初始化函数中,添加初始化behaviac组件所需的功能,例如注册Agent子类信息、设置行为树文件的加载路径和文件格式、创建Agent子类的实例、加载行为树并设置当前所需执行的行为树等。

如下代码所示:

boolInitBehavic(behaviac::Workspace::EFileFormat ff){behaviac::Config::SetSocketBlocking(false);behaviac::Config::SetSocketPort(8081);behaviac::Agent::Register<CBTPlayer>();behaviac::Workspace::GetInstance()->SetFilePath("../test/demo_running/behaviac/exported");behaviac::Workspace::GetInstance()->SetFileFormat(ff);behaviac::Workspace::GetInstance()->ExportMetas("../test/demo_running/behaviac/demo_running.xml");//behaviac::Agent::SetIdMask(kIdMask_Wolrd | kIdMask_Opponent);behaviac::Workspace::GetInstance()->SetDeltaFrames(1);returntrue;}boolInitPlayer(constchar*pszTreeName){g_player=behaviac::Agent::Create<CBTPlayer>();boolbRet=false;bRet=g_player->btload(pszTreeName);assert(bRet);g_player->btsetcurrent(pszTreeName);returnbRet;}
关于文件路径的说明
  • Workspace::SetFilePath指定的是编辑器中Workspace的导出路径,可以是绝对路径。当指定的是相对路径的时候,相对的是当前工作路径(一般都是运行程序所在目录)。
  • Agent::btload使用的文件名是相对于Workspace::SetFilePath指定的路径,没有扩展名,可以有目录结构的层次化文件名,如“node_test/selector_loop_ut_7”。在编辑器中打开某个行为树后,右键文件页选取“复制文件名”获取。

  • 例如:
    • 如果运行程序所在目录(或者VS里指定的工作路径$(TargetDir))是”D:\Test\bin”

    • Workspace::SetFilePath指定的相对路径是“…/behaviac/workspace/exported”

    • btload指定是“node_test/selector_loop_ut_7”

    • 则workspace的导出路径实际是“D:/Test/behaviac/workspace/exported”,

      而相应的导出行为树文件是“D:/Test/behaviac/workspace/exported/node_test/selector_loop_ut_7.xml”或

      “D:/Test/behaviac/workspace/exported/node_test/selector_loop_ut_7.bson.bytes”。

    • 具体是xml或bson则由Workspace::SetFileFormat确定。

    • 当指定格式是cpp或c#的时候,导出的行为树是cpp或c#源码,已经编译构建进可执行程序,Agent::btload指定的文件名(跟xml的用法一样,无需修改btload的参数)只是用来标识该行为树的,从而代码可以据此创建相应的行为树,不像xml或bson格式的时候需要加载数据文件。

  • 如果Agent::btload加载失败,请注意检查当前路径,Workspace::SetFilePath设定的导出路径,以及Agent::btload指定的文件标识。还可以在当前路径里检查log文件_behaviac_$_$_.log

2 循环更新

在游戏的主循环中,添加执行Agent实例的行为树相关代码,也即通过调用Agent类的接口btexec()或Workspace类的接口Update()来执行行为树。

这两种执行方式的区别,请参考更新流程。

如下代码样例所示:

voidUpdateLoop(){inti=0;intframes=0;behaviac::EBTStatus status=behaviac::BT_RUNNING;while(status==behaviac::BT_RUNNING){cout<<"frame "<<++frames<<std::endl;status=g_player->btexec();}}

3 清理

最后的清理过程,包括销毁Agent子类的实例,以及反注册Agent子类信息等。

如下代码样例所示:

voidCleanupPlayer(){behaviac::Agent::Destroy(g_player);}voidCleanupBehaviac(){behaviac::Agent::UnRegister<CBTPlayer>();behaviac::Workspace::GetInstance()->Cleanup();}

以上步骤的完整代码,请参考demo_running.cpp文件。

http://www.cnnetsun.cn/news/72867.html

相关文章:

  • 微信小程序表格组件实战:从零到精通的数据展示方案
  • Qwen3-VL-30B跨模态推理性能评测:为何需要强大GPU支持?
  • 大数据领域分布式计算的分布式事务处理
  • Qwen-Image-Edit-2509支持对象替换与风格迁移的底层原理分析
  • Stable Diffusion 3.5 FP8如何实现低显存占用?技术架构深度解读
  • 44、高效运维与快速输入:实用技巧与解决方案
  • FLUX.1-dev vs Stable Diffusion:谁才是文生图领域的王者?
  • 52、版本控制全解析:从CVS到Word处理器的多维度探索
  • 如何用1个开源工具搞定全平台标签打印?LPrint终极指南
  • 基于半经验模型的熔断器燃弧过程计算与分析
  • OpenPLC Editor 完整教程:5步掌握工业自动化编程
  • PyTorch分布式训练FP8版本Stable Diffusion 3.5是否可行?初步探索
  • C# WPF界面设计:为ACE-Step打造桌面级音乐创作软件
  • Res-Downloader终极指南:3步搞定全网资源批量下载
  • Linux 项目托管 `git`
  • 终极OBS-NDI配置指南:5分钟解决视频流问题
  • HunyuanVideo-Foley音效生成引擎的技术架构剖析:从输入到输出全流程
  • HuggingFace模型卡撰写规范提升Qwen3-VL-30B曝光率
  • Windows虚拟显示器:3个步骤轻松扩展你的工作空间,你真的会用吗?
  • AI驱动虚拟角色:零代码打造智能交互新体验
  • python基于web的数学试题库组卷系统_k593i56u_pycharm Vue django flask项目源码
  • Tomcat11证书配置全指南
  • Notepad官网下载后如何编写Wan2.2-T2V-5B的自动化脚本?
  • macOS菜单栏智能管理解决方案:Ice工具深度解析
  • 2025年八大网盘直链下载完整指南:快速获取真实下载地址
  • 如何快速掌握Py-ART:气象雷达数据处理的完整实战指南
  • HuggingFace镜像网站推荐列表:国内高速下载Seed-Coder-8B-Base
  • 12、支持向量机与核分类算法详解
  • 快速掌握ZonyLrcToolsX:歌词下载的终极操作指南
  • VMware macOS虚拟机终极解锁指南:免费安装苹果系统的完整教程