Skip to content

Commit 105bbe2

Browse files
fix: NetworkAnimator fails to synchronize end of animation loop for late joining clients [MTT-4060] (#2076)
This resolves the issue where animations at the end of their loop would not be synchronized with late joining clients.
1 parent 233cbd7 commit 105bbe2

File tree

10 files changed

+661
-25
lines changed

10 files changed

+661
-25
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ Additional documentation and release notes are available at [Multiplayer Documen
1212
- When using `UnityTransport`, _reliable_ payloads are now allowed to exceed the configured 'Max Payload Size'. Unreliable payloads remain bounded by this setting. (#2081)
1313

1414
### Fixed
15-
16-
- Fixed issue where NetworkAnimator was not removing its subscription from OnClientConnectedCallback when despawned during the shutdown sequence. (#2074)
15+
- Fixed issue where `NetworkAnimator` would not synchronize a looping animation for late joining clients if it was at the very end of its loop. (#2076)
16+
- Fixed issue where `NetworkAnimator` was not removing its subscription from `OnClientConnectedCallback` when despawned during the shutdown sequence. (#2074)
1717
- Fixed IsServer and IsClient being set to false before object despawn during the shutdown sequence. (#2074)
1818
- Fixed NetworkLists not populating on client. NetworkList now uses the most recent list as opposed to the list at the end of previous frame, when sending full updates to dynamically spawned NetworkObject. The difference in behaviour is required as scene management spawns those objects at a different time in the frame, relative to updates. (#2062)
1919
- Fixed NetworkList Value event on the server. PreviousValue is now set correctly when a new value is set through property setter. (#2067)

com.unity.netcode.gameobjects/Components/NetworkAnimator.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -424,11 +424,6 @@ internal void ServerSynchronizeNewPlayer(ulong playerId)
424424

425425
stateHash = nextState.fullPathHash;
426426
}
427-
else
428-
if (st.normalizedTime >= adjustedNormalizedMaxTime)
429-
{
430-
continue;
431-
}
432427

433428
var animMsg = new AnimationMessage
434429
{

testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller

Lines changed: 246 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,83 @@
11
%YAML 1.1
22
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1101 &-9076771464115044414
4+
AnimatorStateTransition:
5+
m_ObjectHideFlags: 1
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
m_Name:
10+
m_Conditions:
11+
- m_ConditionMode: 1
12+
m_ConditionEvent: LateJoinTest
13+
m_EventTreshold: 0
14+
m_DstStateMachine: {fileID: 0}
15+
m_DstState: {fileID: -8870587575130706737}
16+
m_Solo: 0
17+
m_Mute: 0
18+
m_IsExit: 0
19+
serializedVersion: 3
20+
m_TransitionDuration: 0.25
21+
m_TransitionOffset: 0
22+
m_ExitTime: 0.75
23+
m_HasExitTime: 1
24+
m_HasFixedDuration: 1
25+
m_InterruptionSource: 0
26+
m_OrderedInterruption: 1
27+
m_CanTransitionToSelf: 1
28+
--- !u!1102 &-8870587575130706737
29+
AnimatorState:
30+
serializedVersion: 6
31+
m_ObjectHideFlags: 1
32+
m_CorrespondingSourceObject: {fileID: 0}
33+
m_PrefabInstance: {fileID: 0}
34+
m_PrefabAsset: {fileID: 0}
35+
m_Name: LateJoinSync
36+
m_Speed: 1
37+
m_CycleOffset: 0
38+
m_Transitions:
39+
- {fileID: 2097057606729455931}
40+
m_StateMachineBehaviours:
41+
- {fileID: 4108346256824837128}
42+
m_Position: {x: 50, y: 50, z: 0}
43+
m_IKOnFeet: 0
44+
m_WriteDefaultValues: 1
45+
m_Mirror: 0
46+
m_SpeedParameterActive: 0
47+
m_MirrorParameterActive: 0
48+
m_CycleOffsetParameterActive: 0
49+
m_TimeParameterActive: 0
50+
m_Motion: {fileID: 7400000, guid: 0dbf24ad942a3ef4e8045f46b378d431, type: 2}
51+
m_Tag:
52+
m_SpeedParameter:
53+
m_MirrorParameter:
54+
m_CycleOffsetParameter:
55+
m_TimeParameter:
56+
--- !u!1101 &-7881886588344925529
57+
AnimatorStateTransition:
58+
m_ObjectHideFlags: 1
59+
m_CorrespondingSourceObject: {fileID: 0}
60+
m_PrefabInstance: {fileID: 0}
61+
m_PrefabAsset: {fileID: 0}
62+
m_Name:
63+
m_Conditions:
64+
- m_ConditionMode: 2
65+
m_ConditionEvent: LateJoinTest
66+
m_EventTreshold: 0
67+
m_DstStateMachine: {fileID: 0}
68+
m_DstState: {fileID: 0}
69+
m_Solo: 0
70+
m_Mute: 0
71+
m_IsExit: 0
72+
serializedVersion: 3
73+
m_TransitionDuration: 0.25
74+
m_TransitionOffset: 0
75+
m_ExitTime: 0.75
76+
m_HasExitTime: 1
77+
m_HasFixedDuration: 1
78+
m_InterruptionSource: 0
79+
m_OrderedInterruption: 1
80+
m_CanTransitionToSelf: 1
381
--- !u!1101 &-6396453490711135124
482
AnimatorStateTransition:
583
m_ObjectHideFlags: 1
@@ -150,6 +228,18 @@ AnimatorStateTransition:
150228
m_InterruptionSource: 0
151229
m_OrderedInterruption: 1
152230
m_CanTransitionToSelf: 1
231+
--- !u!114 &-1766406323300068053
232+
MonoBehaviour:
233+
m_ObjectHideFlags: 1
234+
m_CorrespondingSourceObject: {fileID: 0}
235+
m_PrefabInstance: {fileID: 0}
236+
m_PrefabAsset: {fileID: 0}
237+
m_GameObject: {fileID: 0}
238+
m_Enabled: 1
239+
m_EditorHideFlags: 0
240+
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
241+
m_Name:
242+
m_EditorClassIdentifier:
153243
--- !u!1102 &-1676030328622575462
154244
AnimatorState:
155245
serializedVersion: 6
@@ -163,7 +253,8 @@ AnimatorState:
163253
m_Transitions:
164254
- {fileID: -4282378417640754704}
165255
- {fileID: 1678733063235620591}
166-
m_StateMachineBehaviours: []
256+
m_StateMachineBehaviours:
257+
- {fileID: 6706570197837314945}
167258
m_Position: {x: 50, y: 50, z: 0}
168259
m_IKOnFeet: 0
169260
m_WriteDefaultValues: 1
@@ -190,7 +281,8 @@ AnimatorState:
190281
m_CycleOffset: 0
191282
m_Transitions:
192283
- {fileID: -6396453490711135124}
193-
m_StateMachineBehaviours: []
284+
m_StateMachineBehaviours:
285+
- {fileID: -1261272140589342921}
194286
m_Position: {x: 50, y: 50, z: 0}
195287
m_IKOnFeet: 0
196288
m_WriteDefaultValues: 1
@@ -205,6 +297,18 @@ AnimatorState:
205297
m_MirrorParameter:
206298
m_CycleOffsetParameter:
207299
m_TimeParameter:
300+
--- !u!114 &-1261272140589342921
301+
MonoBehaviour:
302+
m_ObjectHideFlags: 1
303+
m_CorrespondingSourceObject: {fileID: 0}
304+
m_PrefabInstance: {fileID: 0}
305+
m_PrefabAsset: {fileID: 0}
306+
m_GameObject: {fileID: 0}
307+
m_Enabled: 1
308+
m_EditorHideFlags: 0
309+
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
310+
m_Name:
311+
m_EditorClassIdentifier:
208312
--- !u!1102 &-338501773749300249
209313
AnimatorState:
210314
serializedVersion: 6
@@ -244,21 +348,21 @@ AnimatorStateMachine:
244348
m_ChildStates:
245349
- serializedVersion: 1
246350
m_State: {fileID: -1676030328622575462}
247-
m_Position: {x: 290, y: 10, z: 0}
351+
m_Position: {x: 290, y: 0, z: 0}
248352
- serializedVersion: 1
249353
m_State: {fileID: 6353332194479835970}
250-
m_Position: {x: 350, y: -150, z: 0}
354+
m_Position: {x: 290, y: -150, z: 0}
251355
- serializedVersion: 1
252356
m_State: {fileID: 2733578584814225138}
253-
m_Position: {x: 180, y: 190, z: 0}
357+
m_Position: {x: 290, y: 180, z: 0}
254358
m_ChildStateMachines: []
255359
m_AnyStateTransitions: []
256360
m_EntryTransitions: []
257361
m_StateMachineTransitions: {}
258362
m_StateMachineBehaviours: []
259-
m_AnyStatePosition: {x: 50, y: 20, z: 0}
260-
m_EntryPosition: {x: 420, y: 160, z: 0}
261-
m_ExitPosition: {x: 800, y: 120, z: 0}
363+
m_AnyStatePosition: {x: 540, y: 0, z: 0}
364+
m_EntryPosition: {x: 20, y: 10, z: 0}
365+
m_ExitPosition: {x: 540, y: 70, z: 0}
262366
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
263367
m_DefaultState: {fileID: -1676030328622575462}
264368
--- !u!91 &9100000
@@ -306,6 +410,12 @@ AnimatorController:
306410
m_DefaultInt: 0
307411
m_DefaultBool: 0
308412
m_Controller: {fileID: 9100000}
413+
- m_Name: LateJoinTest
414+
m_Type: 4
415+
m_DefaultFloat: 0
416+
m_DefaultInt: 0
417+
m_DefaultBool: 0
418+
m_Controller: {fileID: 9100000}
309419
m_AnimatorLayers:
310420
- serializedVersion: 5
311421
m_Name: Base Layer
@@ -331,6 +441,18 @@ AnimatorController:
331441
m_IKPass: 0
332442
m_SyncedLayerAffectsTiming: 0
333443
m_Controller: {fileID: 9100000}
444+
- serializedVersion: 5
445+
m_Name: LateJoingSyncLayer
446+
m_StateMachine: {fileID: 7987549579817906310}
447+
m_Mask: {fileID: 0}
448+
m_Motions: []
449+
m_Behaviours: []
450+
m_BlendingMode: 0
451+
m_SyncedLayerIndex: -1
452+
m_DefaultWeight: 1
453+
m_IKPass: 0
454+
m_SyncedLayerAffectsTiming: 0
455+
m_Controller: {fileID: 9100000}
334456
--- !u!1101 &1138737138882309440
335457
AnimatorStateTransition:
336458
m_ObjectHideFlags: 1
@@ -400,6 +522,31 @@ AnimatorStateTransition:
400522
m_InterruptionSource: 0
401523
m_OrderedInterruption: 1
402524
m_CanTransitionToSelf: 1
525+
--- !u!1101 &2097057606729455931
526+
AnimatorStateTransition:
527+
m_ObjectHideFlags: 1
528+
m_CorrespondingSourceObject: {fileID: 0}
529+
m_PrefabInstance: {fileID: 0}
530+
m_PrefabAsset: {fileID: 0}
531+
m_Name:
532+
m_Conditions:
533+
- m_ConditionMode: 2
534+
m_ConditionEvent: LateJoinTest
535+
m_EventTreshold: 0
536+
m_DstStateMachine: {fileID: 0}
537+
m_DstState: {fileID: 5205197960406981613}
538+
m_Solo: 0
539+
m_Mute: 0
540+
m_IsExit: 0
541+
serializedVersion: 3
542+
m_TransitionDuration: 0.25
543+
m_TransitionOffset: 0
544+
m_ExitTime: 0.5
545+
m_HasExitTime: 1
546+
m_HasFixedDuration: 1
547+
m_InterruptionSource: 0
548+
m_OrderedInterruption: 1
549+
m_CanTransitionToSelf: 1
403550
--- !u!1102 &2733578584814225138
404551
AnimatorState:
405552
serializedVersion: 6
@@ -440,6 +587,30 @@ MonoBehaviour:
440587
m_Script: {fileID: 11500000, guid: dec8cf4a19a8ef745ae0440ec04911ae, type: 3}
441588
m_Name:
442589
m_EditorClassIdentifier:
590+
--- !u!114 &3735381422868909868
591+
MonoBehaviour:
592+
m_ObjectHideFlags: 1
593+
m_CorrespondingSourceObject: {fileID: 0}
594+
m_PrefabInstance: {fileID: 0}
595+
m_PrefabAsset: {fileID: 0}
596+
m_GameObject: {fileID: 0}
597+
m_Enabled: 1
598+
m_EditorHideFlags: 0
599+
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
600+
m_Name:
601+
m_EditorClassIdentifier:
602+
--- !u!114 &4108346256824837128
603+
MonoBehaviour:
604+
m_ObjectHideFlags: 1
605+
m_CorrespondingSourceObject: {fileID: 0}
606+
m_PrefabInstance: {fileID: 0}
607+
m_PrefabAsset: {fileID: 0}
608+
m_GameObject: {fileID: 0}
609+
m_Enabled: 1
610+
m_EditorHideFlags: 0
611+
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
612+
m_Name:
613+
m_EditorClassIdentifier:
443614
--- !u!1102 &4311160535506449488
444615
AnimatorState:
445616
serializedVersion: 6
@@ -452,7 +623,8 @@ AnimatorState:
452623
m_CycleOffset: 0
453624
m_Transitions:
454625
- {fileID: 1830534497079063084}
455-
m_StateMachineBehaviours: []
626+
m_StateMachineBehaviours:
627+
- {fileID: 3735381422868909868}
456628
m_Position: {x: 50, y: 50, z: 0}
457629
m_IKOnFeet: 0
458630
m_WriteDefaultValues: 0
@@ -467,6 +639,34 @@ AnimatorState:
467639
m_MirrorParameter:
468640
m_CycleOffsetParameter:
469641
m_TimeParameter:
642+
--- !u!1102 &5205197960406981613
643+
AnimatorState:
644+
serializedVersion: 6
645+
m_ObjectHideFlags: 1
646+
m_CorrespondingSourceObject: {fileID: 0}
647+
m_PrefabInstance: {fileID: 0}
648+
m_PrefabAsset: {fileID: 0}
649+
m_Name: New State
650+
m_Speed: 1
651+
m_CycleOffset: 0
652+
m_Transitions:
653+
- {fileID: -9076771464115044414}
654+
m_StateMachineBehaviours:
655+
- {fileID: -1766406323300068053}
656+
m_Position: {x: 50, y: 50, z: 0}
657+
m_IKOnFeet: 0
658+
m_WriteDefaultValues: 1
659+
m_Mirror: 0
660+
m_SpeedParameterActive: 0
661+
m_MirrorParameterActive: 0
662+
m_CycleOffsetParameterActive: 0
663+
m_TimeParameterActive: 0
664+
m_Motion: {fileID: 0}
665+
m_Tag:
666+
m_SpeedParameter: TestFloat
667+
m_MirrorParameter:
668+
m_CycleOffsetParameter:
669+
m_TimeParameter:
470670
--- !u!114 &5559889042091692034
471671
MonoBehaviour:
472672
m_ObjectHideFlags: 1
@@ -506,6 +706,18 @@ AnimatorState:
506706
m_MirrorParameter:
507707
m_CycleOffsetParameter:
508708
m_TimeParameter:
709+
--- !u!114 &6706570197837314945
710+
MonoBehaviour:
711+
m_ObjectHideFlags: 1
712+
m_CorrespondingSourceObject: {fileID: 0}
713+
m_PrefabInstance: {fileID: 0}
714+
m_PrefabAsset: {fileID: 0}
715+
m_GameObject: {fileID: 0}
716+
m_Enabled: 1
717+
m_EditorHideFlags: 0
718+
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
719+
m_Name:
720+
m_EditorClassIdentifier:
509721
--- !u!1107 &7599406000257451018
510722
AnimatorStateMachine:
511723
serializedVersion: 6
@@ -531,3 +743,28 @@ AnimatorStateMachine:
531743
m_ExitPosition: {x: 800, y: 120, z: 0}
532744
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
533745
m_DefaultState: {fileID: -1607953088454488810}
746+
--- !u!1107 &7987549579817906310
747+
AnimatorStateMachine:
748+
serializedVersion: 6
749+
m_ObjectHideFlags: 1
750+
m_CorrespondingSourceObject: {fileID: 0}
751+
m_PrefabInstance: {fileID: 0}
752+
m_PrefabAsset: {fileID: 0}
753+
m_Name: LateJoingSyncLayer
754+
m_ChildStates:
755+
- serializedVersion: 1
756+
m_State: {fileID: 5205197960406981613}
757+
m_Position: {x: 450, y: 110, z: 0}
758+
- serializedVersion: 1
759+
m_State: {fileID: -8870587575130706737}
760+
m_Position: {x: 450, y: -20, z: 0}
761+
m_ChildStateMachines: []
762+
m_AnyStateTransitions: []
763+
m_EntryTransitions: []
764+
m_StateMachineTransitions: {}
765+
m_StateMachineBehaviours: []
766+
m_AnyStatePosition: {x: 50, y: 20, z: 0}
767+
m_EntryPosition: {x: 50, y: 120, z: 0}
768+
m_ExitPosition: {x: 800, y: 120, z: 0}
769+
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
770+
m_DefaultState: {fileID: 5205197960406981613}

0 commit comments

Comments
 (0)