Description

The problem is that UCharacterMovementComponent::MoveAutonomous can tick the anim instance and dispatch notifies outside of the regular skeletal mesh component tick. But when MoveAutonomous calls TickCharacterPose that doesn't perform a full graph update since it doesn't dispatch the parallel anim eval tasks. So any notifies that are being sampled from sequence players in the regular mesh component update aren't sampled from the MoveAutonomous update.
That results in inconsistencies in NotifyQueue and ActiveAnimNotifyState where at one point in the frame we call ConditionallyDispatchQueuedAnimEvents and it will contain a state notify from a sequence player, at other points it won't. The TriggerAnimNotifies code takes that as the notify having started and ended multiple times within a frame, so the start/end events are incorrectly sent.

Steps to Reproduce
  1. Open GASP
  2. Create a new anim notify state
    1. Print something from the begin/end events so you know when those are fired
  3. Add that new notify state to any animation
  4. Create a new anim blueprint that plays the animation you've just changed
  5. Switch out the sandbox character blueprint to use your anim blueprint
  6. Change the visibility settings on the sandbox character's mesh component to AlwaysTick
  7. Open the main sandbox level
  8. Change your PIE settings to use Net Mode == Play As Client
  9. PIE
    1. Note how the begin/end events of the notify are triggered every frame

Have Comments or More Details?

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

0
Login to Vote

Unresolved
CreatedAug 1, 2025
UpdatedAug 2, 2025
View Jira Issue