UE4 AI BehaviorTree 动画播放完成通知机制

行为树中动画播放完成对外通知机制 基于动画关键帧通知机制改进而来

为什么要说是完成通知呢?

因为UE4的动画片段会补帧, 导入动画片段的时候, 引擎会因为循环播放的关系, 补上一帧

仅仅播放的时候会展示这一帧, 实际编码的时候对这一帧的开发将会忽略, 这就是巨坑

所以完成通知要基于关键帧通知改进一下, 避开这个坑

下面还是来说说具体的开发过程
采用事件发报机 动画蓝图负责call 行为树的task负责bind 状态机负责切换状态
有两个坑点
1.完成关键帧要打在最后一帧上, 而不是动画末尾
2.状态机切换要比关键帧晚, 且不能时动画的结束时间(即!=length)

首先让我们来看看改之前的行为树

N多无用的Sequence节点, 以及为了等待动画播放完成而设置的Wait节点, 明显不科学, 万一帧数不稳定, 时间就会变化.....然后就bug了

接下来就琢磨怎么干掉这些家伙

首先在动画片段设置关键帧事件

注意这里不能把结束事件直接丢到片段的最后, 必须要提前一点, 建议打在最后一帧的帧点上(片段最后是没有帧点的)

因为动画的最后一帧是只播放不会执行任何代码处理的, 具体机制不明

下面是状态机的转移条件代码, 对当前动画经过长度进行判断

可以看到, Idle动画的总时间是2.733333

手动暂停(有误差)最大就到2.6几, 所以如果把结束事件直接丢到片段的最后, 得到的结果就是: 不执行

但是动画会完成, 状态也会发生变化

状态变化了, 通知机制没触发, 赤果果的bug

接下来在动画蓝图的事件图表里面让关键帧事件去调用绑定好的事件发报机, 这个时候事件发报机并没有内容, 典型的设计模式解耦合做法

这里没什么坑, 一条过

动画蓝图搞完了, 再来搞行为树, 下面是task节点的对应实现

在task finish之前有3个步凑

1.绑定自定义事件到 动画蓝图的事件发报机, 然后触发状态变化

2.业务逻辑处理

3.编写完成回调的内容, 并且finish task

以下是改造完成后的行为树

清爽倒是其次, 关键是避免了不可控的bug, 这才是价值

原文地址:https://www.cnblogs.com/motorcycle-stone/p/6090044.html