Post

如何正确获蒙太奇的蒙太奇实例

如何正确获蒙太奇的蒙太奇实例

蒙太奇简介

蒙太奇

指的是 UAnimMontage 对象

蒙太奇实例

指的是 FAnimMontageInstance 对象

获取蒙太奇实例

GetInstanceForMontage 查找第一个匹配的蒙太奇实例

UAnimInstance::MontageInstances 中查找

GetActiveInstanceForMontage 查找激活的蒙太奇实例

UAnimInstance::ActiveMontagesMap 中查找

简易流程图

MontageInstanceLifetime

可以看到,在播放一次蒙太奇时,

在播放之后,新生成的蒙太奇实例就可以通过上述任意接口获取到,

在触发停止/开始混出之后,蒙太奇实例,不再被认为是激活的(Active),

在播放完成/蒙太奇实际停止之后,无法通过任何方式获取到。

但在短时间,多次播放同一个蒙太奇时,事情开始变得复杂了一点,

假设,播放时,bStopAllMontages为true,即停止之前播的蒙太奇。

对于GetInstanceForMontage

由于引擎的实现是 查找到第一个资源为传入蒙太奇的实例时,就返回

那么如果MontageInstances中有正在混出的同蒙太奇实例,通过此接口拿到的只能是在混出的实例,而不是你可能需要的“激活的实例”,因为激活的实例总是加在数组末尾。这时候应该使用GetActiveInstanceForMontage

GetMontageInstanceForID 通过InstanceID查找

另外引擎提供了这个接口,来支持通过FAnimMontageInstance::InstanceID这个进程间的唯一ID来查找指定实例

建议

因为GetActiveInstanceForMontage这一个接口是通过map而不是遍历数组查询,速度最快

如果只是需要查找正在播放且没有混出/激活 的蒙太奇实例,使用蒙太奇指针和GetActiveInstanceForMontage接口查询。

激活的蒙太奇实例最多只有一个,因为蒙太奇和蒙太奇实例是通过map一一对应的。

ActiveMontageMap

对于非激活蒙太奇的查找,可以考虑缓存FAnimMontageInstance::InstanceID,进行精确查找,避免多次播放相同蒙太奇时,可能找错对象的问题

This post is licensed under CC BY 4.0 by the author.