From 5500c6baede0f630902958974d2f24cf10ab6236 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Fri, 11 Nov 2022 18:34:15 -0600
Subject: [PATCH 01/18] fix
This fixes the issue where NetworkAnimator was not taking into consideration `AnimatorStateTtansition.destinationStateMachine`. Now, NetworkAnimator parses each destinationStateMachine's states for trigger transitions and includes those in the transition table.
---
.../Components/NetworkAnimator.cs | 119 +++++++++++-------
1 file changed, 71 insertions(+), 48 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index 258b64ea0b..c6130ef93b 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -226,6 +226,75 @@ private void BuildDestinationToTransitionInfoTable()
}
}
+#if UNITY_EDITOR
+ private void ParseStateMachineStates(int layerIndex, ref AnimatorController animatorController, ref AnimatorStateMachine stateMachine)
+ {
+ for (int y = 0; y < stateMachine.states.Length; y++)
+ {
+ var animatorState = stateMachine.states[y].state;
+ for (int z = 0; z < animatorState.transitions.Length; z++)
+ {
+ var transition = animatorState.transitions[z];
+ if (transition.conditions.Length == 0 && transition.isExit)
+ {
+ // We don't need to worry about exit transitions with no conditions
+ continue;
+ }
+
+ foreach (var condition in transition.conditions)
+ {
+ var parameterName = condition.parameter;
+
+ var parameters = animatorController.parameters;
+ // Find the associated parameter for the condition
+ foreach (var parameter in parameters)
+ {
+ // Only process the associated parameter(s)
+ if (parameter.name != parameterName)
+ {
+ continue;
+ }
+
+ switch (parameter.type)
+ {
+ case AnimatorControllerParameterType.Trigger:
+ {
+
+ if (transition.destinationStateMachine != null)
+ {
+ var destinationStateMachine = transition.destinationStateMachine;
+ ParseStateMachineStates(layerIndex, ref animatorController, ref destinationStateMachine);
+ }
+ else if (transition.destinationState != null)
+ {
+ var transitionInfo = new TransitionStateinfo()
+ {
+ Layer = layerIndex,
+ OriginatingState = animatorState.nameHash,
+ DestinationState = transition.destinationState.nameHash,
+ TransitionDuration = transition.duration,
+ TriggerNameHash = parameter.nameHash,
+ TransitionIndex = z
+ };
+ TransitionStateInfoList.Add(transitionInfo);
+ }
+ else
+ {
+ Debug.LogError($"[{name}][Conditional Transition for {animatorState.name}] Conditional triggered transition has neither a DestinationState nor a DestinationStateMachine! This transition is not likely to synchronize properly. " +
+ $"Please file a GitHub issue about this error with details about your Animator's setup.");
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+
///
/// Creates the TransitionStateInfoList table
///
@@ -245,54 +314,8 @@ private void BuildTransitionStateInfoList()
for (int x = 0; x < animatorController.layers.Length; x++)
{
- var layer = animatorController.layers[x];
-
- for (int y = 0; y < layer.stateMachine.states.Length; y++)
- {
- var animatorState = layer.stateMachine.states[y].state;
- var transitions = layer.stateMachine.GetStateMachineTransitions(layer.stateMachine);
- for (int z = 0; z < animatorState.transitions.Length; z++)
- {
- var transition = animatorState.transitions[z];
- if (transition.conditions.Length == 0 && transition.isExit)
- {
- // We don't need to worry about exit transitions with no conditions
- continue;
- }
-
- foreach (var condition in transition.conditions)
- {
- var parameterName = condition.parameter;
- var parameters = animatorController.parameters;
- foreach (var parameter in parameters)
- {
- switch (parameter.type)
- {
- case AnimatorControllerParameterType.Trigger:
- {
- // Match the condition with an existing trigger
- if (parameterName == parameter.name)
- {
- var transitionInfo = new TransitionStateinfo()
- {
- Layer = x,
- OriginatingState = animatorState.nameHash,
- DestinationState = transition.destinationState.nameHash,
- TransitionDuration = transition.duration,
- TriggerNameHash = parameter.nameHash,
- TransitionIndex = z
- };
- TransitionStateInfoList.Add(transitionInfo);
- }
- break;
- }
- default:
- break;
- }
- }
- }
- }
- }
+ var stateMachine = animatorController.layers[x].stateMachine;
+ ParseStateMachineStates(x, ref animatorController, ref stateMachine);
}
#endif
}
From 353893b0e18fd71b771dd2c3382703bc81e80d52 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 09:57:29 -0600
Subject: [PATCH 02/18] fix
passing setTrigger bool to internal method.
---
com.unity.netcode.gameobjects/Components/NetworkAnimator.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index c6130ef93b..f6dd8df492 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -1342,7 +1342,7 @@ public void SetTrigger(int hash, bool setTrigger = true)
m_NetworkAnimatorStateChangeHandler.QueueTriggerUpdateToClient(animTriggerMessage);
if (!IsHost)
{
- InternalSetTrigger(hash);
+ InternalSetTrigger(hash, setTrigger);
}
}
else
@@ -1351,7 +1351,7 @@ public void SetTrigger(int hash, bool setTrigger = true)
m_NetworkAnimatorStateChangeHandler.QueueTriggerUpdateToServer(animTriggerMessage);
if (!IsServerAuthoritative())
{
- InternalSetTrigger(hash);
+ InternalSetTrigger(hash, setTrigger);
}
}
}
From c9ff07c933ac1085018ce6e8e081c190c68d2552 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 13:03:24 -0600
Subject: [PATCH 03/18] test manual
Manual test that validates this fix.
---
.../AnimatedCubeController.cs | 19 +-
.../CubeAnimatorController.controller | 394 ++++++++++++++++++
.../NetworkAnimatorTests/Cube_Attack1.anim | 53 +++
.../Cube_Attack1.anim.meta | 8 +
.../Cube_AttackEntry.anim | 348 ++++++++++++++++
.../Cube_AttackEntry.anim.meta | 8 +
.../NetworkAnimatorServerOwnerTest.unity | 2 +-
.../StateMachine.controller | 312 ++++++++++++++
.../StateMachine.controller.meta | 8 +
9 files changed, 1150 insertions(+), 2 deletions(-)
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim.meta
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim.meta
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller
create mode 100644 testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller.meta
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/AnimatedCubeController.cs b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/AnimatedCubeController.cs
index 1b946b0426..9a373837f6 100644
--- a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/AnimatedCubeController.cs
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/AnimatedCubeController.cs
@@ -165,7 +165,7 @@ private void DisplayTestIntValueIfChanged()
m_TestIntValue = testIntValue;
Debug.Log($"[{name}]TestInt value changed to = {m_TestIntValue}");
}
- var testFloatValue = m_Animator.GetInteger("TestFloat");
+ var testFloatValue = m_Animator.GetFloat("TestFloat");
if (m_TestFloatValue != testFloatValue)
{
m_TestFloatValue = testFloatValue;
@@ -173,6 +173,12 @@ private void DisplayTestIntValueIfChanged()
}
}
+ private void BeginAttack(int weaponType)
+ {
+ m_Animator.SetInteger("WeaponType", weaponType);
+ m_NetworkAnimator.SetTrigger("Attack");
+ }
+
private void LateUpdate()
{
@@ -212,6 +218,17 @@ private void LateUpdate()
Debug.Log($"[{name}] TestInt value = {m_TestIntValue}");
Debug.Log($"[{name}] TestInt value = {m_TestIntValue}");
}
+
+ if (Input.GetKeyDown(KeyCode.Alpha1))
+ {
+ BeginAttack(1);
+ }
+
+ if (Input.GetKeyDown(KeyCode.Alpha2))
+ {
+ BeginAttack(2);
+ }
+
}
}
}
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
index 8a16197348..c0933c9b9c 100644
--- a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
@@ -53,6 +53,90 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
+--- !u!1102 &-8670242204068593867
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Sword State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 6669492540378763990}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 0}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1101 &-8635157257723048354
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Attack
+ m_EventTreshold: 0
+ - m_ConditionMode: 6
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 1
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 2906018465462505426}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1102 &-7893489172437164963
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Idle
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 2421450886981756300}
+ - {fileID: -8635157257723048354}
+ - {fileID: 1193818909654150486}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 17a53a0b28d13e64fa2288443db6f977, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter: TestFloat
--- !u!1101 &-7881886588344925529
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -78,6 +162,32 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
+--- !u!1102 &-7521371395558379255
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: EntryState
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 0}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
--- !u!1101 &-6396453490711135124
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -128,6 +238,33 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
+--- !u!1102 &-5552815716159021554
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Dagger State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: -4078545696729557475}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: bd13c1363af7aaf4db0ffb085ac89d77, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
--- !u!1101 &-4455521266437619866
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -200,6 +337,28 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
+--- !u!1101 &-4078545696729557475
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 0}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 1
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!1101 &-3297482124579380833
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -287,6 +446,31 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 768f2c827b02cc240a588a902e6bbdba, type: 3}
m_Name:
m_EditorClassIdentifier:
+--- !u!1107 &-1730020701048245232
+AnimatorStateMachine:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Attack
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: -7893489172437164963}
+ m_Position: {x: 320, y: 120, z: 0}
+ m_ChildStateMachines:
+ - serializedVersion: 1
+ m_StateMachine: {fileID: 2218007576695770991}
+ m_Position: {x: 320, y: 290, z: 0}
+ m_AnyStateTransitions: []
+ m_EntryTransitions: []
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 50, y: 20, z: 0}
+ m_EntryPosition: {x: 50, y: 120, z: 0}
+ m_ExitPosition: {x: 600, y: 120, z: 0}
+ m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+ m_DefaultState: {fileID: -7893489172437164963}
--- !u!1102 &-1676030328622575462
AnimatorState:
serializedVersion: 6
@@ -506,6 +690,24 @@ AnimatorController:
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
+ - m_Name: Attack
+ m_Type: 9
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ - m_Name: WeaponType
+ m_Type: 3
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ - m_Name: Weapon
+ m_Type: 3
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -543,6 +745,18 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
+ - serializedVersion: 5
+ m_Name: Attack
+ m_StateMachine: {fileID: -1730020701048245232}
+ m_Mask: {fileID: 0}
+ m_Motions: []
+ m_Behaviours: []
+ m_BlendingMode: 0
+ m_SyncedLayerIndex: -1
+ m_DefaultWeight: 0.89
+ m_IKPass: 0
+ m_SyncedLayerAffectsTiming: 0
+ m_Controller: {fileID: 9100000}
--- !u!114 &252787195921886346
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -555,6 +769,28 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: beb3702bd4c8d274e9dffe0c6467eafb, type: 3}
m_Name:
m_EditorClassIdentifier:
+--- !u!1101 &412633353758942979
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 0}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 1
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!1101 &1138737138882309440
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -577,6 +813,34 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
+--- !u!1101 &1193818909654150486
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Attack
+ m_EventTreshold: 0
+ - m_ConditionMode: 4
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: -8670242204068593867}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!1101 &1678733063235620591
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -649,6 +913,65 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
+--- !u!1107 &2218007576695770991
+AnimatorStateMachine:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: AttackStateMachine
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: -7521371395558379255}
+ m_Position: {x: 190, y: 200, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: -5552815716159021554}
+ m_Position: {x: 950, y: -10, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: 2906018465462505426}
+ m_Position: {x: 740, y: 140, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: -8670242204068593867}
+ m_Position: {x: 570, y: 340, z: 0}
+ m_ChildStateMachines: []
+ m_AnyStateTransitions: []
+ m_EntryTransitions: []
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 210, y: 0, z: 0}
+ m_EntryPosition: {x: 210, y: 100, z: 0}
+ m_ExitPosition: {x: 980, y: 350, z: 0}
+ m_ParentStateMachinePosition: {x: 570, y: -10, z: 0}
+ m_DefaultState: {fileID: -7521371395558379255}
+--- !u!1101 &2421450886981756300
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Attack
+ m_EventTreshold: 0
+ - m_ConditionMode: 6
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 2
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: -5552815716159021554}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!1102 &2733578584814225138
AnimatorState:
serializedVersion: 6
@@ -678,6 +1001,55 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
+--- !u!1102 &2906018465462505426
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Axe State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: 412633353758942979}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: bd13c1363af7aaf4db0ffb085ac89d77, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1101 &3034737737321381672
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 0}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 1
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!114 &3353530078835762930
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -810,6 +1182,28 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
+--- !u!1101 &6669492540378763990
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 0}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 1
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!114 &6706570197837314945
MonoBehaviour:
m_ObjectHideFlags: 1
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim
new file mode 100644
index 0000000000..98094fdb39
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim
@@ -0,0 +1,53 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Cube_Attack1
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves: []
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 1
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves: []
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim.meta b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim.meta
new file mode 100644
index 0000000000..0f6419e592
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_Attack1.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 580deaba2054b7548a94508b34df4bd3
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim
new file mode 100644
index 0000000000..dae0d70432
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim
@@ -0,0 +1,348 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Cube_AttackEntry
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 15, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 1
+ value: {x: 15, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.083333336
+ value: {x: 0, y: 15, z: -7.7777786}
+ inSlope: {x: 0, y: 0, z: -159.99998}
+ outSlope: {x: 0, y: 0, z: -159.99998}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.25
+ value: {x: 0, y: 0, z: -30}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.5
+ value: {x: 0, y: 0, z: -22.222221}
+ inSlope: {x: 0, y: 0, z: 53.33333}
+ outSlope: {x: 0, y: 0, z: 53.33333}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 1
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: Cube
+ m_ScaleCurves: []
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - serializedVersion: 2
+ path: 2429296262
+ attribute: 1
+ script: {fileID: 0}
+ typeID: 4
+ customType: 0
+ isPPtrCurve: 0
+ - serializedVersion: 2
+ path: 0
+ attribute: 1
+ script: {fileID: 0}
+ typeID: 4
+ customType: 0
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 1
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 15
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 15
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.x
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.y
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.z
+ path:
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.x
+ path: Cube
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.083333336
+ value: 15
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.5
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.y
+ path: Cube
+ classID: 4
+ script: {fileID: 0}
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: -30
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalPosition.z
+ path: Cube
+ classID: 4
+ script: {fileID: 0}
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 1
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim.meta b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim.meta
new file mode 100644
index 0000000000..4982db8849
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/Cube_AttackEntry.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bd13c1363af7aaf4db0ffb085ac89d77
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/NetworkAnimatorServerOwnerTest.unity b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/NetworkAnimatorServerOwnerTest.unity
index a7ea13a65b..efd820815d 100644
--- a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/NetworkAnimatorServerOwnerTest.unity
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/NetworkAnimatorServerOwnerTest.unity
@@ -213,7 +213,6 @@ MonoBehaviour:
m_ProtocolType: 0
m_MaxPacketQueueSize: 128
m_MaxPayloadSize: 80000
- m_MaxSendQueueSize: 4200000
m_HeartbeatTimeoutMS: 500
m_ConnectTimeoutMS: 1000
m_MaxConnectAttempts: 60
@@ -500,6 +499,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name:
m_EditorClassIdentifier:
+ m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller
new file mode 100644
index 0000000000..5d6e2c505f
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller
@@ -0,0 +1,312 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1102 &-8158252389928768018
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Axe State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 0}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1102 &-6786692343528766295
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Dagger State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 580deaba2054b7548a94508b34df4bd3, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1102 &-3478573850388197571
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Idle State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: -517102763180383903}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 0}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1109 &-2658256043531025747
+AnimatorTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 1
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: -6786692343528766295}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 1
+--- !u!1101 &-517102763180383903
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: Attack
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 2690367497201289740}
+ m_DstState: {fileID: 0}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 0
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!91 &9100000
+AnimatorController:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: StateMachine
+ serializedVersion: 5
+ m_AnimatorParameters:
+ - m_Name: Attack
+ m_Type: 9
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ - m_Name: Weapon
+ m_Type: 3
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
+ m_AnimatorLayers:
+ - serializedVersion: 5
+ m_Name: Base Layer
+ m_StateMachine: {fileID: 7547463685220299261}
+ m_Mask: {fileID: 0}
+ m_Motions: []
+ m_Behaviours: []
+ m_BlendingMode: 0
+ m_SyncedLayerIndex: -1
+ m_DefaultWeight: 0
+ m_IKPass: 0
+ m_SyncedLayerAffectsTiming: 0
+ m_Controller: {fileID: 9100000}
+--- !u!114 &665907716810149847
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6b7cc4135e98c0a4f8312e78f62cad08, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ stateName: Dagger State
+--- !u!1107 &2690367497201289740
+AnimatorStateMachine:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Attack StateMachine
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: 6579122449132462628}
+ m_Position: {x: 420, y: 50, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: -6786692343528766295}
+ m_Position: {x: 420, y: 140, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: -8158252389928768018}
+ m_Position: {x: 420, y: 230, z: 0}
+ m_ChildStateMachines: []
+ m_AnyStateTransitions: []
+ m_EntryTransitions:
+ - {fileID: 5854091885202507219}
+ - {fileID: -2658256043531025747}
+ - {fileID: 5988110984181727037}
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 50, y: 20, z: 0}
+ m_EntryPosition: {x: 50, y: 90, z: 0}
+ m_ExitPosition: {x: 800, y: 120, z: 0}
+ m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+ m_DefaultState: {fileID: 6579122449132462628}
+--- !u!114 &3604600377306036033
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6b7cc4135e98c0a4f8312e78f62cad08, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ stateName: Sword State
+--- !u!114 &5781786355230459734
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6b7cc4135e98c0a4f8312e78f62cad08, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ stateName: Axe State
+--- !u!1109 &5854091885202507219
+AnimatorTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 6579122449132462628}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 1
+--- !u!1109 &5988110984181727037
+AnimatorTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 6
+ m_ConditionEvent: Weapon
+ m_EventTreshold: 2
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: -8158252389928768018}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 1
+--- !u!1102 &6579122449132462628
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Sword State
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 0}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
+--- !u!1107 &7547463685220299261
+AnimatorStateMachine:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Base Layer
+ m_ChildStates:
+ - serializedVersion: 1
+ m_State: {fileID: -3478573850388197571}
+ m_Position: {x: 475.4993, y: 116.61627, z: 0}
+ m_ChildStateMachines:
+ - serializedVersion: 1
+ m_StateMachine: {fileID: 2690367497201289740}
+ m_Position: {x: 470, y: 230, z: 0}
+ m_AnyStateTransitions: []
+ m_EntryTransitions: []
+ m_StateMachineTransitions: {}
+ m_StateMachineBehaviours: []
+ m_AnyStatePosition: {x: 50, y: 20, z: 0}
+ m_EntryPosition: {x: 50, y: 120, z: 0}
+ m_ExitPosition: {x: 800, y: 120, z: 0}
+ m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+ m_DefaultState: {fileID: -3478573850388197571}
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller.meta b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller.meta
new file mode 100644
index 0000000000..62cdebed9d
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/StateMachine.controller.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bd7693554bcf5da4793506b0f16ec373
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
From 870be01c8af0fc1d28a7352e8a165522a54da452 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 14:06:32 -0600
Subject: [PATCH 04/18] fix
Only send animation updates to clients and not host client when animation state changes.
---
com.unity.netcode.gameobjects/Components/NetworkAnimator.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index f6dd8df492..af387c784e 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -840,6 +840,11 @@ internal void CheckForAnimatorChanges()
}
else
{
+ // Just notify all remote clients and not the local server
+ m_ClientSendList.Clear();
+ m_ClientSendList.AddRange(NetworkManager.ConnectedClientsIds);
+ m_ClientSendList.Remove(NetworkManager.LocalClientId);
+ m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
SendAnimStateClientRpc(m_AnimationMessage);
}
}
From fb975dc1cbb838e939aeaf7310d2a068c646cfde Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 14:07:41 -0600
Subject: [PATCH 05/18] test
MTT-5083
Updating test to validate states defined within a destinationStateMachine are triggering.
---
.../Runtime/Animation/NetworkAnimatorTests.cs | 34 +++++++++++++++++++
.../Animation/Resources/AnimatorObject.prefab | 22 ++++++++++--
.../Resources/OwnerAnimatorObject.prefab | 22 ++++++++++--
3 files changed, 74 insertions(+), 4 deletions(-)
diff --git a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
index 2412a11e93..0d39d84de2 100644
--- a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
+++ b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
@@ -324,6 +324,40 @@ public IEnumerator TriggerUpdateTests([Values] OwnerShipMode ownerShipMode, [Val
rotateToggle = !rotateToggle;
}
#endif
+ CheckStateEnterCount.ResetTest();
+ if (m_EnableVerboseDebug)
+ {
+ var retryTrigger = true;
+ var timeOutHelper = new TimeoutHelper(1.0f);
+ var count = 0;
+ while (retryTrigger)
+ {
+ VerboseDebug($"Current Trigger State: {animatorTestHelper.GetCurrentTriggerState()}");
+ VerboseDebug($"Setting Attack Trigger ");
+ var animator = animatorTestHelper.GetAnimator();
+ animator.SetInteger("WeaponType", 1);
+ animatorTestHelper.SetTrigger("Attack");
+ VerboseDebug($"New Trigger State: {animatorTestHelper.GetCurrentTriggerState()}");
+ // Wait for all triggers to fire
+ yield return WaitForConditionOrTimeOut(() => AllTriggersDetected(ownerShipMode), timeOutHelper);
+ retryTrigger = timeOutHelper.TimedOut;
+ if (retryTrigger)
+ {
+ count++;
+ Debug.LogWarning($"[{ownerShipMode}][{count}] Resending trigger!");
+ }
+ }
+ }
+ else
+ {
+ var animator = animatorTestHelper.GetAnimator();
+ animator.SetInteger("WeaponType", 1);
+ animatorTestHelper.SetTrigger("Attack");
+ // Wait for all triggers to fire
+ yield return WaitForConditionOrTimeOut(() => AllTriggersDetected(ownerShipMode));
+ AssertOnTimeout($"Timed out waiting for all triggers to match!");
+ }
+
AnimatorTestHelper.IsTriggerTest = false;
VerboseDebug($" ------------------ Trigger Test [{TriggerTest.Iteration}][{ownerShipMode}] Stopping ------------------ ");
}
diff --git a/testproject/Assets/Tests/Runtime/Animation/Resources/AnimatorObject.prefab b/testproject/Assets/Tests/Runtime/Animation/Resources/AnimatorObject.prefab
index d3c2768550..cd34d363d9 100644
--- a/testproject/Assets/Tests/Runtime/Animation/Resources/AnimatorObject.prefab
+++ b/testproject/Assets/Tests/Runtime/Animation/Resources/AnimatorObject.prefab
@@ -378,7 +378,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e8d0727d5ae3244e3b569694d3912374, type: 3}
m_Name:
m_EditorClassIdentifier:
- TableData:
+ TransitionStateInfoList:
- Layer: 0
OriginatingState: 2081823275
DestinationState: -570305638
@@ -394,9 +394,27 @@ MonoBehaviour:
- Layer: 1
OriginatingState: 2081823275
DestinationState: -623385122
- TransitionDuration: 0.8019884
+ TransitionDuration: 2.2832582
TriggerNameHash: -623385122
TransitionIndex: 0
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: -1829531531
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 0
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: 705160537
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 1
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: 801385362
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 2
m_Animator: {fileID: 6515743261518512780}
--- !u!114 &-8876216387850298050
MonoBehaviour:
diff --git a/testproject/Assets/Tests/Runtime/Animation/Resources/OwnerAnimatorObject.prefab b/testproject/Assets/Tests/Runtime/Animation/Resources/OwnerAnimatorObject.prefab
index 9d5cd94cce..33c0960ba1 100644
--- a/testproject/Assets/Tests/Runtime/Animation/Resources/OwnerAnimatorObject.prefab
+++ b/testproject/Assets/Tests/Runtime/Animation/Resources/OwnerAnimatorObject.prefab
@@ -378,7 +378,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f6a3556fb5f3bee4e8a0fb88acff87ff, type: 3}
m_Name:
m_EditorClassIdentifier:
- TableData:
+ TransitionStateInfoList:
- Layer: 0
OriginatingState: 2081823275
DestinationState: -570305638
@@ -394,9 +394,27 @@ MonoBehaviour:
- Layer: 1
OriginatingState: 2081823275
DestinationState: -623385122
- TransitionDuration: 0.8019884
+ TransitionDuration: 2.2832582
TriggerNameHash: -623385122
TransitionIndex: 0
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: -1829531531
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 0
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: 705160537
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 1
+ - Layer: 3
+ OriginatingState: 2081823275
+ DestinationState: 801385362
+ TransitionDuration: 0.25
+ TriggerNameHash: 1080829965
+ TransitionIndex: 2
m_Animator: {fileID: 6515743261518512780}
--- !u!114 &-8876216387850298050
MonoBehaviour:
From 2a49e2bc6e427bcc9fcec099e3663eca0bac44c1 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 14:10:09 -0600
Subject: [PATCH 06/18] update
MTT-5083
Adding entry for this fix.
---
com.unity.netcode.gameobjects/CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md
index 72765d9252..f99b7ec8ea 100644
--- a/com.unity.netcode.gameobjects/CHANGELOG.md
+++ b/com.unity.netcode.gameobjects/CHANGELOG.md
@@ -19,6 +19,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Fixed
+- Fixed `NetworkAnimator` issue where it was not checking for `AnimatorStateTtansition.destinationStateMachine` and any possible sub-states defined within it.
- Custom messages are now properly received by the local client when they're sent while running in host mode. (#2296)
- Fixed issue where the host would receive more than one event completed notification when loading or unloading a scene only when no clients were connected. (#2292)
- Fixed an issue in `UnityTransport` where an error would be logged if the 'Use Encryption' flag was enabled with a Relay configuration that used a secure protocol. (#2289)
From b379dd2769526ab0d4123abe7d3a41dfb28cb3dc Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 14 Nov 2022 14:16:51 -0600
Subject: [PATCH 07/18] update
MTT-5083
Adding the PR number to the changelog entry.
---
com.unity.netcode.gameobjects/CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md
index f99b7ec8ea..7c001468f9 100644
--- a/com.unity.netcode.gameobjects/CHANGELOG.md
+++ b/com.unity.netcode.gameobjects/CHANGELOG.md
@@ -19,7 +19,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Fixed
-- Fixed `NetworkAnimator` issue where it was not checking for `AnimatorStateTtansition.destinationStateMachine` and any possible sub-states defined within it.
+- Fixed `NetworkAnimator` issue where it was not checking for `AnimatorStateTtansition.destinationStateMachine` and any possible sub-states defined within it. (#2309)
- Custom messages are now properly received by the local client when they're sent while running in host mode. (#2296)
- Fixed issue where the host would receive more than one event completed notification when loading or unloading a scene only when no clients were connected. (#2292)
- Fixed an issue in `UnityTransport` where an error would be logged if the 'Use Encryption' flag was enabled with a Relay configuration that used a secure protocol. (#2289)
From 4b6ed27633d0ffb971499a7a5a4b84af68cc5a1f Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Fri, 18 Nov 2022 18:17:08 -0600
Subject: [PATCH 08/18] update and fix
This includes some updates to NetworkAnimator that will remove the need to synchronize client's using RPCs but instead use the new OnSynchronize method.
Fixed an issue with using pooled objects and when specific properties are cleaned during despawn and destroy.
---
.../Components/NetworkAnimator.cs | 343 ++++++++++--------
1 file changed, 190 insertions(+), 153 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index af387c784e..3291424381 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -23,12 +23,6 @@ internal class NetworkAnimatorStateChangeHandler : INetworkUpdateSystem
///
private void FlushMessages()
{
- foreach (var clientId in m_ClientsToSynchronize)
- {
- m_NetworkAnimator.ServerSynchronizeNewPlayer(clientId);
- }
- m_ClientsToSynchronize.Clear();
-
foreach (var sendEntry in m_SendParameterUpdates)
{
m_NetworkAnimator.SendParametersUpdateClientRpc(sendEntry.ParametersUpdateMessage, sendEntry.ClientRpcParams);
@@ -64,9 +58,10 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
}
// Everyone applies any parameters updated
- foreach (var parameterUpdate in m_ProcessParameterUpdates)
+ for (int i = 0; i < m_ProcessParameterUpdates.Count; i++)
{
- m_NetworkAnimator.UpdateParameters(parameterUpdate);
+ var parameterUpdate = m_ProcessParameterUpdates[i];
+ m_NetworkAnimator.UpdateParameters(ref parameterUpdate);
}
m_ProcessParameterUpdates.Clear();
@@ -80,20 +75,6 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
}
}
- ///
- /// Clients that need to be synchronized to the relative Animator
- ///
- private List m_ClientsToSynchronize = new List();
-
- ///
- /// When a new client is connected, they are added to the
- /// m_ClientsToSynchronize list.
- ///
- internal void SynchronizeClient(ulong clientId)
- {
- m_ClientsToSynchronize.Add(clientId);
- }
-
///
/// A pending outgoing Animation update for (n) clients
///
@@ -157,13 +138,6 @@ internal void QueueTriggerUpdateToServer(NetworkAnimator.AnimationTriggerMessage
m_SendTriggerUpdates.Add(new TriggerUpdate() { AnimationTriggerMessage = animationTriggerMessage, SendToServer = true });
}
- private Queue m_AnimationMessageQueue = new Queue();
-
- internal void AddAnimationMessageToProcessQueue(NetworkAnimator.AnimationMessage message)
- {
- m_AnimationMessageQueue.Enqueue(message);
- }
-
internal void DeregisterUpdate()
{
NetworkUpdateLoop.UnregisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate);
@@ -479,6 +453,33 @@ public void NetworkSerialize(BufferSerializer serializer) where T : IReade
}
}
+ ///
+ /// Used to handle the initial NetworkAnimator synchronization
+ ///
+ ///
+ /// Note: For reading already serialized data only
+ ///
+ private class AnimationSynchronizationData
+ {
+ public ParametersUpdateMessage Parameters = new ParametersUpdateMessage();
+ public AnimationMessage AnimationStates = new AnimationMessage();
+
+ private NetworkAnimator m_NetworkAnimator;
+
+ public void ReadSynchronizationData(ref BufferSerializer serializer) where T : IReaderWriter
+ {
+ serializer.SerializeValue(ref Parameters);
+ m_NetworkAnimator.UpdateParameters(ref Parameters);
+ serializer.SerializeValue(ref AnimationStates);
+ m_NetworkAnimator.HandleAnimStateUpdate(ref AnimationStates);
+ }
+
+ public AnimationSynchronizationData(NetworkAnimator networkAnimator)
+ {
+ m_NetworkAnimator = networkAnimator;
+ }
+ }
+
[SerializeField] private Animator m_Animator;
public Animator Animator
@@ -511,8 +512,22 @@ protected virtual bool OnIsServerAuthoritative()
private int[] m_AnimationHash;
private float[] m_LayerWeights;
private static byte[] s_EmptyArray = new byte[] { };
+ private List m_ParametersToUpdate;
+ private List m_ClientSendList;
+ private ClientRpcParams m_ClientRpcParams;
+ private AnimationMessage m_AnimationMessage;
private NetworkAnimatorStateChangeHandler m_NetworkAnimatorStateChangeHandler;
+ ///
+ /// Used for the initial client-side synchronization of NetworkAnimator
+ ///
+ private AnimationSynchronizationData m_AnimationSynchronizationData;
+
+ ///
+ /// Used for integration test purposes
+ ///
+ internal List SynchronizationStateInfo;
+
private unsafe struct AnimatorParamCache
{
internal int Hash;
@@ -542,75 +557,44 @@ static AnimationParamEnumWrapper()
}
}
- private void Cleanup()
+ ///
+ /// Only things instantiated/created within OnNetworkSpawn should be
+ /// cleaned up here.
+ ///
+ private void SpawnCleanup()
{
if (m_NetworkAnimatorStateChangeHandler != null)
{
m_NetworkAnimatorStateChangeHandler.DeregisterUpdate();
m_NetworkAnimatorStateChangeHandler = null;
}
+ }
- if (m_CachedNetworkManager != null)
- {
- m_CachedNetworkManager.OnClientConnectedCallback -= OnClientConnectedCallback;
- }
+ public override void OnDestroy()
+ {
+ SpawnCleanup();
if (m_CachedAnimatorParameters != null && m_CachedAnimatorParameters.IsCreated)
{
m_CachedAnimatorParameters.Dispose();
}
+
if (m_ParameterWriter.IsInitialized)
{
m_ParameterWriter.Dispose();
}
- }
-
- public override void OnDestroy()
- {
- Cleanup();
base.OnDestroy();
}
- private List m_ParametersToUpdate;
- private List m_ClientSendList;
- private ClientRpcParams m_ClientRpcParams;
- private AnimationMessage m_AnimationMessage;
-
- ///
- /// Used for integration test to validate that the
- /// AnimationMessage.AnimationStates remains the same
- /// size as the layer count.
- ///
- internal AnimationMessage GetAnimationMessage()
- {
- return m_AnimationMessage;
- }
-
- // Only used in Cleanup
- private NetworkManager m_CachedNetworkManager;
-
- ///
- public override void OnNetworkSpawn()
+ private void Awake()
{
int layers = m_Animator.layerCount;
-
// Initializing the below arrays for everyone handles an issue
// when running in owner authoritative mode and the owner changes.
m_TransitionHash = new int[layers];
m_AnimationHash = new int[layers];
m_LayerWeights = new float[layers];
- if (IsServer)
- {
- m_ClientSendList = new List(128);
- m_ClientRpcParams = new ClientRpcParams();
- m_ClientRpcParams.Send = new ClientRpcSendParams();
- m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
-
- // Cache the NetworkManager instance to remove the OnClientConnectedCallback subscription
- m_CachedNetworkManager = NetworkManager;
- NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback;
- }
// We initialize the m_AnimationMessage for all instances in the event that
// ownership or authority changes during runtime.
m_AnimationMessage = new AnimationMessage();
@@ -635,6 +619,7 @@ public override void OnNetworkSpawn()
var parameters = m_Animator.parameters;
m_CachedAnimatorParameters = new NativeArray(parameters.Length, Allocator.Persistent);
m_ParametersToUpdate = new List(parameters.Length);
+
for (var i = 0; i < parameters.Length; i++)
{
var parameter = parameters[i];
@@ -675,102 +660,152 @@ public override void OnNetworkSpawn()
m_CachedAnimatorParameters[i] = cacheParam;
}
+
+ m_AnimationSynchronizationData = new AnimationSynchronizationData(this);
+ }
+
+ ///
+ /// Used for integration test to validate that the
+ /// AnimationMessage.AnimationStates remains the same
+ /// size as the layer count.
+ ///
+ internal AnimationMessage GetAnimationMessage()
+ {
+ return m_AnimationMessage;
+ }
+
+ ///
+ public override void OnNetworkSpawn()
+ {
+ if (IsServer)
+ {
+ m_ClientSendList = new List(128);
+ m_ClientRpcParams = new ClientRpcParams();
+ m_ClientRpcParams.Send = new ClientRpcSendParams();
+ m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
+ }
+
+ // Create a handler for state changes
m_NetworkAnimatorStateChangeHandler = new NetworkAnimatorStateChangeHandler(this);
}
///
public override void OnNetworkDespawn()
{
- Cleanup();
+ SpawnCleanup();
}
///
- /// Synchronizes newly joined players
+ /// Wries all parameter and state information needed to initially synchronize a client
///
- internal void ServerSynchronizeNewPlayer(ulong playerId)
+ private void WriteSynchronizationData(ref BufferSerializer serializer) where T : IReaderWriter
{
- m_ClientSendList.Clear();
- m_ClientSendList.Add(playerId);
- m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
- // With synchronization we send all parameters
- m_ParametersToUpdate.Clear();
- for (int i = 0; i < m_CachedAnimatorParameters.Length; i++)
+ // Parameter synchronization
{
- m_ParametersToUpdate.Add(i);
+ // We include all parameters for the initial synchronization
+ m_ParametersToUpdate.Clear();
+ for (int i = 0; i < m_CachedAnimatorParameters.Length; i++)
+ {
+ m_ParametersToUpdate.Add(i);
+ }
+ // Write, apply, and serialize
+ WriteParameters(ref m_ParameterWriter);
+ var parametersMessage = new ParametersUpdateMessage
+ {
+ Parameters = m_ParameterWriter.ToArray()
+ };
+ serializer.SerializeValue(ref parametersMessage);
}
- SendParametersUpdate(m_ClientRpcParams);
- // Reset the dirty count before synchronizing the newly connected client with all layers
- m_AnimationMessage.IsDirtyCount = 0;
-
- for (int layer = 0; layer < m_Animator.layerCount; layer++)
+ // Animation state synchronization
{
- AnimatorStateInfo st = m_Animator.GetCurrentAnimatorStateInfo(layer);
- var stateHash = st.fullPathHash;
- var normalizedTime = st.normalizedTime;
- var isInTransition = m_Animator.IsInTransition(layer);
-
- // Grab one of the available AnimationState entries so we can fill it with the current
- // layer's animation state.
- var animationState = m_AnimationMessage.AnimationStates[layer];
-
- // Synchronizing transitions with trigger conditions for late joining clients is now
- // handled by cross fading between the late joining client's current layer's AnimationState
- // and the transition's destination AnimationState.
- if (isInTransition)
- {
- var tt = m_Animator.GetAnimatorTransitionInfo(layer);
- var nextState = m_Animator.GetNextAnimatorStateInfo(layer);
+ // Reset the dirty count before synchronizing the newly connected client with all layers
+ m_AnimationMessage.IsDirtyCount = 0;
- if (nextState.length > 0)
+ for (int layer = 0; layer < m_Animator.layerCount; layer++)
+ {
+ var synchronizationStateInfo = m_Animator.GetCurrentAnimatorStateInfo(layer);
+ if (SynchronizationStateInfo != null)
{
- var nextStateTotalSpeed = nextState.speed * nextState.speedMultiplier;
- var nextStateAdjustedLength = nextState.length * nextStateTotalSpeed;
- // TODO: We need to get the transition curve for the target state as well as some
- // reasonable RTT estimate in order to get a more precise normalized synchronization time
- var transitionTime = Mathf.Min(tt.duration, tt.duration * tt.normalizedTime) * 0.5f;
- normalizedTime = Mathf.Min(1.0f, transitionTime > 0.0f ? transitionTime / nextStateAdjustedLength : 0.0f);
+ SynchronizationStateInfo.Add(synchronizationStateInfo);
}
- else
+ var stateHash = synchronizationStateInfo.fullPathHash;
+ var normalizedTime = synchronizationStateInfo.normalizedTime;
+ var isInTransition = m_Animator.IsInTransition(layer);
+
+ // Grab one of the available AnimationState entries so we can fill it with the current
+ // layer's animation state.
+ var animationState = m_AnimationMessage.AnimationStates[layer];
+
+ // Synchronizing transitions with trigger conditions for late joining clients is now
+ // handled by cross fading between the late joining client's current layer's AnimationState
+ // and the transition's destination AnimationState.
+ if (isInTransition)
{
- normalizedTime = 0.0f;
- }
- stateHash = nextState.fullPathHash;
+ var tt = m_Animator.GetAnimatorTransitionInfo(layer);
+ var nextState = m_Animator.GetNextAnimatorStateInfo(layer);
- // Use the destination state to transition info lookup table to see if this is a transition we can
- // synchronize using cross fading
- if (m_DestinationStateToTransitioninfo.ContainsKey(layer))
- {
- if (m_DestinationStateToTransitioninfo[layer].ContainsKey(nextState.shortNameHash))
+ if (nextState.length > 0)
+ {
+ var nextStateTotalSpeed = nextState.speed * nextState.speedMultiplier;
+ var nextStateAdjustedLength = nextState.length * nextStateTotalSpeed;
+ // TODO: We need to get the transition curve for the target state as well as some
+ // reasonable RTT estimate in order to get a more precise normalized synchronization time
+ var transitionTime = Mathf.Min(tt.duration, tt.duration * tt.normalizedTime) * 0.5f;
+ normalizedTime = Mathf.Min(1.0f, transitionTime > 0.0f ? transitionTime / nextStateAdjustedLength : 0.0f);
+ }
+ else
{
- var destinationInfo = m_DestinationStateToTransitioninfo[layer][nextState.shortNameHash];
- stateHash = destinationInfo.OriginatingState;
- // Set the destination state to cross fade to from the originating state
- animationState.DestinationStateHash = destinationInfo.DestinationState;
+ normalizedTime = 0.0f;
+ }
+ stateHash = nextState.fullPathHash;
+
+ // Use the destination state to transition info lookup table to see if this is a transition we can
+ // synchronize using cross fading
+ if (m_DestinationStateToTransitioninfo.ContainsKey(layer))
+ {
+ if (m_DestinationStateToTransitioninfo[layer].ContainsKey(nextState.shortNameHash))
+ {
+ var destinationInfo = m_DestinationStateToTransitioninfo[layer][nextState.shortNameHash];
+ stateHash = destinationInfo.OriginatingState;
+ // Set the destination state to cross fade to from the originating state
+ animationState.DestinationStateHash = destinationInfo.DestinationState;
+ }
}
}
- }
- animationState.Transition = isInTransition; // The only time this could be set to true
- animationState.StateHash = stateHash; // When a transition, this is the originating/starting state
- animationState.NormalizedTime = normalizedTime;
- animationState.Layer = layer;
- animationState.Weight = m_LayerWeights[layer];
+ animationState.Transition = isInTransition; // The only time this could be set to true
+ animationState.StateHash = stateHash; // When a transition, this is the originating/starting state
+ animationState.NormalizedTime = normalizedTime;
+ animationState.Layer = layer;
+ animationState.Weight = m_LayerWeights[layer];
- // Apply the changes
- m_AnimationMessage.AnimationStates[layer] = animationState;
+ // Apply the changes
+ m_AnimationMessage.AnimationStates[layer] = animationState;
+ }
+ // Send all animation states
+ m_AnimationMessage.IsDirtyCount = m_Animator.layerCount;
+ m_AnimationMessage.NetworkSerialize(serializer);
}
- // Send all animation states
- m_AnimationMessage.IsDirtyCount = m_Animator.layerCount;
- SendAnimStateClientRpc(m_AnimationMessage, m_ClientRpcParams);
}
///
- /// Required for the server to synchronize newly joining players
+ /// Used to synchronize newly joined clients
///
- private void OnClientConnectedCallback(ulong playerId)
+ protected override void OnSynchronize(ref BufferSerializer serializer)
{
- m_NetworkAnimatorStateChangeHandler.SynchronizeClient(playerId);
+ if (serializer.IsWriter)
+ {
+ WriteSynchronizationData(ref serializer);
+ }
+ else
+ {
+ if (m_AnimationSynchronizationData == null)
+ {
+ m_AnimationSynchronizationData = new AnimationSynchronizationData(this);
+ }
+ m_AnimationSynchronizationData.ReadSynchronizationData(ref serializer);
+ }
}
///
@@ -852,10 +887,7 @@ internal void CheckForAnimatorChanges()
private void SendParametersUpdate(ClientRpcParams clientRpcParams = default, bool sendDirect = false)
{
- m_ParameterWriter.Seek(0);
- m_ParameterWriter.Truncate();
-
- WriteParameters(m_ParameterWriter, sendDirect);
+ WriteParameters(ref m_ParameterWriter);
var parametersMessage = new ParametersUpdateMessage
{
@@ -989,8 +1021,10 @@ private bool CheckAnimStateChanged(out int stateHash, out float normalizedTime,
/// This uses the m_ParametersToUpdate list to write out only
/// the parameters that have changed
///
- private unsafe void WriteParameters(FastBufferWriter writer, bool sendCacheState)
+ private unsafe void WriteParameters(ref FastBufferWriter writer)
{
+ writer.Seek(0);
+ writer.Truncate();
// Write how many parameter entries we are going to write
BytePacker.WriteValuePacked(writer, (uint)m_ParametersToUpdate.Count);
foreach (var parameterIndex in m_ParametersToUpdate)
@@ -1077,7 +1111,7 @@ private unsafe void ReadParameters(FastBufferReader reader)
///
/// Applies the ParametersUpdateMessage state to the Animator
///
- internal unsafe void UpdateParameters(ParametersUpdateMessage parametersUpdate)
+ internal unsafe void UpdateParameters(ref ParametersUpdateMessage parametersUpdate)
{
if (parametersUpdate.Parameters != null && parametersUpdate.Parameters.Length != 0)
{
@@ -1162,7 +1196,7 @@ private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parame
{
return;
}
- UpdateParameters(parametersUpdate);
+ UpdateParameters(ref parametersUpdate);
if (NetworkManager.ConnectedClientsIds.Count > (IsHost ? 2 : 1))
{
m_ClientSendList.Clear();
@@ -1211,7 +1245,6 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animationMessage, Se
UpdateAnimationState(animationState);
}
- m_NetworkAnimatorStateChangeHandler.AddAnimationMessageToProcessQueue(animationMessage);
if (NetworkManager.ConnectedClientsIds.Count > (IsHost ? 2 : 1))
{
m_ClientSendList.Clear();
@@ -1224,6 +1257,18 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animationMessage, Se
}
}
+ internal void HandleAnimStateUpdate(ref AnimationMessage animationMessage)
+ {
+ var isServerAuthoritative = IsServerAuthoritative();
+ if (!isServerAuthoritative && !IsOwner || isServerAuthoritative)
+ {
+ foreach (var animationState in animationMessage.AnimationStates)
+ {
+ UpdateAnimationState(animationState);
+ }
+ }
+ }
+
///
/// Internally-called RPC client receiving function to update some animation state on a client
///
@@ -1239,15 +1284,7 @@ private unsafe void SendAnimStateClientRpc(AnimationMessage animationMessage, Cl
}
return;
}
-
- var isServerAuthoritative = IsServerAuthoritative();
- if (!isServerAuthoritative && !IsOwner || isServerAuthoritative)
- {
- foreach (var animationState in animationMessage.AnimationStates)
- {
- UpdateAnimationState(animationState);
- }
- }
+ HandleAnimStateUpdate(ref animationMessage);
}
///
From 8810b3162b41f804da576066357e243493830c75 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Fri, 18 Nov 2022 18:20:08 -0600
Subject: [PATCH 09/18] test
Made components visible to testproject again although I might try to figure out a better way to handle these two ways of testing.
Updated the NetworkAnimatorTests to acquire the state info from NetworkAnimator.SynchronizationStateInfo.
---
.../Components/AssemblyInfo.cs | 2 +-
.../Runtime/Animation/AnimatorTestHelper.cs | 9 +++---
.../Runtime/Animation/NetworkAnimatorTests.cs | 29 +++----------------
3 files changed, 10 insertions(+), 30 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
index 98d32cab6c..cf2016046b 100644
--- a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
@@ -5,6 +5,6 @@
[assembly: InternalsVisibleTo("Unity.Netcode.Editor.CodeGen")]
[assembly: InternalsVisibleTo("Unity.Netcode.Editor")]
[assembly: InternalsVisibleTo("TestProject.EditorTests")]
-[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
#endif
+[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
diff --git a/testproject/Assets/Tests/Runtime/Animation/AnimatorTestHelper.cs b/testproject/Assets/Tests/Runtime/Animation/AnimatorTestHelper.cs
index 4819142000..906426460b 100644
--- a/testproject/Assets/Tests/Runtime/Animation/AnimatorTestHelper.cs
+++ b/testproject/Assets/Tests/Runtime/Animation/AnimatorTestHelper.cs
@@ -29,14 +29,10 @@ private void Awake()
m_NetworkAnimator = GetComponent();
}
- // Since the com.unity.netcode.components does not allow test project to access its internals
- // during runtime, this is only used when running test runner from within the editor
-#if UNITY_EDITOR
internal int GetAnimatorStateCount()
{
return m_NetworkAnimator.GetAnimationMessage().AnimationStates.Count;
}
-#endif
public override void OnNetworkSpawn()
{
@@ -152,5 +148,10 @@ public Animator GetAnimator()
{
return m_Animator;
}
+
+ public NetworkAnimator GetNetworkAnimator()
+ {
+ return m_NetworkAnimator;
+ }
}
}
diff --git a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
index 0d39d84de2..fd57d55055 100644
--- a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
+++ b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
@@ -257,12 +257,9 @@ public IEnumerator TriggerUpdateTests([Values] OwnerShipMode ownerShipMode, [Val
var animatorTestHelper = ownerShipMode == OwnerShipMode.ClientOwner ? AnimatorTestHelper.ClientSideInstances[m_ClientNetworkManagers[0].LocalClientId] : AnimatorTestHelper.ServerSideInstance;
var layerCount = animatorTestHelper.GetAnimator().layerCount;
- // Since the com.unity.netcode.components does not allow test project to access its internals
- // during runtime, this is only used when running test runner from within the editor
-#if UNITY_EDITOR
var animationStateCount = animatorTestHelper.GetAnimatorStateCount();
Assert.True(layerCount == animationStateCount, $"AnimationState count {animationStateCount} does not equal the layer count {layerCount}!");
-#endif
+
if (authoritativeMode == AuthoritativeMode.ServerAuth)
{
animatorTestHelper = AnimatorTestHelper.ServerSideInstance;
@@ -473,6 +470,7 @@ public IEnumerator LateJoinTriggerSynchronizationTest([Values] OwnerShipMode own
[UnityTest]
public IEnumerator LateJoinSynchronizationTest([Values] OwnerShipMode ownerShipMode, [Values] AuthoritativeMode authoritativeMode)
{
+ m_EnableVerboseDebug = true;
VerboseDebug($" ++++++++++++++++++ Late Join Synchronization Test [{TriggerTest.Iteration}][{ownerShipMode}] Starting ++++++++++++++++++ ");
StateSyncTest.IsVerboseDebug = m_EnableVerboseDebug;
@@ -511,7 +509,7 @@ public IEnumerator LateJoinSynchronizationTest([Values] OwnerShipMode ownerShipM
yield return WaitForConditionOrTimeOut(() => Mathf.Approximately(firstClientAnimatorTestHelper.transform.rotation.eulerAngles.y, 180.0f));
AssertOnTimeout($"Timed out waiting for client-side cube to reach 180.0f!");
- m_ServerNetworkManager.OnClientConnectedCallback += Server_OnClientConnectedCallback;
+ AnimatorTestHelper.ServerSideInstance.GetNetworkAnimator().SynchronizationStateInfo = new List();
// Create and join a new client (late joining client)
yield return CreateAndStartNewClient();
@@ -538,25 +536,6 @@ public IEnumerator LateJoinSynchronizationTest([Values] OwnerShipMode ownerShipM
VerboseDebug($" ------------------ Late Join Synchronization Test [{TriggerTest.Iteration}][{ownerShipMode}] Stopping ------------------ ");
}
- ///
- /// Update Server Side Animator Layer's AnimationStateInfo when late joining
- /// client connects to get the values being sent to the late joining client
- /// during NetworkAnimator synchronization.
- ///
- private void Server_OnClientConnectedCallback(ulong obj)
- {
- m_ServerNetworkManager.OnClientConnectedCallback -= Server_OnClientConnectedCallback;
- var serverAnimator = AnimatorTestHelper.ServerSideInstance.GetAnimator();
-
- // Only update the 3rd layer since this is where we want to assure all values are synchronized to the
- // same values upon the client connecting.
- var index = 2;
- Assert.True(StateSyncTest.StatesEntered.ContainsKey(m_ServerNetworkManager.LocalClientId), $"Server does not have an entry for layer {index}!");
- var animationStateInfo = serverAnimator.GetCurrentAnimatorStateInfo(index);
- StateSyncTest.StatesEntered[m_ServerNetworkManager.LocalClientId][index] = animationStateInfo;
- VerboseDebug($"[{index}][STATE-REFRESH][{m_ServerNetworkManager.name}] updated state normalized time ({animationStateInfo.normalizedTime}) to compare with late joined client.");
- }
-
///
/// Used by: LateJoinSynchronizationTest
/// Wait condition method that compares the states of the late joined client
@@ -581,7 +560,7 @@ private bool LateJoinClientSynchronized()
// We only check the last layer for this test as the other layers will have their normalized time slightly out of sync
var index = 2;
- var serverAnimState = serverStates[index];
+ var serverAnimState = AnimatorTestHelper.ServerSideInstance.GetNetworkAnimator().SynchronizationStateInfo[index];// serverStates[index];
if (clientStates[index].shortNameHash != serverAnimState.shortNameHash)
{
VerboseDebug($"[Hash Fail] Server({serverAnimState.shortNameHash}) | Client({clientStates[index].shortNameHash}) ");
From 07f894246f245fa5c10ff38232f2b9ee008aa871 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Sun, 20 Nov 2022 13:40:59 -0600
Subject: [PATCH 10/18] fix
Making the NGO Components AssemblyInfo adjustment only expose internals if NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY is defined.
---
.../Components/AssemblyInfo.cs | 3 +
.../ProjectSettings/ProjectSettings.asset | 226 +++++++++---------
2 files changed, 116 insertions(+), 113 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
index cf2016046b..7b12fdb54c 100644
--- a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
@@ -6,5 +6,8 @@
[assembly: InternalsVisibleTo("Unity.Netcode.Editor")]
[assembly: InternalsVisibleTo("TestProject.EditorTests")]
#endif
+
+#if NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
+#endif
[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset
index ec37042b36..93f61c3696 100644
--- a/testproject/ProjectSettings/ProjectSettings.asset
+++ b/testproject/ProjectSettings/ProjectSettings.asset
@@ -196,7 +196,7 @@ PlayerSettings:
rgba: 0
iOSLaunchScreenFillPct: 100
iOSLaunchScreenSize: 100
- iOSLaunchScreenCustomXibPath:
+ iOSLaunchScreenCustomXibPath:
iOSLaunchScreeniPadType: 0
iOSLaunchScreeniPadImage: {fileID: 0}
iOSLaunchScreeniPadBackgroundColor:
@@ -204,9 +204,9 @@ PlayerSettings:
rgba: 0
iOSLaunchScreeniPadFillPct: 100
iOSLaunchScreeniPadSize: 100
- iOSLaunchScreeniPadCustomXibPath:
- iOSLaunchScreenCustomStoryboardPath:
- iOSLaunchScreeniPadCustomStoryboardPath:
+ iOSLaunchScreeniPadCustomXibPath:
+ iOSLaunchScreenCustomStoryboardPath:
+ iOSLaunchScreeniPadCustomStoryboardPath:
iOSDeviceRequirements: []
iOSURLSchemes: []
iOSBackgroundModes: 0
@@ -215,9 +215,9 @@ PlayerSettings:
metalAPIValidation: 1
iOSRenderExtraFrameOnPause: 0
iosCopyPluginsCodeInsteadOfSymlink: 0
- appleDeveloperTeamID:
- iOSManualSigningProvisioningProfileID:
- tvOSManualSigningProvisioningProfileID:
+ appleDeveloperTeamID:
+ iOSManualSigningProvisioningProfileID:
+ tvOSManualSigningProvisioningProfileID:
iOSManualSigningProvisioningProfileType: 0
tvOSManualSigningProvisioningProfileType: 0
appleEnableAutomaticSigning: 0
@@ -238,8 +238,8 @@ PlayerSettings:
AndroidTargetArchitectures: 1
AndroidSplashScreenScale: 0
androidSplashScreen: {fileID: 0}
- AndroidKeystoreName:
- AndroidKeyaliasName:
+ AndroidKeystoreName:
+ AndroidKeyaliasName:
AndroidBuildApkPerCpuArchitecture: 0
AndroidTVCompatibility: 0
AndroidIsGame: 1
@@ -343,11 +343,11 @@ PlayerSettings:
enableInternalProfiler: 0
logObjCUncaughtExceptions: 1
enableCrashReportAPI: 0
- cameraUsageDescription:
- locationUsageDescription:
- microphoneUsageDescription:
- switchNMETAOverride:
- switchNetLibKey:
+ cameraUsageDescription:
+ locationUsageDescription:
+ microphoneUsageDescription:
+ switchNMETAOverride:
+ switchNetLibKey:
switchSocketMemoryPoolSize: 6144
switchSocketAllocatorPoolSize: 128
switchSocketConcurrencyLimit: 14
@@ -355,39 +355,39 @@ PlayerSettings:
switchUseCPUProfiler: 0
switchUseGOLDLinker: 0
switchApplicationID: 0x01004b9000490000
- switchNSODependencies:
- switchTitleNames_0:
- switchTitleNames_1:
- switchTitleNames_2:
- switchTitleNames_3:
- switchTitleNames_4:
- switchTitleNames_5:
- switchTitleNames_6:
- switchTitleNames_7:
- switchTitleNames_8:
- switchTitleNames_9:
- switchTitleNames_10:
- switchTitleNames_11:
- switchTitleNames_12:
- switchTitleNames_13:
- switchTitleNames_14:
- switchTitleNames_15:
- switchPublisherNames_0:
- switchPublisherNames_1:
- switchPublisherNames_2:
- switchPublisherNames_3:
- switchPublisherNames_4:
- switchPublisherNames_5:
- switchPublisherNames_6:
- switchPublisherNames_7:
- switchPublisherNames_8:
- switchPublisherNames_9:
- switchPublisherNames_10:
- switchPublisherNames_11:
- switchPublisherNames_12:
- switchPublisherNames_13:
- switchPublisherNames_14:
- switchPublisherNames_15:
+ switchNSODependencies:
+ switchTitleNames_0:
+ switchTitleNames_1:
+ switchTitleNames_2:
+ switchTitleNames_3:
+ switchTitleNames_4:
+ switchTitleNames_5:
+ switchTitleNames_6:
+ switchTitleNames_7:
+ switchTitleNames_8:
+ switchTitleNames_9:
+ switchTitleNames_10:
+ switchTitleNames_11:
+ switchTitleNames_12:
+ switchTitleNames_13:
+ switchTitleNames_14:
+ switchTitleNames_15:
+ switchPublisherNames_0:
+ switchPublisherNames_1:
+ switchPublisherNames_2:
+ switchPublisherNames_3:
+ switchPublisherNames_4:
+ switchPublisherNames_5:
+ switchPublisherNames_6:
+ switchPublisherNames_7:
+ switchPublisherNames_8:
+ switchPublisherNames_9:
+ switchPublisherNames_10:
+ switchPublisherNames_11:
+ switchPublisherNames_12:
+ switchPublisherNames_13:
+ switchPublisherNames_14:
+ switchPublisherNames_15:
switchIcons_0: {fileID: 0}
switchIcons_1: {fileID: 0}
switchIcons_2: {fileID: 0}
@@ -420,11 +420,11 @@ PlayerSettings:
switchSmallIcons_13: {fileID: 0}
switchSmallIcons_14: {fileID: 0}
switchSmallIcons_15: {fileID: 0}
- switchManualHTML:
- switchAccessibleURLs:
- switchLegalInformation:
+ switchManualHTML:
+ switchAccessibleURLs:
+ switchLegalInformation:
switchMainThreadStackSize: 1048576
- switchPresenceGroupId:
+ switchPresenceGroupId:
switchLogoHandling: 0
switchReleaseVersion: 0
switchDisplayVersion: 1.0.0
@@ -432,7 +432,7 @@ PlayerSettings:
switchTouchScreenUsage: 0
switchSupportedLanguagesMask: 0
switchLogoType: 0
- switchApplicationErrorCodeCategory:
+ switchApplicationErrorCodeCategory:
switchUserAccountSaveDataSize: 0
switchUserAccountSaveDataJournalSize: 0
switchApplicationAttribute: 0
@@ -452,14 +452,14 @@ PlayerSettings:
switchRatingsInt_10: 0
switchRatingsInt_11: 0
switchRatingsInt_12: 0
- switchLocalCommunicationIds_0:
- switchLocalCommunicationIds_1:
- switchLocalCommunicationIds_2:
- switchLocalCommunicationIds_3:
- switchLocalCommunicationIds_4:
- switchLocalCommunicationIds_5:
- switchLocalCommunicationIds_6:
- switchLocalCommunicationIds_7:
+ switchLocalCommunicationIds_0:
+ switchLocalCommunicationIds_1:
+ switchLocalCommunicationIds_2:
+ switchLocalCommunicationIds_3:
+ switchLocalCommunicationIds_4:
+ switchLocalCommunicationIds_5:
+ switchLocalCommunicationIds_6:
+ switchLocalCommunicationIds_7:
switchParentalControl: 0
switchAllowsScreenshot: 1
switchAllowsVideoCapturing: 1
@@ -486,35 +486,35 @@ PlayerSettings:
switchUseMicroSleepForYield: 1
switchMicroSleepForYieldTime: 25
ps4NPAgeRating: 12
- ps4NPTitleSecret:
- ps4NPTrophyPackPath:
+ ps4NPTitleSecret:
+ ps4NPTrophyPackPath:
ps4ParentalLevel: 11
ps4ContentID: ED1633-NPXX51362_00-0000000000000000
ps4Category: 0
ps4MasterVersion: 01.00
ps4AppVersion: 01.00
ps4AppType: 0
- ps4ParamSfxPath:
+ ps4ParamSfxPath:
ps4VideoOutPixelFormat: 0
ps4VideoOutInitialWidth: 1920
ps4VideoOutBaseModeInitialWidth: 1920
ps4VideoOutReprojectionRate: 60
- ps4PronunciationXMLPath:
- ps4PronunciationSIGPath:
- ps4BackgroundImagePath:
- ps4StartupImagePath:
- ps4StartupImagesFolder:
- ps4IconImagesFolder:
- ps4SaveDataImagePath:
- ps4SdkOverride:
- ps4BGMPath:
- ps4ShareFilePath:
- ps4ShareOverlayImagePath:
- ps4PrivacyGuardImagePath:
- ps4ExtraSceSysFile:
- ps4NPtitleDatPath:
+ ps4PronunciationXMLPath:
+ ps4PronunciationSIGPath:
+ ps4BackgroundImagePath:
+ ps4StartupImagePath:
+ ps4StartupImagesFolder:
+ ps4IconImagesFolder:
+ ps4SaveDataImagePath:
+ ps4SdkOverride:
+ ps4BGMPath:
+ ps4ShareFilePath:
+ ps4ShareOverlayImagePath:
+ ps4PrivacyGuardImagePath:
+ ps4ExtraSceSysFile:
+ ps4NPtitleDatPath:
ps4RemotePlayKeyAssignment: -1
- ps4RemotePlayKeyMappingDir:
+ ps4RemotePlayKeyMappingDir:
ps4PlayTogetherPlayerCount: 0
ps4EnterButtonAssignment: 1
ps4ApplicationParam1: 0
@@ -542,9 +542,9 @@ PlayerSettings:
ps4ScriptOptimizationLevel: 0
ps4Audio3dVirtualSpeakerCount: 14
ps4attribCpuUsage: 0
- ps4PatchPkgPath:
- ps4PatchLatestPkgPath:
- ps4PatchChangeinfoPath:
+ ps4PatchPkgPath:
+ ps4PatchLatestPkgPath:
+ ps4PatchChangeinfoPath:
ps4PatchDayOne: 0
ps4attribUserManagement: 0
ps4attribMoveSupport: 0
@@ -559,18 +559,18 @@ PlayerSettings:
ps4attribEyeToEyeDistanceSettingVR: 0
ps4IncludedModules: []
ps4attribVROutputEnabled: 0
- monoEnv:
+ monoEnv:
splashScreenBackgroundSourceLandscape: {fileID: 0}
splashScreenBackgroundSourcePortrait: {fileID: 0}
blurSplashScreenBackground: 1
- spritePackerPolicy:
+ spritePackerPolicy:
webGLMemorySize: 16
webGLExceptionSupport: 1
webGLNameFilesAsHashes: 0
webGLDataCaching: 1
webGLDebugSymbols: 0
- webGLEmscriptenArgs:
- webGLModulesDirectory:
+ webGLEmscriptenArgs:
+ webGLModulesDirectory:
webGLTemplate: APPLICATION:Default
webGLAnalyzeBuildSize: 0
webGLUseEmbeddedResources: 0
@@ -580,7 +580,7 @@ PlayerSettings:
webGLThreadsSupport: 0
webGLDecompressionFallback: 0
scriptingDefineSymbols:
- 1:
+ Standalone: NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
additionalCompilerArguments:
1:
- -warnaserror
@@ -594,7 +594,7 @@ PlayerSettings:
useDeterministicCompilation: 1
useReferenceAssemblies: 1
enableRoslynAnalyzers: 1
- additionalIl2CppArgs:
+ additionalIl2CppArgs:
scriptingRuntimeVersion: 1
gcIncremental: 1
assemblyVersionValidation: 1
@@ -603,15 +603,15 @@ PlayerSettings:
m_RenderingPath: 1
m_MobileRenderingPath: 1
metroPackageName: Template_3D
- metroPackageVersion:
- metroCertificatePath:
- metroCertificatePassword:
- metroCertificateSubject:
- metroCertificateIssuer:
+ metroPackageVersion:
+ metroCertificatePath:
+ metroCertificatePassword:
+ metroCertificateSubject:
+ metroCertificateIssuer:
metroCertificateNotAfter: 0000000000000000
metroApplicationDescription: Template_3D
wsaImages: {}
- metroTileShortName:
+ metroTileShortName:
metroTileShowName: 0
metroMediumTileShowName: 0
metroLargeTileShowName: 0
@@ -626,22 +626,22 @@ PlayerSettings:
metroSplashScreenUseBackgroundColor: 0
platformCapabilities: {}
metroTargetDeviceFamilies: {}
- metroFTAName:
+ metroFTAName:
metroFTAFileTypes: []
- metroProtocolName:
- XboxOneProductId:
- XboxOneUpdateKey:
- XboxOneSandboxId:
- XboxOneContentId:
- XboxOneTitleId:
- XboxOneSCId:
- XboxOneGameOsOverridePath:
- XboxOnePackagingOverridePath:
- XboxOneAppManifestOverridePath:
+ metroProtocolName:
+ XboxOneProductId:
+ XboxOneUpdateKey:
+ XboxOneSandboxId:
+ XboxOneContentId:
+ XboxOneTitleId:
+ XboxOneSCId:
+ XboxOneGameOsOverridePath:
+ XboxOnePackagingOverridePath:
+ XboxOneAppManifestOverridePath:
XboxOneVersion: 1.0.0.0
XboxOnePackageEncryption: 0
XboxOnePackageUpdateGranularity: 2
- XboxOneDescription:
+ XboxOneDescription:
XboxOneLanguage:
- enus
XboxOneCapability: []
@@ -654,8 +654,8 @@ PlayerSettings:
XboxOneAllowedProductIds: []
XboxOnePersistentLocalStorageSize: 0
XboxOneXTitleMemory: 8
- XboxOneOverrideIdentityName:
- XboxOneOverrideIdentityPublisher:
+ XboxOneOverrideIdentityName:
+ XboxOneOverrideIdentityPublisher:
vrEditorSettings: {}
cloudServicesEnabled:
Analytics: 0
@@ -667,19 +667,19 @@ PlayerSettings:
UNet: 1
Unity Ads: 0
luminIcon:
- m_Name:
- m_ModelFolderPath:
- m_PortalFolderPath:
+ m_Name:
+ m_ModelFolderPath:
+ m_PortalFolderPath:
luminCert:
- m_CertPath:
+ m_CertPath:
m_SignPackage: 1
luminIsChannelApp: 0
luminVersion:
m_VersionCode: 1
- m_VersionName:
+ m_VersionName:
apiCompatibilityLevel: 6
activeInputHandler: 0
- cloudProjectId:
+ cloudProjectId:
framebufferDepthMemorylessMode: 0
qualitySettingsNames: []
projectName: relay-stg
From 4e367865588223dc70cc8dc1cf1bd8465ac3ef32 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Sun, 20 Nov 2022 13:41:59 -0600
Subject: [PATCH 11/18] test
Removed enabling verbose debug in LateJoinSynchronizationTest
---
.../Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
index fd57d55055..d75d29b85b 100644
--- a/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
+++ b/testproject/Assets/Tests/Runtime/Animation/NetworkAnimatorTests.cs
@@ -470,7 +470,6 @@ public IEnumerator LateJoinTriggerSynchronizationTest([Values] OwnerShipMode own
[UnityTest]
public IEnumerator LateJoinSynchronizationTest([Values] OwnerShipMode ownerShipMode, [Values] AuthoritativeMode authoritativeMode)
{
- m_EnableVerboseDebug = true;
VerboseDebug($" ++++++++++++++++++ Late Join Synchronization Test [{TriggerTest.Iteration}][{ownerShipMode}] Starting ++++++++++++++++++ ");
StateSyncTest.IsVerboseDebug = m_EnableVerboseDebug;
From 4314dd63e4badca7b4a9634fe68a52f0ea5a68c2 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Sun, 20 Nov 2022 14:03:18 -0600
Subject: [PATCH 12/18] fix
Adjusting to original serialized format for backwards compatibility.
---
testproject/ProjectSettings/ProjectSettings.asset | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset
index 93f61c3696..5b8b8f80c3 100644
--- a/testproject/ProjectSettings/ProjectSettings.asset
+++ b/testproject/ProjectSettings/ProjectSettings.asset
@@ -580,7 +580,8 @@ PlayerSettings:
webGLThreadsSupport: 0
webGLDecompressionFallback: 0
scriptingDefineSymbols:
- Standalone: NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
+ : NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
+ 1: NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
additionalCompilerArguments:
1:
- -warnaserror
From 19bf6562cdbafbaf81ead0a38e0676dbdf4e1901 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 21 Nov 2022 16:31:15 -0600
Subject: [PATCH 13/18] update
removed the AnimationSynchronizationData class as it really was not needed.
---
.../Components/NetworkAnimator.cs | 45 +++----------------
1 file changed, 6 insertions(+), 39 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index 3291424381..de1f19caba 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -453,33 +453,6 @@ public void NetworkSerialize(BufferSerializer serializer) where T : IReade
}
}
- ///
- /// Used to handle the initial NetworkAnimator synchronization
- ///
- ///
- /// Note: For reading already serialized data only
- ///
- private class AnimationSynchronizationData
- {
- public ParametersUpdateMessage Parameters = new ParametersUpdateMessage();
- public AnimationMessage AnimationStates = new AnimationMessage();
-
- private NetworkAnimator m_NetworkAnimator;
-
- public void ReadSynchronizationData(ref BufferSerializer serializer) where T : IReaderWriter
- {
- serializer.SerializeValue(ref Parameters);
- m_NetworkAnimator.UpdateParameters(ref Parameters);
- serializer.SerializeValue(ref AnimationStates);
- m_NetworkAnimator.HandleAnimStateUpdate(ref AnimationStates);
- }
-
- public AnimationSynchronizationData(NetworkAnimator networkAnimator)
- {
- m_NetworkAnimator = networkAnimator;
- }
- }
-
[SerializeField] private Animator m_Animator;
public Animator Animator
@@ -518,11 +491,6 @@ protected virtual bool OnIsServerAuthoritative()
private AnimationMessage m_AnimationMessage;
private NetworkAnimatorStateChangeHandler m_NetworkAnimatorStateChangeHandler;
- ///
- /// Used for the initial client-side synchronization of NetworkAnimator
- ///
- private AnimationSynchronizationData m_AnimationSynchronizationData;
-
///
/// Used for integration test purposes
///
@@ -660,8 +628,6 @@ private void Awake()
m_CachedAnimatorParameters[i] = cacheParam;
}
-
- m_AnimationSynchronizationData = new AnimationSynchronizationData(this);
}
///
@@ -800,11 +766,12 @@ protected override void OnSynchronize(ref BufferSerializer serializer)
}
else
{
- if (m_AnimationSynchronizationData == null)
- {
- m_AnimationSynchronizationData = new AnimationSynchronizationData(this);
- }
- m_AnimationSynchronizationData.ReadSynchronizationData(ref serializer);
+ var parameters = new ParametersUpdateMessage();
+ var animationStates = new AnimationMessage();
+ serializer.SerializeValue(ref parameters);
+ UpdateParameters(ref parameters);
+ serializer.SerializeValue(ref animationStates);
+ HandleAnimStateUpdate(ref animationStates);
}
}
From 5ce321c3e66201720b91d7bdde15d3074195071f Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Mon, 28 Nov 2022 11:09:49 -0600
Subject: [PATCH 14/18] fix
This fixes the issue where NetworkAnimator will not check for animation changes unless the associated NetworkObject is spawned.
---
com.unity.netcode.gameobjects/Components/NetworkAnimator.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index de1f19caba..aeb160eeed 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -780,7 +780,7 @@ protected override void OnSynchronize(ref BufferSerializer serializer)
///
internal void CheckForAnimatorChanges()
{
- if (!IsOwner && !IsServerAuthoritative() || IsServerAuthoritative() && !IsServer)
+ if (!IsSpawned || (!IsOwner && !IsServerAuthoritative()) || (IsServerAuthoritative() && !IsServer))
{
return;
}
From 3d764ecf79e62d1d76981d536470c301a587fc8f Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Tue, 10 Jan 2023 09:56:18 -0600
Subject: [PATCH 15/18] update
Removing the NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY from the scriptingDefineSymbols.
Replacing it with UNITY_INCLUDE_TESTS in the components AssemblyInfo.cs file.
Adding an additional remark about the context of when CheckForAnimatorChanges is invoked.
---
com.unity.netcode.gameobjects/Components/AssemblyInfo.cs | 4 ++--
com.unity.netcode.gameobjects/Components/NetworkAnimator.cs | 4 ++++
testproject/ProjectSettings/ProjectSettings.asset | 3 +--
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
index 7b12fdb54c..5da0f66f8c 100644
--- a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
@@ -7,7 +7,7 @@
[assembly: InternalsVisibleTo("TestProject.EditorTests")]
#endif
-#if NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
+#if UNITY_INCLUDE_TESTS
[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
-#endif
[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
+#endif
diff --git a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
index aeb160eeed..3601a7e06d 100644
--- a/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
+++ b/com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
@@ -778,6 +778,10 @@ protected override void OnSynchronize(ref BufferSerializer serializer)
///
/// Checks for changes in both Animator parameters and state.
///
+ ///
+ /// This is only invoked by clients that are the owner when not in server authoritative mode
+ /// or by the server itself when in server authoritative mode.
+ ///
internal void CheckForAnimatorChanges()
{
if (!IsSpawned || (!IsOwner && !IsServerAuthoritative()) || (IsServerAuthoritative() && !IsServer))
diff --git a/testproject/ProjectSettings/ProjectSettings.asset b/testproject/ProjectSettings/ProjectSettings.asset
index 5b8b8f80c3..bbe5763540 100644
--- a/testproject/ProjectSettings/ProjectSettings.asset
+++ b/testproject/ProjectSettings/ProjectSettings.asset
@@ -580,8 +580,7 @@ PlayerSettings:
webGLThreadsSupport: 0
webGLDecompressionFallback: 0
scriptingDefineSymbols:
- : NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
- 1: NGO_COMPONENTS_ASSEMBLY_RUNTIME_VISIBILITY
+ 1:
additionalCompilerArguments:
1:
- -warnaserror
From 46bf5882f90f449b808d99f5ee5bfbfabb838470 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Tue, 10 Jan 2023 11:01:35 -0600
Subject: [PATCH 16/18] update
Migrating all test related assemblies within the UNITY_INCLUDE_TESTS define region.
---
com.unity.netcode.gameobjects/Components/AssemblyInfo.cs | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
index 5da0f66f8c..004dc1a82b 100644
--- a/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
+++ b/com.unity.netcode.gameobjects/Components/AssemblyInfo.cs
@@ -1,13 +1,15 @@
using System.Runtime.CompilerServices;
#if UNITY_EDITOR
-[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")]
[assembly: InternalsVisibleTo("Unity.Netcode.Editor.CodeGen")]
[assembly: InternalsVisibleTo("Unity.Netcode.Editor")]
-[assembly: InternalsVisibleTo("TestProject.EditorTests")]
#endif
#if UNITY_INCLUDE_TESTS
+#if UNITY_EDITOR
+[assembly: InternalsVisibleTo("Unity.Netcode.EditorTests")]
+[assembly: InternalsVisibleTo("TestProject.EditorTests")]
+#endif
[assembly: InternalsVisibleTo("TestProject.RuntimeTests")]
[assembly: InternalsVisibleTo("Unity.Netcode.RuntimeTests")]
#endif
From ba515d892dc01955c43f35f34b5867d017943386 Mon Sep 17 00:00:00 2001
From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com>
Date: Tue, 10 Jan 2023 11:20:27 -0600
Subject: [PATCH 17/18] update
Minor fix for weapon attack option in manual test.
---
.../NetworkAnimatorTests/CubeAnimatorController.controller | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
index c0933c9b9c..27d6b21286 100644
--- a/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
+++ b/testproject/Assets/Tests/Manual/NetworkAnimatorTests/CubeAnimatorController.controller
@@ -956,7 +956,7 @@ AnimatorStateTransition:
m_ConditionEvent: Attack
m_EventTreshold: 0
- m_ConditionMode: 6
- m_ConditionEvent: Weapon
+ m_ConditionEvent: WeaponType
m_EventTreshold: 2
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -5552815716159021554}
From bd5b81c525f4f439c4b69b642eb81f4718d4aef9 Mon Sep 17 00:00:00 2001
From: Noel Stephens
Date: Thu, 12 Jan 2023 12:13:03 -0600
Subject: [PATCH 18/18] update
updating what was fixed in this PR
---
com.unity.netcode.gameobjects/CHANGELOG.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md
index c95efcd263..41caa94d3d 100644
--- a/com.unity.netcode.gameobjects/CHANGELOG.md
+++ b/com.unity.netcode.gameobjects/CHANGELOG.md
@@ -26,7 +26,9 @@ Additional documentation and release notes are available at [Multiplayer Documen
- Fixed a case where data corruption could occur when using UnityTransport when reaching a certain level of send throughput. (#2332)
- Fixed an issue in `UnityTransport` where an exception would be thrown if starting a Relay host/server on WebGL. This exception should only be thrown if using direct connections (where WebGL can't act as a host/server). (#2321)
- Fixed `NetworkAnimator` issue where it was not checking for `AnimatorStateTtansition.destinationStateMachine` and any possible sub-states defined within it. (#2309)
-
+- Fixed `NetworkAnimator` issue where the host client was receiving the ClientRpc animation updates when the host was the owner.(#2309)
+- Fixed `NetworkAnimator` issue with using pooled objects and when specific properties are cleaned during despawn and destroy.(#2309)
+- Fixed issue where `NetworkAnimator` was checking for animation changes when the associated `NetworkObject` was not spawned.(#2309)
## [1.2.0] - 2022-11-21