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

behaviac设计上的局限性

0 喜欢 0 不喜欢
909 浏览

你好,首先引用http://gad.qq.com/article/detail/5883中的一段

"一棵行为树首先需要设置一个Agent类型,Agent也就是游戏中的AI角色。在这棵行为树中的所有节点(主要是叶子节点),可以进一步选择Agent的属性、方法以及其他变量等进行配置。这些Agent的类型、属性、方法等信息,称之为元信息,后文会更详细的对其进行介绍。"

问题是直接在根节点上设置Agent类型,那么就表明这棵行为树是用来控制这个Agent实例的。

那么对于同时控制两个或三个不同的类型的Agent实例进行协作的行为,那又该把哪个Agent设置为根类型呢?

所以,为什么不在动作节点需要控制Agent实例的时候存取Agent实例呢?

这样的行为树就更广义了,而不是局限于单一的对象实例。

最新提问 7月 27, 2016 用户: qq_5746b573d509b (230 分)

你好,你这个问题解决了吗?我也遇到相同的问题,我有好几个状态机,然后每个里面都有行为树引用,每个行为树的叶节点只能选择不同的状态机的属性和方法,而不能选择基类的属性和方法。这样当我需要加一个通用的方法的时候,就需要在每个状态机的基类中都加上该方法,而不能通过增加一个新基类来做。

状态机BehPlayerFrontAI状态机叶节点可选项

1个回答

0 喜欢 0 不喜欢
这个你理解错了,在根节点上设置的是Agent类型,而不是实例,同一个行为树可以用于相同Agent类型的任意多个实例。行为树只是一份资源,加载进来给Agent实例用的时候,这个行为树也会被实例化为行为树的实例,这样这个行为树的实例跟着一个Agent的实例走的。

可以这样打个比方,你编辑的一个行为树(假设名字为btExample),就相当于写了一个函数,该函数的返回值是EBTStatus枚举类型(包括Success/Failure/Running),入口参数是你实现的子类ChildAgent指针,如下所示:

EBTStatus btExample(ChildAgent* self) // ChildAgent就是在行为树根节点选的Agent类型
{
    if (...)
    {
        return self->method(); // self就是行为树编辑时的Self
    }
    else
    {
        return otherInstance->method(); // otherInstance是注册的其他全局Agent实例
    }

    return Success;
}
最新回答 7月 28, 2016 用户: cainhuang (33,810 分)
修改于 7月 28, 2016 用户:cainhuang
那对于多个不同类型的呢?谁又该是根呢?

建议参考下魔兽和星际的编辑器中的触发器模块,虽然名字不叫行为树,但是功能差不多。

也就是行为与实例分离。
多年前行为树的概念刚提出的时候,我的想法和你的一样,也开发了一个行为树的库,也是把需要控制的Agent作为树的根。但是现在想想这是不对的,试想一下,一个并行执行的节点和根Agent有什么关系呢?只有到具体的行为节点时才需要依赖根Agent(也可能是其他类型的Agent)。
...