行为树概念

行为树主要采用4中节点(在行为树中,“节点”也称为“任务”)来描述行为逻辑,分别是顺序节点、选择节点、条件节点、行为节点。每一棵行为树表示一个AI逻辑,需要从根节点开始遍历执行整棵树。遍历执行的过程中,父节点根据自身的类别,确定需要如何执行、执行哪些子节点并继而执行,子节点执行完毕后,会将执行结果返回给父节点。

节点从结构上分为两类:组合节点、叶节点。所谓组合节点就是树的中间节点,例如顺序节点和选择节点都是组合节点;

叶节点包含两种类型的节点,分别是条件节点和行为节点
1,条件节点可以理解为if条件测试,用来测试当前是否满足某些性质或条件
如果条件测试为真,那么向父节点返回success,否则返回failure
2,行为节点用来完成实际的工作,例如播放动画、规划路径、让角色移动位置、感知敌人。在执行这种节点,可能只需要一帧就可以完成,也可能需要多帧才能完成。
绝大部分动作节点会返回success

中间节点是由组合(Composite)节点组成的,组合节点用来控制树的遍历方式,最常用的组合节点有选择节点、顺序节点、并行节点、修饰节点等

(1) 选择节点(selector)
在这里插入图片描述

选择节点有时也称为优先级Selector节点,它会从左到右依此执行所有子节点,只要子节点返回failure,就继续执行后续子节点,直到有一个节点返回success或running以外,他还会“记住”返回running的这个子节点,下次迭代会直接从该节点开始执行

子节点返回success很容易理解,当有的行为节点对应的代码执行较长,例如:播放动画,此时,这个行为节点会向父节点返回running,于是选择节点便不再执行后续节点,直接向父节点返回running。
(2) 顺序节点(Sequence)
在这里插入图片描述

顺序节点他会从左到右依次执行所有子节点,只要子节点返回success,他就会继续执行后续子节点,直到有一个节点返回failure或running为止,这时他会停止后续子节点的执行,向父节点返回failure或running

与选择节点相似,当子节点返回running时,Sequence节点除了中止后续节点的执行,向父节点返回running以外,它还会“记住”返回running的这个子节点,下个迭代会直接从该节点开始执行。

如果某个顺序节点有一个条件子节点,那么假设这个条件不满足,则其他子节点不再执行

顺序节点通常用来表示一系列需要顺序执行的任务。

(3) 随机选择节点
在这里插入图片描述

事实上,前面提到的“选择节点”是隐含了优先级的,它的最左边的子节点具有最高的优先级,最右优先级最低

而对于随机选择节点,与选择节点不同的是,它不是永远按照从左到右的顺序执行,而是随机选择执行。

例如:AI角色每天会根据自己的心情选择是呆在家里、工作或是出门游玩,可以采用随机选择节点

(4) 修饰节点(decorator)
在这里插入图片描述

修饰节点只包含一个子节点,用于以某种方式改变这个子节点的行为。

修饰节点有很多种,其中有一些是用于决定是否允许子节点运行的,这种修饰节点有时也称为过滤器,例如Until Success,Until Fail等。Until Success的行为是这样的:循环执行子节点,直至子节点返回success为止。更具体地说,如果子节点返回running,那么它像父节点返回running,如果子节点返回failure,依旧向父节点返回running,直到子节点返回success时,向父节点返回success。

例如:一个Until Success的子节点是一个条件节点,检测“视线中是否有敌人”,那么在这个修饰节点的作用下,会不停地检测“视线中是否有敌人”,直到发现敌人为止

Limit节点用来限制子节点运行的次数,例如连续运行的次数小于3,子节点返回(success或则running),如果大于3,则不在运行向父节点返回failure。假设AI破门而入尝试3次,3次依旧没有成功,则放弃返回

Timer节点设置了一个计时器,它不会立即执行子节点,而是等待一段时间,时间到时才开始执行子节点

TimeLimit节点用于指定某个子节点的最长运行时间。如果子节点的运行时间超出某个预先指定的值,那么取消子节点的运行,向父节点返回failure

(5) 并行节点(Parallel)
在这里插入图片描述

并行节点有多个子节点,与顺序节点不同的是,这些子节点的执行是并行的,不是一次纸执行一个,而是同时执行,知道其中一个返回failure(或全部返回success)为止。此时,并行节点向父节点返回failure或success,并终止其他所有子节点的执行。

当某个并行节点有一个条件子节点时,一般是持续地检查某个条件是否满足,如果不满足,终止其他子节点的执行。

行为树与FSM的权衡:
(1) 对于状态机来说,每个时刻它都处于某种“状态”中,等待某个事件(转换)的发生。如果事件没有发生,那么继续保持在这个状态;如果事件发生,那么转换到其他状态,本质上,状态机是“事件驱动”的,即周围游戏世界发生的“事件”驱动角色的“状态”变化。从实现上来看,状态机既可以采用轮询的方式实现,也可以采用事件驱动的方式实现
(2) 对于行为树,处理周围游戏世界发出某种“询问”,以这种方式来监视游戏世界发生的事情。因此,这实际上是“轮询”的方式----不断地主动查询。虽然目前已经有一些高级的技术,能够将事件驱动集成在行为树中,但在实现中,绝大多数行为树都是自顶向下采用轮询的方式实现
(3) 一般来说,行为树不太适合表示需要事件驱动的行为。例如,AI角色需要对大量外部事件做出反应----当AI角色正在向某个目标移动,突然发生某个事件,如同伴需要救援、玩家死亡,需要立即终止这个移动过程,重新做出决策。通过并行节点和修饰节点结合能够处理这种情况。不过,在遇到这种情形的时候,还是应该在状态机或行为树之间好好做一下权衡

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值