【UE4】动画通知

   本文总结 UE4 中动画通知 AnimNotify(动画通知状态 AnimNotifyState)的源码分析以及问题总结。

一、动画通知简介

   动画通知是 UE4 中主要配置在动画(Animation)或者动画蒙太奇(AnimMontage)上的通知,通过动画的运行驱动通知的触发。通知分为两种:

  1. AnimNotify(动画通知) – 没有时长;只有 Notify 方法;详见 AnimNotify.h
  2. AnimNotifyState(动画通知状态) – 有时长(TotalDuration);有 NotifyBegin, NotifyTick, NotifyEnd 方法;详见 AnimNotifyState.h

  对于 AnimNotifyState官方描述中说到:

  • 可以保证从 Notify Begin Event 开始
  • 可以保证从 Notify End Event 结束
  • 可以保证 Notify Tick 是在 Notify Begin 和 Notify End event 之间的
  • 不能保证 Anim Notifies (normal or state) 的顺序,如果把两个 AnimNotifyState 首尾相连,并不能保证前一个 Notify 的 End 在后一个的 Begin 之前。只应该在这里进行和其他 Notify 之间没有关联的单独操作。原文:

The order between different Anim Notifies (normal or state) is not guaranteed.
If you put two Anim Notify States next to each other, the first one is not guaranteed to end before the next one starts.
Only use this for individual actions which do not rely on other Notifies.

  即两个 AnimNotifyState,A 和 B,并不能保证执行顺序是:

A.Begin --> A.End --> B.Begin --> B.End

  而有可能是:

A.Begin --> B.Begin --> A.End --> B.End

另外,值得注意的是:

  1. 动画通知默认在 DedicateServer、主控端、模拟段 都会执行。如果不想在 DS 上执行,可以在选项中将下边这个选项取消勾选。
    在这里插入图片描述

  2. 对于同一个 Montage 或者 Animation 上的通知,指针是同一个,所以在通知中如果存储了数据,两个同样的角色,一起释放同一个 Montage 的时候,会出现两个通知修改同一片数据的情况;

  3. 同一个 Montage 上多个同类型的通知,指针是不一样的,GetName() 出来的是 xxx_C_1、xxx_C_2 这样的

二、动画通知的触发

  动画通知的上述方法的触发,主要是从 UAnimInstance::TriggerAnimNotifies 中触发的(还有其他的后边会说一部分)。

2.1 TriggerAnimNotifies 源码分析

  在 Tick 中,AnimInstance 中的 NotifyQueue 里的 AnimNotifiesFAnimNotifyQueue 类型),会添加这一帧在的动画通知(AnimNotify、AnimNotifyState),然后在 TriggerAnimNotifies 执行这一帧的所有动画通知,执行顺序为:

  1. 所有 AnimNotifyNotify
  2. 所有上一还在,但是这一帧已经不在的 AnimNotifyStateNotifyEnd
  3. 上一帧没在,这一帧新加的 AnimNotifyStateNotifyBegin
  4. 这一帧在的所有的 AnimNotifyStateNotifyTick(即 Begin 的同一帧就会 Tick)

  对于 AnimNotify 来说,只有 Notify,所以比较简单,不进行讨论。接下来对 AnimNotifyState 进行重点分析:
   AnimNotifyState 的触发核心是四个数组:

  1. ActiveAnimNot
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值