Captain's log of the reason behind why this is required:
When spawning a replicated Level Sequence Actor on the server, a SequencePlayer subobject is also created and replicated along with it. If the sequence player is interacted with directly (by way of calling things like PlayLooping, which adjust the loop count of the player's playback settings directly), there can be a justifiable discrepancy in playback settings on the server between the actor and its player. This is not a problem in practice because the Actor's playback settings are only used for initialization.
When these 2 objects are replicated to the client, the client receives the properties for both the actor and sequence player in the same network bunch, applies them, then calls PostNetReceive on both objects. Unfortunately it can call ALevelSequenceActor::PostNetReceive before UMovieSceneSequencePlayer::PostNetReceive, which means the Actor ends up calling Initialize on the player (because it hasn't been set up yet - it's only just been spawned by the net code), which ends up trampling over the player's PlaybackSettings that were just applied by the net replication.
Since the shadow state on the server thinks it has already sent those properties to the client, it never sends them again, so the client doesn't think it's looping when the server does.
#rb Ludovic.Chabant, Max.Chen
#preflight 63345955031c90cb0bab2afb
[CL 22240516 by max chen in ue5-main branch]
Before:
3648 unity files
Total CPU Time: 47886.140625 s
Total time in Parallel executor: 498.81 seconds
After:
3548 unity files
Total CPU Time: 46643.828125 s
Total time in Parallel executor: 486.06 seconds
#jira
#preflight
[CL 22173263 by marc audy in ue5-main branch]
The sequence tick manager is now able to manage updating sequences at various different tick intervals. To do so it creates new linkers and runners for each unique tick interval, and groups all updates for that tick interval into their own linker.
As such, sequences running at different tick intervals are unable to blend with each other, since the data is separated, but this is an acceptable trade-off for the flexibility it brings.
Usage of Actor nomenclature in UMovieSceneSequenceTickManager has been deprecated and replaced with 'client' since it is not necessarily an actor. In fact, all existing implementations of this interface have been unified into UMovieSceneSequencePlayer so it can be updated directly without having to go through an actor or component indirection first. This does introduce an issue whereby the player could continue to tick _after_ its owner EndPlay has been called, which forces the owner to call TearDown on EndPlay. The SequencePlayer itself is only registered inside ::Initialize so should not begin ticking until it is ready to play.
A new struct type, FMovieSceneSequenceTickInterval (and FMovieSceneSequenceResolvedTickInterval), has been added to unify places where we deal with tick intervals and provide a nice edit interface in the playback settings allowing users to manually override it without having to manipulate actor ticks.
#rb Ludovic.Chabant, Lonnie.Li
#preflight 62b5e6b3d82986248b668723
#ROBOMERGE-AUTHOR: andrew.rodham
#ROBOMERGE-SOURCE: CL 20814562 via CL 20814726 via CL 20815069
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v971-20777995)
[CL 20816478 by andrew rodham in ue5-main branch]
#rb Max.Chen
#ROBOMERGE-AUTHOR: andrew.rodham
#ROBOMERGE-SOURCE: CL 20187214 via CL 20188752 via CL 20189858 via CL 20189882 via CL 20189900
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v943-19904690)
[CL 20191995 by andrew rodham in ue5-main branch]
- Deprecated enum EActorGridPlacement and replaced AActor::GridPlacement by bIsSpatiallyLoaded.
- It makes more sense from a user perspective to set an actor as "non-spatially loaded" instead of "always loaded", especially with data layers.
- If we ever need it, having the possibility to set actors to use their location or bounds to go in the grid will be a per-grid setting.
#rb richard.malo, sebastien.lussier
#preflight 61af8bf10e59fd0ab0f93cc4
#ROBOMERGE-AUTHOR: jeanfrancois.dube
#ROBOMERGE-SOURCE: CL 18395825 in //UE5/Release-5.0/... via CL 18395836
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v896-18170469)
[CL 18395850 by jeanfrancois dube in ue5-release-engine-test branch]
This represents UE4/Main @18073326, Release-5.0 @18081140 and Dev-PerfTest @18045971
[CL 18081471 by aurel cordonnier in ue5-release-engine-test branch]
This represents UE4/Main @17774255, Release-5.0 @17791557 and Dev-PerfTest @17789485
[CL 17794212 by aurel cordonnier in ue5-release-engine-test branch]
By "client-only" sequences here we refer to sequences whose actor has no network authority (client side in a networked game), but doesn't need replicated playback, so it can do whatever it wants.
#jira UE-126176
#rb max.chen
#ROBOMERGE-AUTHOR: ludovic.chabant
#ROBOMERGE-SOURCE: CL 17553223 via CL 17554030 via CL 17554115
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v870-17433530)
#ROBOMERGE[STARSHIP]: UE5-Main
[CL 17554143 by ludovic chabant in ue5-release-engine-test branch]
This is because level sequences tick at a specific point in time during the game loop. Adding a Tick override makes the BP compiler enable ticking on the actor, which means that it will tick twice (once with the custom sequencer tick manager, and once with the normal actor tick groups). This will not only make the sequence go twice as fast, it will also cause other problems around starting/stopping. So here we make the sequence tick manager use a custom tick method, which frees up the standard tick to do other things.
Note that we need to introduce an interface for this custom tick method because the tick manager, which resides in the core MovieScene module, doesn't know anything about sequence actors such as LevelSequenceActor.
#jira UE-114460
#rb max.chen
#ROBOMERGE-OWNER: ludovic.chabant
#ROBOMERGE-AUTHOR: ludovic.chabant
#ROBOMERGE-SOURCE: CL 16302522 via CL 16303238 via CL 16303473
#ROBOMERGE-BOT: (v800-16297934)
#ROBOMERGE-CONFLICT from-shelf
[CL 16305783 by ludovic chabant in ue5-release-engine-staging branch]
- This change introduces two separate types for dealing with binding IDs in different spaces explicitly: FFixedObjectBindingID and FRelativeObjectBindingID. The latter is portable if the sequence it was created within is nested inside another foreign hierarchy.
- FMovieSceneObjectBindingID remains, and is able to represent both of the new types, but should only be used for serialization to ensure compatability and consistency with editor tools that operate in different spaces.
- Any manual ResolveLocalToRoot or GetSequenceID processing has now been replaced with the new ResolveBoundObjects API, which provides a less error-prone way of resolving bindings that live in different sequences
#jira UE-74450
#rb Max.Chen, Ludovic.Chabant
[CL 14915667 by Andrew Rodham in ue5-main branch]
#rnx
#rb none
#ROBOMERGE-OWNER: ryan.durand
#ROBOMERGE-AUTHOR: ryan.durand
#ROBOMERGE-SOURCE: CL 10869210 via CL 10869511 via CL 10869900
#ROBOMERGE-BOT: (v613-10869866)
[CL 10870549 by ryan durand in Main branch]
- Tags are now specified on object bindings and can be used to persistently reference similar bindings across different sequences
- Tags are now always specified and stored on the root sequence, making it easier to rebind objects from within sub sequences
- A new object binding tag manager window is available that gives a bird's eye view of all bindings and tags for the whole sequence
- New functions are available on Level Sequence Actors for interacting with bindings by tag: SetBindingByTag, AddBindingByTag, RemoveBindingByTag, FindBindingByTag
- Tags are now shown on the sequencer tree view for visibility
#jira UE-81102
#rb Max.Chen
#ROBOMERGE-SOURCE: CL 9732635 in //UE4/Release-4.24/...
#ROBOMERGE-BOT: RELEASE (Release-4.24 -> Main) (v539-9700858)
[CL 9732642 by andrew rodham in Main branch]