行为树的概念以及在游戏中的应用

1.行为树的概念

行为树(behavior tree)是一种树状的数据结构,树上的每一个节点都是一个行为(节点必须包含函数)。每次调用会从根节点开始遍历,通过检查行为的执行状态来执行不同的节点。行为树也是一种逻辑模型,概念最早来源halo(光晕)这款游戏里的ai控制结构,它通过树形结构来选择当前环境下应该做出的具体行为。由于这种控制结构在配置、调试、复用之上的便利,行为树的使用也逐渐成为了现在游戏的主流AI配置方式。

2.行为树的示例图

3.行为树的节点类型

节点返回值:每个类型的节点均需要返回true/false/running,来向父节点报告执行成功/失败/进行中,返回值用于控制整棵树中节点的执行顺序。

节点类型:节点根据作用可分为4种类型(其中有的可省略):组合节点,动作节点,装饰节点,条件节点。

3.1 组合节点(Composite Node,必选)

组合节点不执行具体功能任务,只处理子节点访问逻辑,按组合性质还可以细分为以下3种,并且可以根据需求进行扩展。

3.1.1 顺序节点(Sequence Node)
顺序节点(Sequence),它从左向右依次执行所有节点,只要节点返回true,就继续执行后续节点,当一个节点返回false或 Running时,停止执行后续节点。向父节点返回 false 或 Running,只有当所有节点都返回 true 时,才向父节点返回 true。这种性质和与门(AND)是一致的。次序节点有很多的用处,其中最常用的做法是 执行一连串有前后依存关系的行为,其中一个的失败必然导致后续的动作没有进行的意义。

3.1.2 选择节点(Selector Node)

选择节点遍历方式为从左到右依次执行所有子节点,只要节点返回 false,就继续执行后续节点,直到一个节点返true或Running为止,停止执行后续节点。如果有一个节点返回true或Running则向父节点返回true或Running。否则向父节点返回 false。选择节点其实可以被理解为一个或门(OR)。它的主要作用在于它可以用来表示一个行为的多种方式,从最高优先级到最低,任何一个方式的成功都会让这个动作成功。

3.1.3 平行节点(Parallel Node)

平行节点每次执行所有节点,直到一个节点返回false或者全部返回true为止,此时并行节点向父节点返回false或者 true,并终执行其他所有节点。否则至少有一个节点处于 Running 状态,则执行完所有节点向父节点返回Running。
 

3.2 动作节点(Action Node,必选,叶节点)

动作节点执行具体的功能任务,必须为叶节点,不可省略,需要定制。

3.3 装饰节点(Decorator Node,可选)

装饰节点根据需求是可省略的,其不能为叶节点,且只能有一个子节点,子节点的类型必须为动作节点;装饰节点将它的子节点执行后返回的结果做额外处理后(比如结果取反,或根据需要做其他处理),再返回给它的父节点。修饰节点常用的几个类型如下:
Inverter 对子节点执行结果取反
Repeater 重复执行子节点 N 次
Return true 执行到此节点返回失败
Return false 执行到此节点返回成功
Unitl false 直到失败,一直执行子节点
Until true 直到成功,一直执行子节点

3.4 条件节点(Condition Node,可选,叶节点)

条件节点必须为叶节点,需要定制,只做条件判断,不执行实际功能,可根据需求省略。

通过上述的各种节点几乎可以实现所有的流程控制:if, while, and, or,not, counter, time, random, weight random,

行为树的节点可根据游戏的需求自行设计,灵活增加或减少。

4.行为树的驱动方式

以手游的战斗场景应用行为树为例,行为树在战斗循环中创建并发起对根节点的访问。每间隔数帧执行一次,以60帧率为例,通常2-8帧执行一次。如果执行间隔过小,则行为树执行会多占用cpu。所以在标准行为树模型里面,如何动态的选择执行间隔是优化的重点。

5.行为树的优点

5.1 静态性
静态性直接带来的好处就是整棵树的规划无需再运行时动态调整,大大方便设计人员和编程人员,并且减少bug,同时这也为很多优化带来方便。

5.2 直观性
行为树可以方便地把复杂的AI知识条目组织得非常直观。
默认的组合节点处理子节点的迭代方式就像是处理一个预设优先策略队列,也非常符合人类的正常思考模式:先最优再次优。
此外,行为树编辑器对优秀的程序员来说也是唾手可得。

5.3 复用性
各种节点,包括叶子节点,可复用性都极高。

5.4 扩展性
可以容易地为项目量身定做新的组合节点或修饰节点。还可以积累一个项目相关的节点库,长远来说非常有价值。

6.行为树的实现

重点实现3个模块:

6.1 行为树管理类(1个,由战斗循环中创建,作用是新建行为树,发起对根节点访问)

6.2 组合节点类(3-6个)

6.3 动作节点类(大量)

参考腾讯开源项目行为树示例:https://github.com/Tencent/behaviac

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值