FMovieSceneSkeletalAnimationParams::MapTimeToAnimation takes in an FFrameTime and FFrameRate and is supposed to tell you which frame of animation that evaluates to, when accounting for looping, play rate, animation frame rate, section start time, and so on. But if InFrameRate is not the same as the tick resolution, the answer will be wrong.
This is because in the version where the UMovieSceneSection itself is passed in, it queries the section start and end frame from that, and those are always in the tick resolution's frame rate. Presumably in the overload where start and end are passed in, they're calculated the same way by the caller. This range is passed to FMovieSceneSkeletalAnimationParams::MakeTransform, which multiplies the sequence length in seconds by the original InFrameRate to get the anim sequence length in frames, but then it checks if the section range is greater than that length to decide if it's looping the animation.
If we pass in 30 FPS (with a matching frame number), and the tick resolution is 24,000 FPS, a section the same length as the animation will appear here to loop it 800 times. When the FMovieSceneSequenceTransform produced in this function is evaluated back in MapTimeToAnimation, it will get the wrong anim frame number as the result.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-361071 in the post.
| 0 |
| Component | UE - Anim - Sequencer |
|---|---|
| Affects Versions | 5.6 |
| Target Fix | 5.8 |
| Created | Jan 16, 2026 |
|---|---|
| Updated | Jan 16, 2026 |