Description

This issue happens when Sequencer loops a dynamic montage. FAnimMontageInstance::ForcedNextFromPosition is set to 0 and ForcedNextToPosition is effectively the delta time. However, FMontageSubStepper::Advance only ever uses ForcedNextToPosition not ForcedNextFromPosition. This means that in FAnimMontageInstance::Advance, PreviousSubStepPosition always uses the position from the previous tick of the montage, not ForcedNextFromPosition. Therefore when we loop a dynamic montage, we end up with a PreviousSubStepPosition at the end of the animation, and Position at the start of the animation.
Various functions in Montages, like FAnimMontageInstance::HandleEvents assume that when Position < PreviousSubStepPosition that we're playing the animation backwards. Hence we sample all the notifies on the animation when looping. The same is true when sampling root motion.

Steps to Reproduce
  1. Create a level sequence setup that plays an animation via slot node in an anim bp
    1. Create an anim bp containing just a slot node using default slot
    2. Setup a character blueprint with a mesh that uses the anim bp
    3. Drag the character into the level viewport
    4. Create a level sequence that references the character and add an animation track with an anim sequence containing multiple notifies
    5. Set the level sequence to be the length of the animation
  2. In the world, select the level sequence actor and set it to auto-play and loop indefinitely
  3. PIE
    1. Note how when the animation in the sequence loops, all the notifies on the anim sequence are triggered

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-298080 in the post.

1
Login to Vote

Unresolved
ComponentUE - Anim - Runtime
Target Fix5.7
CreatedJun 24, 2025
UpdatedJun 24, 2025
View Jira Issue