How to get MontageInstance correctly
Terms
Montage
refers to UAnimMontage
Object
MontageInstance
refers to FAnimMontageInstance
Object
Get the MontageInstance
GetInstanceForMontage - Find first matching MontageInstance
Finding from UAnimInstance::MontageInstances
GetActiveInstanceForMontage - Find the active MontageInstance
Finding from UAnimInstance::ActiveMontagesMap
Simple Logic Flow
You can see that after playing
a montage,
the newly generated montage instance can be obtained through any of the interfaces above,
After stopping/blending out
, the montage instance, is no longer considered active
,
After the playback is complete/the montage is actually stopped
, it cannot be obtained by any means.
But in a short period of time, when the same
montage is played multiple
times, things start to get a little more complicated,
Suppose that when playing, bStopAllMontages
is true, which is stopping the old playing montage.
For GetInstanceForMontage
Since the engine implementation is return the first montage instance whose asset is the incoming montage
,
Then, if there are multiple montage instances blending out with the same montage asset, you can only get the blending out one
through this interface, not the “active instances” you may need, because the active instance always get added to the end of the array
. GetActiveInstanceForMontage
should be used in this case
GetMontageInstanceForID - Finding with InstanceID
In addition, engine provides this interface to support searching specific instance using FAnimMontageInstance::InstanceID
which is unique within the process
Suggestion
Because the GetActiveInstanceForMontage
interface is queried through a map
instead of traversing an array, it is the fastest
.
If you just need to find a montage instance that is playing and not blending out
/active
, query it using the montage pointer and the GetActiveInstanceForMontage
interface.
These is only one active montage instance
at most, because montage and montage instance is one-to-one
mapped with map.
For inactive montage searches, you can consider caching FAnimMontageInstance::InstanceID for accurate searches to avoid the problem of finding the wrong object when playing the same montage multiple times