ue4 自定义行为树的Service, Task,Decorator节点

一.基本说明

行为树中的节点,有一些Service, Task,Decorator节点是引擎内部的C++类,还有一些,是用户自定义的节点,一般是根据需要,派生自引擎内部c++类的本地C++类,或是派生的蓝图类

 

通常自定义行为树中节点,需要先打开行为树,然后在工具栏中找到如下的选项

点击旁边下拉选项,可以选择基类,默认基类分别为

BTTask_BlueprintBase、 BTDecorator_BlueprintBase、BTService_BlueprintBase

然后就可以创建自定义的节点了。

 

也可以像一般的类一样,通过菜单来创建

创建c++类型的节点(不可以使用BTTask_BlueprintBase、 BTDecorator_BlueprintBase、BTService_BlueprintBase 派生c++类型节点

创建蓝图类型的节点(通常以BTTask_BlueprintBase、 BTDecorator_BlueprintBase、BTService_BlueprintBase 为基类)

 

 

对于派生自BTTask_BlueprintBase、 BTDecorator_BlueprintBase、BTService_BlueprintBase的蓝图类节点,编辑界面如下

其中左侧部分,与普通蓝图一样。 可以定义变量, 注意,因为节点在行为树运行期间一直存在,所以,变量的值会在行为树运行期间一直保存,不会因为节点没有运行或者运行完就被重置掉了。

点击类默认值,可以设置节点的默认属性。

 

二.各节点的注意(派生自BTTask_BlueprintBase、 BTDecorator_BlueprintBase、BTService_BlueprintBase的蓝图类节点):

1.Service节点

当流程控制节点的分支节点被执行,该节点上的Service节点就将按所定义的频率执行, 它们常用于检查和更新黑板

Service节点有以下事件在运行时会被触发这里有两个版本,通常使用AI版本。当AI版本使用后,不是AI的版本就不会再触发

 

 

1.在任务搜索进入树的分支时Event Receive Search Start(AI)被调用

2.如果搜索到分支中有Task满足了运行条件,则该分支被激活,收到接下来的Event Receive Activation(AI) 事件,如果没有满足条件的Task,则跳出该分支,不会收到Event Receive Deactivation( AI)事件

3.当激活的分支中所有任务完成或者运行的任务被中断后分支中没有搜索到满足运行条件的任务,将受到Event Receive Deactivation( AI)事件,然后跳出该分支。当后面再进入该分支时,会再次调用Event Receive Search Start(AI)

4.Event Receive Tick(AI)事件将在分支被激活后运行, 或者如果节点的Call Tick on Search Start 选项被勾选时,将再调用完成Event Receive Search Start(AI)事件后,在开始搜索前,被调用。Tick事件将以指定的频率调用,Tick的触发时间间隔由所在Service的Interval和Random Deviation属性共同决定,Interval指定基础时间间隔,Random Deviation指定在基础时间间隔上的随机误差

2.Task节点

Task 节点用于执行具体的动作,引擎内置的 Task 常用的有 Wait 、 Move To 、 Is At Location 等等,Task 一般是自行实现的AI具体的行为逻辑,其中的代码与普通蓝图代码一样

Task节点有以下事件在运行时会被触发

 

当行为树搜索到该task节点,该节点的所有Decorator(装饰器)都满足时,将调用Receive Execute(AI)执行Task节点。这时候task节点就处于active状态,并一直保持调用FinishExecute蓝图函数之前(注意:在既没有覆盖Receive Execute(AI), 也没有覆盖Receive Tick (AI) 函数时,task 节点直接处于Failed状态,而不是active状态,task节点的执行就结束了 )。这时行为树会一直运行于该task节点直到该节点自己或者外部调用了FinishExecute,该函数根据输入,控制设置Task节点状态为Succeeded还是Failed。 

当外部中断该节点时,如果覆盖了Receive Abort(AI) 函数时,则节点在没有调用FinishAbort或FinishExecute(一般中断时,应该调用FinishAbort,如果有特殊需要可以调用FinishExecute函数时,都将处于active状态。如果没有覆盖Receive Abort(AI) 函数,则直接设置为aborted状态或者是外部设置的状态。

Receive Tick (AI) 将在active状态持续期间,一直调用,调用间隔与普通蓝图一致

3.Decorator节点

附着于Composite(流程控制节点)或Task(执行节点),决定着树中的一个分支,甚至单个节点是否能被执行

不同于任务和服务。装饰器有两个执行链:ExecutionStart-ExecutionFinish和ObserverActived-ObserverActivated,这使得自动清理潜在动作不可能。请记住,在从任何潜在行为(如延迟、时间线等)恢复后,您必须验证给定链是否仍处于活动状态。

Decorator节点有以下事件在运行时会被触发

 

当所属分支或Task节点激活运行时,收到 Receive Execution Start(AI)消息, 当 已激活运行的分支都已运行完毕或者再没有满足条件的节点时,或者所属task节点运行完成或者被中断后,收到Receive Execution Finish(AI)消息。

 

Decorator节点 根据覆盖的PerformConditionCheck(AI)函数的返回值,判断是否满足条件。

 

对于Decorator节点, 有一个流程控制选项(Flow Control),他将控制 当条件不满足时,中止的对象。

以下内容非常重要

如果“Observer aborts”为“None”,那么只有在传统的BT执行期间(也就是分支搜索到达该Decorator依附的节点时),装饰器的条件检查才有意义,Observer没有被激活例如,如果您有一个简单的检查,例如“是否是Blackboard entry Enemy set?” (即非NULL),它只会在执行通过节点进入子树时进行检查。如果稍后它在该子树中变为NULL,则执行将不会立即离开子树(尽管由于某些需要该值的任务的失败而可能会退出)。类似地,如果执行处于较低优先级子树中,则它不会立即知道已经满足较高优先级任务的条件,因此较低优先级任务将继续直到其正常成功或失败。然后,通过较高优先级分支的执行可以发现可以执行该任务。

 

如果将“Observer Aborts”设置为“Self”,那么当执行保留在子树中时,Observer被激活,如果该装饰器的状态发生更改,则会导致树立即中止例如,如果敌人变为“未设置”(NULL)),它将中止(基本上使树失败)。

 

如果将“Observer Aborts”设置为“Lower Priority”,那么当执行处于较低优先级子树时,这个Decorator节点的Observer被激活如果满足条件使得执行可以移动到较高优先级子树(即这个Decorator节点PerformConditionCheck(AI) 返回true),则较低子树将立即中止,跳转到这个Decorator所在的节点因此,如果行为树正在执行“空闲”行为并且敌人变为已设置,则它将立即中止较低优先级树(“空闲”)并开始由“拥有敌人”阻止的较高优先级树

 

“Observer Aborts”设置为“Both”意味着:

1.当执行保留在子树中时,Observer被激活,如果该装饰器的状态发生更改,则会导致树立即中止

2.那么当执行处于较低优先级子树时 ,这个Decorator节点的Observer被激活如果满足条件使得执行可以移动到较高优先级子树,则较低子树将立即中止,跳转到这个Decorator所在的节点

 

 

当Observer被激活时Receive Observer Activated(AI)被调用,Receive Tick事件开始每帧被调用,CheckConditionOnlyBlackBoardChanges选项勾选并且当前Decorator节点拥有Blackboard key selector类型的变量时,PerformConditionCheck(AI) 只在 黑板中的值有变化时被调用,否则PerformConditionCheck(AI)检测函数每帧被调用。当Observer从激活状态变为非激活状态时,Receive Observer Deactivated(AI)被调用。

CheckConditionOnlyBlackBoardChanges选项只在节点拥有Blackboard key selector类型的变量并且Observer aborts 没有设为None时起作用

 

注意:如果有多个节点全部设置为中止“低优先级”(或“两者”),则在中优先级树中止之前,它们都必须满足。这样,当优先级较高的任务无法实际执行时,您不必担心重复中止低优先级任务的单独值更改。

 

为了帮助在编辑器中显示“Self”和“Lower Priority”树,如果选择特定的装饰器,它将突出显示树中的“Self”和/或“Lower Priority”节点(取决于“Observer Aborts”属性) )。

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值