news 2026/6/10 7:51:17

教程10:定制自己的读取方式来加载行为树-–-behaviac

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
教程10:定制自己的读取方式来加载行为树-–-behaviac

原文

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

有的时候,由于自身项目的需要,例如对行为树文件进行加密、打包等处理,behaviac组件默认提供的文件加载机制不再满足需要,因此程序端需要定制自己的读取方式来加载行为树文件。

C++版

1. 需要从behaviac::CFileManager派生出自己的子类,并根据需要重载相关的方法,如下代码所示:

#include"behaviac/common/file/filemanager.h"classBEHAVIAC_APIMyFileManager:publicbehaviac::CFileManager{public:BEHAVIAC_DECLARE_MEMORY_OPERATORS(MyFileManager);MyFileManager();virtual~MyFileManager();virtualbehaviac::IFile*FileOpen(constchar*fileName,behaviac::CFileSystem::EOpenMode iOpenAccess=behaviac::CFileSystem::EOpenMode_Read);virtualvoidFileClose(behaviac::IFile*file);virtualboolFileExists(constchar*fileName);virtualboolFileExists(constbehaviac::string&filePath,constbehaviac::string&ext);virtualuint64_tFileGetSize(constchar*fileName);virtualbehaviac::wstringGetCurrentWorkingDirectory();};

2. 根据自己的开发平台需要,实现相应的方法,这里只是简单的调用了基类的同名方法,仅用于演示流程,如下代码所示:

#include"myfilemanager.h"MyFileManager::MyFileManager(){}MyFileManager::~MyFileManager(){}behaviac::IFile*MyFileManager::FileOpen(constchar*fileName,behaviac::CFileSystem::EOpenMode iOpenAccess){// 需要实现自己的代码,这里直接调用基类的方法仅供演示returnCFileManager::FileOpen(fileName,iOpenAccess);}voidMyFileManager::FileClose(behaviac::IFile*file){CFileManager::FileClose(file);}boolMyFileManager::FileExists(constbehaviac::string&filePath,constbehaviac::string&ext){returnCFileManager::FileExists(filePath,ext);}boolMyFileManager::FileExists(constchar*fileName){returnCFileManager::FileExists(fileName);}uint64_tMyFileManager::FileGetSize(constchar*fileName){returnCFileManager::FileGetSize(fileName);}behaviac::wstringMyFileManager::GetCurrentWorkingDirectory(){returnCFileManager::GetCurrentWorkingDirectory();}

3. 在程序端初始化的地方,创建MyFileManager实例,如下代码所示:

boolInitBehavic(){LOGI("InitBehavic\n");g_MyFileManager=BEHAVIAC_NEWMyFileManager();behaviac::Workspace::GetInstance()->SetFilePath("../tutorials/tutorial_10/cpp/exported");behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_xml);returntrue;}

4. 调用Agent::btload()方法,就可以通过上面实现的MyFileManager来加载行为树文件了(Agent::btload()方法内部会执行到MyFileManager::FileOpen()方法),如下代码所示:

boolInitPlayer(){LOGI("InitPlayer\n");g_FirstAgent=behaviac::Agent::Create<FirstAgent>();boolbRet=g_FirstAgent->btload("FirstBT");g_FirstAgent->btsetcurrent("FirstBT");returnbRet;}

5. 在程序端结束清理的地方,销毁上面创建的MyFileManager实例,如下代码所示:

voidCleanupBehaviac(){LOGI("CleanupBehaviac\n");behaviac::Workspace::GetInstance()->Cleanup();if(g_MyFileManager){BEHAVIAC_DELETE(g_MyFileManager);g_MyFileManager=NULL;}}

C#版

1. 需要从behaviac.FileManager派生出自己的子类,并根据需要重载相关的方法,这里只是简单的调用了基类的同名方法,仅用于演示流程,如下代码所示:

