欢迎光临散文网 会员登陆 & 注册

C++实现行为树

2023-02-23 22:06 作者:xhy2023  | 我要投稿

基本概念

行为树,英文是Behavior Tree,简称BT,是由行为节点组成的树状结构,每个节点的执行都有一个结果(成功Success,失败Failure或运行Running)。节点从结构上分为两类:组合节点、叶节点,组合节点才有子节点,即出度可以大于0的节点,叶节点一般用来放置执行逻辑和条件判断。

  1. 序列(Sequence)节点:组合结点,顺序执行所有子节点,如果子节点全部执行成功,返回成功。如果某个子节点失败则返回失败,且不再执行下一个子节点。

  2. 选择(Selector)结点:组合结点,顺序执行所有子节点,只要碰到一个子节点返回成功,则返回成功,否则继续执行下一个。如果子结点全都执行失败,则返回失败。(每个节点是或关系)

  3. 并行(Parallel)结点:组合结点,并行其下所有子节点,所有节点成功则返回成功(有任意子节点失败则失败)。(每个节点是与关系)

  4. 条件(Condition)节点:叶子结点,根据条件的比较结果,返回成功或失败。

  5. 动作(Action)节点:叶子结点,根据动作结果返回成功,失败,或运行。

  6. 等待(Wait)节点:叶子节点,当指定的时间过去后返回成功。

  7. 循环(Loop)节点:叶子节点,循环执行子节点到指定次数后返回成功,如果循环次数为-1,则无限循环。

比如我们要实现这个行为:如果碰到主角,打招呼;否则,睡觉。

通过Json建立行为树

输入使用Json格式。Json整体是一个字典,value的类型有以下三种类型:

  1. 标量(scalar):也就是一个单独的字符串或数字。

  2. 序列(sequence):也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List)。

  3. 映射(mapping):也就是一个key/value对,即字典。这个就是嵌套形式了,因为Json本身就是一个字典,字典内继续包含字典。

Json的书写规则如下:

  1. 并列的数据之间用逗号(",")分隔。

  2. 映射用冒号(":")表示。

  3. 并列数据的集合(数组)用方括号("[]")表示。

  4. 映射的集合(对象)用大括号("{}")表示。

下面举一个由输入Json来构建行为树的例子,每个字典就是一个节点(Node)。执行效果是车辆先播放音乐,然后右转,然后停下来。

1. 节点定义

1)btNode.h代码

2)btNode.cpp代码

2. 生成结点的工厂类实现

这里可以不需要用工厂类,因为每个实例工厂并没有特别的流程,创建节点的方式都一样,即包含两步:1)new一个指定节点。2)加载json。但是使用工厂类可以更方便地管理所有的节点类型。

3. 组合结点类型

继承BtNode,是组合结点类型的基类,如parallel、selector、sequence等需要继承这个类,而叶子结点类型只需要继承BtNode类。

1)BtGroupNode.h代码

2)BtGroupNode.cpp代码

4. parallel并行节点

1)BtParallelNode.h代码

2)BtParallelNode.cpp代码

5. action动作节点

1)BtActionNode.h代码

2)BtActionNode.cpp代码


C++实现行为树的评论 (共 条)

分享到微博请遵守国家法律