UE4之Behavior Tree介绍

来源:互联网 发布:js修改div背景颜色 编辑:程序博客网 时间:2024/05/01 01:28

UE4中提供了很强大的可视化的Behavior Tree编辑器,再不用自己写一大堆状态机了,对游戏开发者来说乃一大福音,而且可以查看运行时状态,甚至可以看到当前执行那一条分支和条件判断结果,简直就是黑科技。

基本概念

先介绍一下BT中要使用的几个节点类型:

Composite:包括三种节点,定义了节点的执行规则,其中包括:

  1. Selector:从左到右依次执行子节点,直到有一个返回成功,则停止,返回父节点成功,否则返回失败,可以连接多个子节点。
  2. Sequence:从左到右依次执行子节点,直到有一个返回失败,则停止,返回父节点失败,否则返回成功,可以连接多个子节点。
  3. SimpleParallel:允许同时执行一个主任务和一颗子树,当Finish Mode设为Immediately时,主任务执行结束后中断子树,设为Delay时,主任务执行结束后等待子树执行结束。

Task:BT的叶节点,真正干活的。

Decorator:用来做条件判断,加在Composite节点上,决定是否执行该节点下的子树,或者加在Task上决定是否执行该Task。

Service:可以加在Composite节点上,当该节点及其子树被执行时,该Service按照指定时间间隔被重复调用,用来做一些状态检查或更新Blackboard。

Root:BT的起点,且每个BT只能有唯一的Root节点,只能连接一个子节点,不能添加Decorator和Service。

和BT协同工作的几个类:

AIController:和PlayerController的功能类似,用于电脑控制的Pawn,可以为BT提供一些方法封装,根据Pawn状态或周围环境做一些决定,每个Pawn实例都有自己的AIController实例。

Blackboard:用来存储BT所需的数据,在BT中的Service和Task或其他节点之间共享数据,或者用于其他类给BT共享数据。

Decorator

点击节点中的Decorator,可以在详细面板中看到一个ObserverAborts,当条件不满足时,可以中断当前执行的子树或任务。Abort Property有四个值可选:

  1. None,即不中断
  2. Self,会中断当前节点下的子树或任务
  3. LowerPriority,会中断比当前节点优先级低的兄弟节点下的子树或任务
  4. Both,就是Self和LowerPriority两种节点都会中断

编辑器中标记了相关节点的优先级,会受中断影响的节点还会变色。

对于设置了ObserverAborts的Decorator,引擎会不断检查其中的条件是否满足,即使是已经执行到下一个子树,也可能被之前的条件检查中断。如果没有设置ObserverAborts,则只有下一次从Service节点执行到该子树时才会检查Decorator条件。

引擎本身提供了一些常用的Decorator,如:

Blackboard:检查Blackboard上的某值是否赋值,或者做一些值的比较等
Loop:循环当前节点制定次数或无限循环

详情参见官方文档

Task

Task启动时,会收到EventReceiveExecute事件调用,作为执行Task的入口,Task执行完毕后需要手动调用FinishExecute,Task才算完成,否则BT会卡在当前Task,完成之前不会执行该Task之后的节点。比如,像移动到某位置的操作,需要等移动到目的地后,再调用Finished Execute,否则就会执行到后面的节点,扰乱或中断移动操作。FinishExecute有一个bool的返回值,Composite节点根据该返回值决定是否执行后续节点还是返回父节点。

Task可以被上文提到的Decorator中断,被中断时会收到EventReceiveAbort事件,可以做一些中断处理,比如停止移动等,然后手动调用FinishAbort。

引擎本身提供一些常用的Task,如:

MoveTo:让拥有CharacterMovement组件的Pawn根据NavMesh移动到Blackboard中指定的位置
PlaySound:播放声音
RunBehavior:执行其他的BehaviorTree
Wait:等待指定时间
WaitBlackboardTime:等待Blackboard中指定的时间

详情参见官方文档

创建节点

可以在Content Browser中右键,Miscellaneous分类中可以看到BehaviorTree和Blackboard。

创建Service、Decorator、Task等则选择BluePrint class,再选择相应的基类即可,也可以在BT的编辑器上方点击New XX的按钮。

BehaviorTreeEditorTopBar

Blackboard 

Blackboard是BT中必不可少的功能,由于BT编辑器中不能直接给节点传入参数,或者获得节点运行结果,这些数据都需要通过Blackboard缓存起来,来完成节点与节点,节点与游戏逻辑之间的通讯。

选择Root节点时,可以在Details面板里选择Blackboard,可以在右上角的Blackboard按钮切换到Blackboard编辑器。

BehaviorTreeEditorBlackboardBtn

读写Blackboard有两种方法:

一种是在Service、Decorator、Task等节点蓝图中,添加Variable,类型选择BlackboardKeySelector,值通过BT编辑器传入,所以需要设置Editable设为True,这样就可以在BT编辑器的Details中看到,选择需要传入的BlackboardKey,就可以在蓝图中使用此Key读写Blackboard中的数据。

BT_GetBlackboardValueAsFloat

还有一种方法是获得BT所属的Actor,从中得到Blackboard组件,即可获得指定KeyName的值。一般情况下,使用AIController对应的Pawn,可以得到当前正在使用的Blackboard。

BT_BB_GetValueAsFloat

1 0