publicclassMyFileManager:behaviac.FileManager{publicMyFileManager(){}publicoverride byte[]FileOpen(string filePath,string ext){// 需要实现自己的代码,这里直接调用基类的方法仅供演示returnbase.FileOpen(filePath,ext);}publicoverridevoidFileClose(string filePath,string ext,byte[]fileHandle){base.FileClose(filePath,ext,fileHandle);}}

2. 在程序端初始化的地方,创建MyFileManager实例,如下代码所示:

staticboolInitBehavic(){Console.WriteLine("InitBehavic");g_MyFileManager=newMyFileManager();behaviac.Workspace.Instance.FilePath="../../exported";behaviac.Workspace.Instance.FileFormat=behaviac.Workspace.EFileFormat.EFF_xml;returntrue;}

3. 调用Agent.btload()方法,就可以通过上面实现的MyFileManager来加载行为树文件了(Agent.btload()方法内部会执行到MyFileManager.FileOpen()方法),如下代码所示:

staticboolInitPlayer(){Console.WriteLine("InitPlayer");g_FirstAgent=newFirstAgent();boolbRet=g_FirstAgent.btload("FirstBT");Debug.Assert(bRet);g_FirstAgent.btsetcurrent("FirstBT");returnbRet;}

4. 在程序端结束清理的地方,释放上面创建的MyFileManager实例引用,如下代码所示:

staticvoidCleanupBehaviac(){Console.WriteLine("CleanupBehaviac");behaviac.Workspace.Instance.Cleanup();g_MyFileManager=null;}

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

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

26、OS X 脚本与 Shell 脚本游戏探索

OS X 脚本与 Shell 脚本游戏探索 1. OS X 脚本相关 1.1 ituneslist 脚本 运行脚本 :该脚本没有命令参数或标志。 运行结果 :如果音乐收藏较多,脚本输出可能很大。以下是运行 ituneslist | head -15 输出 Dave 音乐收藏前 15 行的示例: Your library is at /Users/t…

作者头像 李华
网站建设 2026/6/10 8:02:39

AutoGPT交叉销售推荐引擎

AutoGPT交叉销售推荐引擎 在电商平台的运营后台&#xff0c;一位产品经理刚刚提交了一个看似普通的目标&#xff1a;“为购买笔记本电脑的用户设计一套高转化率的配件交叉销售方案。”几小时后&#xff0c;系统自动生成了一份完整的策略报告——包含热销型号分析、竞品捆绑策略…

作者头像 李华
网站建设 2026/6/9 13:52:29

深度求索发布DeepSeek-Prover-V2:数学形式化证明领域的突破性进展

深度求索发布DeepSeek-Prover-V2&#xff1a;数学形式化证明领域的突破性进展 【免费下载链接】DeepSeek-Prover-V2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-Prover-V2-7B 在人工智能领域&#xff0c;数学形式化证明一直被视为衡量机器推…

作者头像 李华
网站建设 2026/6/10 6:08:36

33、基于云的实时服务器和Servlet架构:下载服务与Web客户端应用

基于云的实时服务器和Servlet架构:下载服务与Web客户端应用 1. 下载服务的Servlet实现 1.1 概述 为了实现根据特定样本数量 ‘N’ 或日期下载 .csv 文件的功能,我们需要实现几个不同的 Servlet 类。这些类通过从访问 Servlet 的 URL 中获取特定参数来工作,URL 调用将在后…

作者头像 李华
网站建设 2026/6/9 19:00:23

解锁手机摄像头的无限可能:DroidCam OBS插件实战攻略

解锁手机摄像头的无限可能&#xff1a;DroidCam OBS插件实战攻略 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin 还在为昂贵的直播设备望而却步&#xff1f;想要实现专业级直播效果却苦于…

作者头像 李华
网站建设 2026/6/10 6:08:00

包体积优化指南:3大策略让电商App轻松减重60%

你是否也遇到过这样的困扰&#xff1a;精心开发的电商App功能丰富、界面精美&#xff0c;但安装包体积却像吹气球一样膨胀到80MB以上&#xff1f;数据显示&#xff0c;包体积每增加10MB&#xff0c;用户下载转化率就会下降约15%。本文将以Dart Simple Live项目为例&#xff0c;…

作者头像 李华