• 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, 这才是价值

  • 相关阅读:
    《Android 4游戏高级编程(第2版)》书评
    push研究——Apache Mina探索初步
    Android UI开发第二十三篇——分享书架UI实现
    cookie学习总结
    Web.xml配置详解
    Java序列化的机制和原理
    Java高级技术(汇总中...)
    [Java]HashMap的两种排序方式
    jdk与jre的区别
    DM,NLP常用算法汇总
  • 原文地址:https://www.cnblogs.com/motorcycle-stone/p/6090044.html
Copyright © 2020-2023  润新知