每个行为树都只有一份单独的数据作为资源被加载。
每个使用行为树的对象(Agent)依据这个共享的资源创建独立的实例数据,例如对于Sequence节点,实例数据中只是存储更新到哪个子树,至于Sequence节点的配置信息等则被共享。
- 加载行为树请使用
Workspace::Load
或Agent::btload
- 卸载行为树请使用
Workspace::UnLoad
或Agent::btunload
Workspace::CreateBehaviorTreeTask
用来根据加载的行为树资源创建实例数据,而它配套的是Workspace::DestroyBehaviorTreeTask
- 一般情况下,不需要显式调用
Workspace::CreateBehaviorTreeTask
和Workspace::DestroyBehaviorTreeTask
- 初始化的时候调用
Workspace::Load
或Agent::btload
加载可能会用到的行为树 - 游戏循环的时候,根据需要,调用
Agent::btsetcurrent
指定该Agent当前的行为树,后续Agent::btexec
更新的就是当前行为树,除非再次调用Agent::btsetcurrent
修改当前行为树 - 退出的时候,调用
Workspace::UnLoad
或Agent::btunload
,或Workspace::UnLoadAll
卸载行为树资源。而行为树实例是在Agent::btsetcurrent
的时候被创建的,释放Agent的时候被Agent负责释放
- 初始化的时候调用
- C#代码是同名类型里的同名函数,如
Workspace.Load
和Agent.btload
我在所有的tutorials中都没有看到过Agent::btunload这个函数被调用过,什么时候需要调用这个btunload?
是否在同一个agent实例多次加载不同的行为树前需要先btunload一下,
而在销毁agent的时候无需做这个btunload的操作,agent::destroy会自动进行btunload?
对的。一般情况,不需要显示的调用btunload。如果还有相应问题,可以去bbs.behaviac.com提问哈。
共享的配置信息,对于在不同线程执行Agent的btexec处理,是否有线程安全问题?是否有线程锁保护?
“每个使用行为树的对象(Agent)依据这个共享的资源创建独立的实例数据,例如对于Sequence节点,实例数据中只是存储更新到哪个子树,至于Sequence节点的配置信息等则被共享。”