• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱
欢迎来到 behaviac Q&A。 您在bbs里的问题,管理员会当下就收到通知,不要担心管理员看不到您的问题。也请在bbs里提供您的email,这样就可以第一时间收到关于回答,评论的email的通知了。 为了节省大家的时间,请表达好你的问题,提供必要上下文,版本号,平台信息,重现步骤等。

一个行为树作为另一个行为树的子节点的时候,如何设置这棵子行为树的返回类型

0 喜欢 0 不喜欢
1,757 浏览
如题,一个树作为另一棵树的子节点的时候。到底是直接替换了当前的行为树,还是只是作为一个子节点,执行完返回一个结果而已。有没有想过的文章讲诉。
最新提问 3月 21, 2016 用户: zy735310102 (500 分)

1个回答

0 喜欢 0 不喜欢

可以体会这一段:http://www.behaviac.com/docs/zh/articles/concepts/#section-5

行为树的基本概念:

  • 执行每个节点都会有一个结果(成功,失败或运行)
  • 子节点的执行结果由其父节点控制和管理
  • 返回运行结果的节点被视作处于运行状态,处于运行状态的节点接下来被直接运行

所以作为子树,它每次运行实际上都有一个状态(成功,失败,或者运行),不需要你显式的去设置!

一个树作为另一棵树的子节点的时候。并非替换了当前的行为树,而是作为一个子节点,执行完返回一个结果,然后其父节点根据这个返回的结果决定接下来的逻辑。

 

最新回答 3月 21, 2016 用户: jonygli (57,510 分)
那如果我想切换行为树的话,是需要我自己手动去切换是吧
目前子树节点只接受固定的子树。

计划中会添加一个功能就是允许调用一个函数动态的选择不同的子树。

 

目前你可以在一个Selector节点中添加子树节点,结合条件或前置来实现动态。
我现在的需求是,如果一个棵树包含了某一棵子树,如果一旦达到执行条件,就切换到该子树上面去,而之后不再重复执行包含它的树,也就是替换。

“在一个Selector节点中添加子树节点,结合条件或前置来实现动态”,按照现在的机制,子树也只是返回一个结果,返回结果后每次还是得从父节点开始执行,这样效率明显不高。感觉还是手动增加个切换行为树的功能会好些。

这样子的话,可以使用事件。

http://www.behaviac.com/docs/zh/tutorials/tutorial11_event/#section-3

不过,具体你的问题,更好的办法是调用自己的一个函数来切换子树。

可以在附带的例子中搜索switchRef

  behaviac::EBTStatus switchRef(const behaviac::string& refTree)
    {
        this->btreferencetree(refTree.c_str());

        return behaviac::BT_RUNNING;
    }

 

btw,我们后续的计划会加上这样的节点的。

...