行为树原理简介

行为树原理简介

本篇博客整理总结自行为树(Behavior Tree)详细介绍

前言

首先需要说明的是行为树和状态机都是实现游戏AI的一种手段,二者各有利弊。相对于行为树,经典状态机实现起来更简单,且执行效率更高,但是随着状态数量的增加,状态机的结构将会向着不可控的方向发展。而经典行为树则是使用起来结构更加清晰,对于复杂AI的开发效率更高,但是实现起来复杂,且执行效率较低。所以说二者各有千秋。不过现在行为树已经逐渐成为游戏AI开发的主流,具体原因可以看由赖勇浩翻译的《有限状态机时代终结的10大理由》这篇博客。这里不过多赘述。如果你使用FSM进行过游戏开发,对于博客中提到的关于FSM的弊端你真的会在赞成不过了。

概念

行为树是决策树的一种,是控制AI实体决策流程的分层节点树。行为树由行为节点构成,细分可以将行为节点分为三大类:复合节点,装饰器节点,叶子节点。这三类节点都有一个共同的功能——可以向父节点返回当前节点状态。当前节点状态也可以称之为行为状态,经典实现中有成功,失败,运行中三个行为状态。前两个状态通知其父节点其操作是成功还是失败。第三种意味着尚未确定成功或失败,并且该节点仍在运行。下次树被选择时,该节点将再次被选择,此时它将再次有机会成功,失败或继续运行。

复合节点

复合节点是可以具有一个或多个子节点的节点。他们将根据所讨论的特定复合节点以先后顺序或随机顺序处理这些子项中的一个或多个,并且在某个阶段将认为其处理已完成并将子节点的成功或失败传递给其父项。在处理子项期间,他们将继续将“运行”返回给父项。

最常用的组合节点是**顺序(Sequence)**节点,也叫做与节点,它仅按顺序运行每个子节点,在任何一个子节点失败的点返回失败,如果每个子节点返回成功状态,则返回成功。

装饰器节点

装饰器节点可以具有子节点。与复合节点不同,它们特定地只能有一个子节点。它们的功能是根据装饰节点的类型,从子节点的状态转换接收到的结果,终止子节点,或重复对子节点的处理。

装饰器的一个常用示例是取反(Inverter),它将简单地反转子级的结果。子代失败,它将成功返回给其父级,或者子代成功,它将失败返回给父级。合理使用取反装饰器可以提高行为树的节点复用率。

叶子节点

叶节点是最低级别的节点类型,不能有任何子级。叶节点是最强大的节点类型,因为它用于行为的定义和实现,以进行特定的功能测试或者使行为树实际起到有用动作的作用。

通常叶子节点会被分为两个部分:分别是条件节点和动作节点,其中条件节点可以将其理解为一条if语句,主要用于判断与其绑定的动作节点是否可以执行,作为动作节点的先决条件存在。通常二者是独立的。

复合节点

顺序节点

顺序节点也称为与节点,该节点会顺序访问其下的子节点,如果序列中直到最后一个子级成功,则该序列将成功返回给其父级;如果有任意一个子节点返回失败或者运行中,则该节点就会向他的父级返回对应的状态。序列最明显的用法是定义必须全部完成的任务序列,而如果其中一项失败,则意味着对该任务序列的进一步处理变得多余。

在这里插入图片描述

上图我们举了一个关于顺序节点的例子:

这里顺序节点的子节点们可以很明显的看出是一个任务序列,当AI走向门成功了才会去尝试打开门,打开门成功了才会去尝试进入门,以此类推。如果中间有一个节点失败了,比如AI没有成功的打开门,则后面的进入门和关闭门就没有必要执行了,对于AI来说这个任务序列就是失败的,序列返回失败,然后序列的父级可以正常处理失败。

选择节点

选择节点也称为或节点,该节点同样会顺序访问其下的子节点,如果序列中有一个子级成功或者是运行中的状态,则该节点将成功或者运行中返回给其父级;如果序列中直到最后一个子级失败了,则该序列向父级返回失败

在这里插入图片描述

上图我们结合顺序节点和选择节点对打开门这个事件节点做了拓展:

情景1:当我们的游戏AI走向门时,AI会先寻找钥匙,如果找到钥匙并用钥匙打开了门则顺序节点返回成功给选择节点,选择节点返回成功,AI继续向下执行进入和关闭门的事件。

情景2:AI没有找到钥匙,或者钥匙不能打开这个门,则顺序节点会返回失败,选择节点会继续尝试之后的拉开门和破门而入。

所以从这里就可以看出选择节点,顾名思义,就是有若干个执行方案,只要有一个成功了就可以。

经过顺序节点和选择节点的组合,我们就已经可以自己设计出非常复杂的游戏AI逻辑了,但是这里还有一些装饰器节点和自定义节点可以为我们的配置工作更加轻松高效。

装饰器节点

装饰器节点的使用和复合节点是一致的,只不过装饰器节点下只可以有一个子级。下面会介绍一些常用的装饰器节点。

取反节点

取反器将反转或否定其子节点的结果。成功变成失败,失败变成成功。它们最常用于条件测试中。之前说过善用取反节点可以帮助我们提升节点的复用率,下面我们来举一个例子来感受一下取反节点的强大之处:

在这里插入图片描述

这里我们简单制作了一个小松鼠觅食的AI逻辑:小松鼠一开始会寻找坚果,如果找到了坚果,小松鼠就会判断周围有没有捕食者,如果没有就开始进食。这里如果我们不使用取反装饰器,这我们就需要多增加一个周围不存在捕食者的判断,但是现在我们通过使用取反装饰器进行组合就可以达到我们想要的效果。

成功节点

无论子节点实际返回了什么,后继者都将始终返回成功。如果在一个顺序节点下有一个子级存在失败的可能且我们不希望这个顺序节点因为这个子级的失败而中途返回,我们就可以为这个子级嵌套一个成功装饰器,以保证之后的子级可以正常执行。

在这里插入图片描述

还是小松鼠觅食的例子,现在我们假设我们的小松鼠非常的贪吃,就算周围存在捕食者,我们的小松鼠也要坚持把坚果吃掉,则我们就可以在原有的基础上加一个成功器来实现这个逻辑。

重复节点

每当子节点返回一个结果时,重复器将重新处理它的子节点。这些通常用于树的最底部,使树能够连续运行。重复器可以选择在返回到它们的父节点之前运行它们的子节点一定次数。

重复直到失败节点

就像重复器一样,这些装饰器将继续对其子级进行重新处理。直到子级最终返回失败,然后重复器将成功返回给其父节点。

重复直到失败节点

就像重复器一样,这些装饰器将继续对其子级进行重新处理。直到子级最终返回失败,然后重复器将成功返回给其父节点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值