Frame-locked Sequencers can occasionally produce frames with a zero delta time due to frame number truncation.
When this occurs, if the animation cursor is within the range of a Notify State that is currently playing, the End event may be triggered even though the cursor is still inside the Notify State range.
The following code is a workaround :
void FAnimMontageInstance::Advance(float DeltaTime, struct FRootMotionMovementParams* OutRootMotionParams, bool bBlendRootMotion)
{
...
// Delegate has to be called last in this loop
// so that if this changes position, the new position will be applied in the next loop
// first need to have event handler to handle it
// Save off position before triggering events, in case they cause a jump to another position
const float PositionBeforeFiringEvents = Position;
const bool bHaveNotMoved = (SubStepResult == EMontageSubStepResult::NotMoved); //work around : add line
if( bHaveMoved || bHaveNotMoved ) //work around : Trigger the event even if the cursor did not move.
{
// Save position before firing events.
if (!bInterrupted)
{
// Must grab a reference on the stack in case "this" is deleted during iteration
TWeakObjectPtr<UAnimInstance> AnimInstanceLocal = AnimInstance;
HandleEvents(PreviousSubStepPosition, Position, BranchingPointMarker);
// Break out if we no longer have active montage instances. This may happen when we call UninitializeAnimation from a notify
if (AnimInstanceLocal.IsValid() && AnimInstanceLocal->MontageInstances.Num() == 0)
{
return;
}
}
}
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-369316 in the post.
| 0 |
| Component | UE - Anim - Runtime |
|---|---|
| Affects Versions | 5.6 |
| Target Fix | 5.8 |
| Fix Commit | 52385961 |
|---|
| Created | Mar 10, 2026 |
|---|---|
| Resolved | Apr 2, 2026 |
| Updated | Apr 15, 2026 |