每个行为树都只有一份单独的数据作为资源被加载。

每个使用行为树的对象(Agent)依据这个共享的资源创建独立的实例数据,例如对于Sequence节点,实例数据中只是存储更新到哪个子树,至于Sequence节点的配置信息等则被共享。

memory_shared


  • 加载行为树请使用Workspace::LoadAgent::btload
  • 卸载行为树请使用Workspace::UnLoadAgent::btunload
  • Workspace::CreateBehaviorTreeTask用来根据加载的行为树资源创建实例数据,而它配套的是Workspace::DestroyBehaviorTreeTask
  • 一般情况下,不需要显式调用Workspace::CreateBehaviorTreeTaskWorkspace::DestroyBehaviorTreeTask
    • 初始化的时候调用Workspace::LoadAgent::btload加载可能会用到的行为树
    • 游戏循环的时候,根据需要,调用Agent::btsetcurrent指定该Agent当前的行为树,后续Agent::btexec更新的就是当前行为树,除非再次调用Agent::btsetcurrent修改当前行为树
    • 退出的时候,调用Workspace::UnLoadAgent::btunload,或Workspace::UnLoadAll卸载行为树资源。而行为树实例是在Agent::btsetcurrent的时候被创建的,释放Agent的时候被Agent负责释放
  • C#代码是同名类型里的同名函数,如Workspace.LoadAgent.btload

3 thoughts on “共享资源和实例数据

  1. 我在所有的tutorials中都没有看到过Agent::btunload这个函数被调用过,什么时候需要调用这个btunload?
    是否在同一个agent实例多次加载不同的行为树前需要先btunload一下,
    而在销毁agent的时候无需做这个btunload的操作,agent::destroy会自动进行btunload?

    1. 对的。一般情况,不需要显示的调用btunload。如果还有相应问题,可以去bbs.behaviac.com提问哈。

  2. 共享的配置信息,对于在不同线程执行Agent的btexec处理,是否有线程安全问题?是否有线程锁保护?

    “每个使用行为树的对象(Agent)依据这个共享的资源创建独立的实例数据,例如对于Sequence节点,实例数据中只是存储更新到哪个子树,至于Sequence节点的配置信息等则被共享。”

jonygli进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注