Hi, thanks for sending over the video. I did some further investigation into this and I see the issue that you’re running into. This isn’t actually limited to either motion matching, or networked characters. It can be reproduced on the player character in the game animation sample, if the URO code is altered to allow the update of player-controlled meshes to be throttled.
I’ve attached a video that shows the issue. At first, with URO set to update/evaluate every frame, the offset root bone is applying a counter rotation to keep the character root oriented forward consistently as the capsule facing direction changes. After I set the cvar to force a URO update/evaluate only ever 10 frames, you can see how the counter rotation is only applied every 10th frame. In between those frames, the root rotates with the capsule. So you get discontinuities every 10 frames when the offset root bone node runs.
Unfortuantely, there’s no easy solution to this. Effectively, the logic that applies the counter rotation (or translation) to the root bone needs to run every frame. Not just on the frames when the anim graph evaluates. That’s a fundamental issue with the current implementation of this logic since it lives within the anim graph. And we aren’t guaranteed to do an anim graph evaluation if URO (or the budget allocator) means that evaluations aren’t done every frame.
If you need a fix for this, one option would be for you to reimplement the offset root bone logic at the actor level, instead of within the anim graph node. If this logic lived within the actor blueprint, it would run every frame the actor was ticked so would avoid this issue.
The simpler workaround for this would be to change the Translation and Rotation Mode properties on the node when URO throttling the update/evaluate rate of a mesh. When that is the case, you could change the Translation and Rotation Modes to Release (rather than Accumulate as is the default). That should prevent the counter rotation/translation being generated by the node when URO is active. Alternatively, you could effectively turn the node off in the same way that we do in the Game Animation Sample with the OffsetRootBoneEnabled variable (although I think this is disconnected by default in the sample).
I’ll also make the dev team aware of this issue so they can think about what a longer term solution would be.