行为树 Behavior Tree C#实现 二

行为树 Behavior Tree C#实现 二

前篇介绍了 行为树 Behavior Tree 的原理。
本篇通过前篇原理构思 Behavior Tree 程序设计

1、节点类型枚举
节点类型通过枚举列举
组合节点和修饰节点每一种需要具体的枚举值

子树节点使用一个枚举值

叶子节点:
所有行为节点 共用一个枚举类型
所有条件节点 共用一个枚举类型

2、节点执行结果枚举
定义返回结果枚举值 Fail、Success、Running

3、添加 抽象节点 AbstractNode
抽象节点包含抽象函数:
OnEnter() 开始执行函数
Execute() 执行中函数
OnExit() 退出执行函数

三个函数的执行顺序
执行当前节点
(3.1) 如果节点未开始执行,调用 OnEnter 函数
(3.2) 调用 Execute() 函数,并记录返回结果 resultType
(3.3) 如果 resultType 不等于 Running,调用 OnExit() 函数,并标记节点未开始执行

4.添加组合节点抽象类NodeComposite 继承 AbstractNode
组合节点需要添加子节点,所以加入子节点列表和添加子节点的方法

   protected List<NodeBase> nodeChildList = new List<NodeBase>();

下方各个组合节点具体类,分别实现,并都继承 NodeComposite
选择节点 NodeSelect 继承 NodeComposite、
顺序节点 NodeSequence 继承 NodeComposite、
随机选择节点: NodeRandomSelect 继承 NodeRandom、
随机顺序节点: NodeRandomSequence 继承 NodeRandom、
随机权重节点 :NodeRandomPriority 继承 NodeRandom、
并行节点 NodeParallel 继承 NodeComposite、
并行执行所有节点: NodeParallelAll 继承 NodeComposite、
if 判断并行节点 :NodeIfJudgeParallel 继承 NodeIfJudge、
if 判断顺序节点 :NodeIfJudgeSequence 继承 NodeIfJudge

5.添加修饰节点抽象类 NodeDecorator 继承 NodeComposite
修饰节点取反 :NodeDecoratorInverter 继承 NodeDecorator、
修饰节点重复 :NodeDecoratorRepeat 继承 NodeDecorator、

修饰节点_返回固定结果抽象类 NodeDecoratorReturnConst 继承 NodeDecorator
修饰节点_返回 Fail :NodeDecoratorReturnFail 继承 NodeDecoratorReturnConst、
修饰节点_返回 Success: NodeDecoratorReturnSuccess 继承 NodeDecoratorReturnConst、

修饰节点:一直执行,直到达到条件 抽象类 NodeDecoratorUntil 继承 NodeDecorator
修饰节点_直到 Fail : NodeDecoratorUntilFail 继承 NodeDecoratorUntil、
修饰节点_直到 Success: NodeDecoratorUntilSuccess 继承 NodeDecoratorUntil

6.添加子树类 NodeSubTree
继承 NodeComposite,因为子树也是组合节点

7.添加子节点抽象类 NodeLeaf
继承 AbstractNode

8.添加 行为节点抽象类 NodeAction 并继承 NodeLeaf
自定义添加的行为节点继承 NodeAction

9.添加 条件节点抽象类 NodeCondition 并继承 NodeLeaf
自定义添加的条件节点继承 NodeCondition

10.添加一个将单个配置文件解析为行为树结构的类
根据配置文件的节点类型,实例化具体类,根据节点的父子关系,将子节点添加给父节点
行为节点和条件节点配置的参数和条件组需要从配置文件添加到行为节点和条件节点

11.行为树执行需要拿到跟节点(入口节点)
所以解析出来的行为树,需要拿到跟节点的实例
(11.1)每一帧执行 调用行为树 跟节点
(11.2)跟节点遍历它的子节点,并调用子节点
(11.3)子节点再遍历它自己的子节点,并调用子子节点

直到没有子节点为止 返回 (11.1)
在这里插入图片描述
注意:上面的遍历子节点并执行子节点是深度优先遍历
这样 深度优先遍历了 整棵树,并驱动行为树逻辑。
如上图
(1) 外部每帧调用跟节点 1
(2) 节点 1 调用 节点 2
(3) 节点2 调用 节点 3,节点 3 没有子节点了,节点 3 向节点 2 返回 节点 3 的执行结果
(3) 如果节点2 根据节点3 执行结果判断,需执行下一个节点4,继续执行 (4),否则跳转到 (5)
(4) 则调用节点4,节点4没有子节点了,则向节点 2 返回执行结果
(5) 节点2 已没有下一个可执行节点了,节点2向节点1返回执行结果
(6) 如果节点1 根据节点2执行结果判断,需执行下一个节点5,继续执行 (7),否则跳转到 (11)
(7) 节点5 调用节点 6,节点 6 没有子节点了,节点6 想节点5 返回节点6的执行结果
(8) 如果节点5根据节点6执行结果判断,不需执行下一个节点7,跳转到(9), 否则继续执行 (10)
(9 )则调用节点7,节点7没有子节点了,则向节点5返回执行结果
(10) 节点5 已没有下一个可执行节点了,则节点5想节点1返回执行结果
(11) 节点 1 返回结果

下篇将实际运用该代码以测试其功能逻辑

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值