UE4的BehaviorTrees的特点

来源:互联网 发布:linux中passwd命令 编辑:程序博客网 时间:2024/04/30 15:21

事件驱动的BehaviorTrees

事件驱动,UE4的BehaviorTrees无须一直检查相关条件是否变化,而是被动地被事件的触发,可以减少每帧的计算量。
性能改善,因为不用每一帧遍历整个树,就好像不用一直问”满足条件吗?”, 而是等满足条件时直接告诉你”满足条件了”。
更好的调试

条件不用写在叶节点上

标准的BehaviorTrees模型中,条件节点是一种特殊的任务叶节点,只做条件判断工作。条件判断节点和任务执行节点混在一起。

UE4中则是使用Decorator来实现条件判断,条件都写在子树的根节点上,当多个条件需要判断时,可以清楚地看到哪些条件不满足,所有的叶节点都是任务处理,可以清楚地看到有哪些操作会执行,看起来更直观,更易读。而标准模型中,需要从叶节点中区分出哪些是条件哪些是任务。当然非要按标准模型中的样式写也未尝不可。

使用Decorator的另外一点好处就是,可以方便地把Decorator作为观察者,这点对发挥事件驱动的优点很重要。

对并行任务的特殊处理

标准的BehaviorTrees使用”Parallel”节点来处理并行任务,Parallel节点同时处理所有的子节点,但这样常常令人困惑,有些子树可能执行失败被打断,有些会成功完成,而且难以做性能优化,特别是在事件驱动的基础下。相比之下,UE4采用Simple Parallel节点和一种特殊的”Services”来完成类似工作。

Simple Parallel节点只有两个子节点,一个必须是独立的任务(可以有Decorators),另一个可以包含一个子树。可以理解为,如果执行A任务,那么B也会执行,A是首要任务,B是次要任务,或者在等待A完成时做的任务。虽然相对于传统的Parallel节点会相对简单,但是足矣应对大多数需求。

Service是一种特殊的节点,可以和任意组合节点联合工作,如Selector,Sequence,SimpleParallel。它可以注册间隔回调函数,每隔X秒回调一次,可以用来刷新一些状态。如,可以写一个Service来寻找合适的目标敌人,同时又不影响行为树中其他任务的执行。

有些情况下需要中断当前任务,如一只猫在捉老鼠,当老鼠跑进洞里时,猫就需要中断当前的追逐任务。标准Parallel节点需要不断检查条件是否满足,来决定是否中断正在执行的任务。而UE4中的行为树采用事件驱动模式,只需设置Decorator的ObserverAborts即可实现,ObserverAborts值为Self时,可以中断所在节点的任务和子任务,值为LowPriority时,可以中断比所在节点优先级更低的任务和子任务,值为Both时所在节点和低优先级节点都会被中断。

总之,UE4的行为树逻辑清晰,易于调试,易于优化。

0 0
原创粉丝点击