如何正确获蒙太奇的蒙太奇实例
蒙太奇简介
蒙太奇
指的是 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,进行精确查找,避免多次播放相同蒙太奇时,可能找错对象的问题