如何正确获蒙太奇的蒙太奇实例
蒙太奇简介
蒙太奇
指的是 UAnimMontage 对象
蒙太奇实例
指的是 FAnimMontageInstance 对象
获取蒙太奇实例
GetInstanceForMontage 查找第一个匹配的蒙太奇实例
从 UAnimInstance::MontageInstances 中查找
GetActiveInstanceForMontage 查找激活的蒙太奇实例
从 UAnimInstance::ActiveMontagesMap 中查找
简易流程图
可以看到,在播放一次蒙太奇时,
在播放之后,新生成的蒙太奇实例就可以通过上述任意接口获取到,
在触发停止/开始混出之后,蒙太奇实例,不再被认为是激活的(Active),
在播放完成/蒙太奇实际停止之后,无法通过任何方式获取到。
但在短时间,多次播放同一个蒙太奇时,事情开始变得复杂了一点,
假设,播放时,bStopAllMontages为true,即停止之前播的蒙太奇。
对于GetInstanceForMontage
由于引擎的实现是 查找到第一个资源为传入蒙太奇的实例时,就返回,
那么如果MontageInstances中有正在混出的同蒙太奇实例,通过此接口拿到的只能是在混出的实例,而不是你可能需要的“激活的实例”,因为激活的实例总是加在数组末尾。这时候应该使用GetActiveInstanceForMontage
GetMontageInstanceForID 通过InstanceID查找
另外引擎提供了这个接口,来支持通过FAnimMontageInstance::InstanceID这个进程间的唯一ID来查找指定实例
建议
因为GetActiveInstanceForMontage这一个接口是通过map而不是遍历数组查询,速度最快,
如果只是需要查找正在播放且没有混出/激活 的蒙太奇实例,使用蒙太奇指针和GetActiveInstanceForMontage接口查询。
激活的蒙太奇实例最多只有一个,因为蒙太奇和蒙太奇实例是通过map一一对应的。
对于非激活蒙太奇的查找,可以考虑缓存FAnimMontageInstance::InstanceID,进行精确查找,避免多次播放相同蒙太奇时,可能找错对象的问题


