行为树的理解和学习

  • 格式:pdf
  • 大小:142.27 KB
  • 文档页数:3

⾏为树的理解和学习

最近打算好好研究⼀下⾏为树,在使⽤⾏为树之前,我们应该先理解⾏为树的基本概念和相关的逻辑,然后我们就Unity3D平台下的⾏为树

插件的使⽤来进⾏学习⾏为树。

什么是⾏为树

如果了解过状态机,会知道在⾏为树之前,在实现AI⽤得⽐较多的技术是状态机,状态机理解起来是⽐较简单的,即⼀个状态过渡到另⼀个

状态,通过判断将⾓⾊的状态改变即可,如果学习过Unity的Mecanim动画系统,会更加直观的理解。

但是状态机在状态较多的情况下会使状态之间的切换变得异常繁琐,同时状态之间很难复⽤。

在这种情况下,⾏为树被发明出来,⾏为树的优点如下:

1. ⾏为树提供⼤量的流程控制⽅法,使得状态之间的改变更加直观;

2. 整个游戏AI使⽤树型结构,⽅便查看与编辑;

3. ⽅便调试和代码编写;

4. 最重要的:⾏为树⽅便制作编辑器,可以交由策划⼈员使⽤;

⾏为树相关资料

这⾥给出我知道的⾏为树相关的资料,⼤家有更好的资料希望可以告诉我:

其中,腾讯的开源项⽬提供了C#编写的⾏为树编辑器源码和不错的相关⽂档(中⽂的哦),⾮常具有学习价值。

⾏为树原理

⾏为树是⼀种树形结构,所以其可以分成3种节点类型:

(画丑了点,见谅...)

1. 红⾊的节点:根节点,没有⽗节点的节点;

2. 蓝⾊的节点:组合节点,有⽗节点和⼦节点的节点;

3. ⽩⾊的节点:叶节点,没有⼦节点的节点;

⽽编号为深度优先访问的顺序;

节点的返回

每个节点都会有⼀个返回值,可能出现的返回值有3个,如下:运⾏中:表⽰当前节点还在运⾏中,下⼀次调⽤⾏为树时任然运⾏当前节点;失败:表⽰当前节点运⾏失败;

成功:表⽰当前节点运⾏成功;

下⾯我们来细说⼀下这⼏个节点;

根节点

⾏为树的⼊⼝节点,可以是任意类型的节点;组合节点

⾏为树的组合节点是由下⾯⼏种类型来组成的:

选择节点/优先选择节点(Selector)

该节点会从左到右的依次执⾏其⼦节点,只要⼦节点返回“失败”,就继续执⾏后⾯的节点,直到有⼀个节点返回“运⾏中”或“成功”时,会停⽌

后续节点的运⾏,并且向⽗节点返回“运⾏中”或“成功”,如果所有⼦节点都返回“失败”则向⽗节点返回“失败”。

随机选择节点(Random Selector)

之前的选择节点是有优先级顺序的,⽽随机选择节点的执⾏顺序是随机的。但每个节点只会执⾏⼀次,⽐如包含⼦节点:A、B、C、D、E;使⽤随机选择节点,执⾏顺序可能是:D、E、A、C、B或其他组合。其它规则同选择节点⼀致。

顺序节点(Sequence)

该节点会从左到右的依次执⾏其⼦节点,只要⼦节点返回“成功”,就继续执⾏后⾯的节点,直到有⼀个节点返回“运⾏中”或“失败”时,会停⽌

后续节点的运⾏,并且向⽗节点返回“运⾏中”或“失败”,如果所有⼦节点都返回“成功”则向⽗节点返回“成功”。

修饰节点(Decorator)

修饰节点只包含⼀个⼦节点,⽤来以某种⽅式来改变这个⼦节点的⾏为。

修饰节点的类型⽐较多,这⾥我们说⼀些⽐较常见的修饰节点:

Until Success和Until Failure

循环执⾏⼦节点,直到返回“成功”或“失败”为⽌。

⽐如Until Success在⼦节点返回“运⾏中”和“失败”时都会向⽗节点返回“运⾏中”,返回“成功”时向⽗节点返回“成功”。

Until Failure在⼦节点返回“运⾏中”和“成功”时都会向⽗节点返回“运⾏中”,返回“失败”时向⽗节点返回“成功”。

Limit

执⾏⼦节点⼀定次数后强制返回“失败”。

当⼦节点运⾏指定次数后还没有返回“失败”则该节点向⽗节点返回失败。

Timer

⼦节点不会⽴即执⾏,⽽会在指定的时间到达后才开始执⾏。

TimeLimit

指定⼦节点的最长运⾏时间,如果⼦节点在指定时间到达后还在运⾏则强制返回“失败”。

Invert

对⼦节点的返回结果取“⾮”,即⼦节点返回“成功”则该节点返回“失败”,⼦节点返回“失败”则该节点返回成功。

并⾏节点(Parallel)

不同于选择和顺序节点依次执⾏每个节点,并⾏节点是“同时”执⾏所有的节点,然后根据所有节点的返回值判断最终返回的结果。

这⾥的“同时”会迷惑住不少⼈,实际上,⾏为树是运⾏在单⼀线程上的,并不会在并⾏节点上开多个线程来进⾏真正的同时执⾏,那么“同

时”的含义是什么?

我们知道选择或顺序节点会依次执⾏所有的⼦节点,当⼦节点返回“成功”或“失败”后就会停⽌后续节点的执⾏,⽽并⾏节点也会依次执⾏所有

的⼦节点,⽆论⼦节点返回“成功”或“失败”都会继续运⾏后续节点,保证所有⼦节点都得到运⾏后在根据每个⼦节点的返回值来确定最终的返

回结果。并⾏节点⼀般可以设定退出该节点的条件,⽐如:当全部节点都返回成功时退出;当某⼀个节点返回成功时退出;

当全部节点都返回成功或失败时退出;当某⼀个节点返回成功或失败时退出;当全部节点都返回失败时退出;

当某⼀个节点返回失败时退出;

叶节点

条件节点(Condition)

条件节点可以理解为⼀个if判断语句,当条件的测试结果为true时向⽗节点传递success,结果为false时向⽗节点传递failure;

该节点搭配⼀些组合节点可以完成各种判断跳转,⽐如搭配顺序节点,可以做出“是否看见敌⼈”->“向敌⼈开⽕”的AI;

⾏为节点(Action)

⾏为节点⽤来完成具体的操作,⽐如,移动到⽬标点,执⾏开⽕等代码逻辑,多种情况下⾏为节点会返回running和success;

⾏为节点也可能会使⽤多帧来完成;

⼦树的复⽤

我们设计好的⾏为树可以在其他树中作为⼀颗⼦树来进⾏使⽤,最⼤可能的复⽤⼦树可以减少开发量。

⾏为树和状态机的选择

⾏为树并不能完全的替代状态机,两者都可以⽤来处理AI编写问题,但⾏为树是“轮询”机制,⽽状态机是“事件”机制,在最终使⽤之前⼀定要

好好权衡和选择才⾏。