news 2026/6/23 22:39:22

教程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/23 22:01:24

30、图像魔法棒:ImageMagick实用脚本指南

图像魔法棒:ImageMagick实用脚本指南 1. 水印添加脚本 在处理图像时,为图片添加水印是一项常见的需求。下面是一个使用 ImageMagick 实现水印添加的脚本示例: newfilename="$prefix+wm.$suffix" x composite -dissolve 75% -gravity south $wmfile "$1&q…

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

百度网盘极速下载:3步告别龟速等待的实用指南

百度网盘极速下载&#xff1a;3步告别龟速等待的实用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度而烦恼吗&#xff1f;想要实现百度网盘极速…

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

28、网络数据分类与回归分析技术详解

网络数据分类与回归分析技术详解 1. 引言 在网络数据分析领域,分类和回归是两种重要的技术手段。分类可用于确定网络参数所属的类别,而回归则能预测特定变量在未来某个时间点的值。本文将详细介绍基于KNN、多层感知器(MLP)的分类方法,以及基于滑动窗口的多元线性回归(M…

作者头像 李华
网站建设 2026/6/23 8:55:56

Unity反向遮罩技术深度解析与应用实践

Unity反向遮罩技术深度解析与应用实践 【免费下载链接】UIMask Reverse Mask of Unity "Mask" component 项目地址: https://gitcode.com/gh_mirrors/ui/UIMask 在Unity用户界面开发领域&#xff0c;遮罩技术作为视觉呈现的重要工具&#xff0c;其功能特性直接…

作者头像 李华
网站建设 2026/6/23 5:03:28

多模态大模型新突破:Janus-Pro-7B重构跨模态理解与生成范式

在人工智能多模态交互领域&#xff0c;DeepSeek团队于2025年1月28日正式发布的Janus-Pro-7B模型引发行业高度关注。这款基于70亿参数构建的多模态大模型&#xff0c;通过创新的自回归框架设计&#xff0c;成功实现了视觉理解与图像生成能力的深度融合&#xff0c;为下一代智能交…

作者头像 李华
网站建设 2026/6/22 20:38:54

13、系统管理:用户管理脚本实用指南

系统管理:用户管理脚本实用指南 在系统管理中,管理用户和磁盘空间是非常重要的任务。本文将介绍一些实用的脚本,帮助你更好地管理磁盘配额、查看磁盘使用情况以及实现安全的文件查找功能。 1. 磁盘配额管理脚本 1.1 fquota 脚本 fquota 脚本用于检查用户的磁盘使用情况…

作者头像 李华