Skip to content

Commit af85c39

Browse files
update
Making NetworkAnimator strictly server authoritative.
1 parent d2932fe commit af85c39

3 files changed

Lines changed: 49 additions & 211 deletions

File tree

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

Lines changed: 18 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
5757
}
5858
m_ProcessParameterUpdates.Clear();
5959

60-
// Only owners check for Animator changes
61-
if (m_NetworkAnimator.IsOwner && !m_NetworkAnimator.IsServerAuthoritative || m_NetworkAnimator.IsServerAuthoritative && m_NetworkAnimator.NetworkManager.IsServer)
60+
// Only server checks for Animator changes
61+
if (m_NetworkAnimator.NetworkManager.IsServer)
6262
{
6363
m_NetworkAnimator.CheckForAnimatorChanges();
6464
}
@@ -208,42 +208,6 @@ public Animator Animator
208208
}
209209
}
210210

211-
[Tooltip("When enabled, the NetworkAnimator will operate in server authoritative mode.")]
212-
[SerializeField]
213-
private bool m_IsServerAuthoritative;
214-
215-
/// <summary>
216-
/// Server-Side Only:
217-
/// Can be used to switch between server and owner authoritative modes during runtime.
218-
/// Note: Only when the associated NetworkObject is spawned.
219-
/// </summary>
220-
public bool IsServerAuthoritative
221-
{
222-
get
223-
{
224-
return m_IsServerAuthoritative;
225-
}
226-
set
227-
{
228-
if (!IsSpawned)
229-
{
230-
m_IsServerAuthoritative = value;
231-
}
232-
else if (IsSpawned && IsServer)
233-
{
234-
m_IsServerAuthoritative = value;
235-
m_ServerAuthoritativeMode.Value = value;
236-
}
237-
}
238-
}
239-
240-
private NetworkVariable<bool> m_ServerAuthoritativeMode = new NetworkVariable<bool>();
241-
242-
private void OnServerAuthoritativeModeChanged(bool previous, bool next)
243-
{
244-
m_IsServerAuthoritative = next;
245-
}
246-
247211
// Animators only support up to 32 params
248212
private const int k_MaxAnimationParams = 32;
249213

@@ -327,7 +291,6 @@ public override void OnNetworkSpawn()
327291
if (IsServer)
328292
{
329293
NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback;
330-
m_ServerAuthoritativeMode.Value = m_IsServerAuthoritative;
331294
}
332295

333296
// Store off our current layer weights
@@ -349,11 +312,6 @@ public override void OnNetworkSpawn()
349312
}
350313
}
351314

352-
if (!IsServer)
353-
{
354-
m_ServerAuthoritativeMode.OnValueChanged = OnServerAuthoritativeModeChanged;
355-
}
356-
357315
var parameters = m_Animator.parameters;
358316
m_CachedAnimatorParameters = new NativeArray<AnimatorParamCache>(parameters.Length, Allocator.Persistent);
359317
m_ParametersToUpdate = new List<int>(parameters.Length);
@@ -477,7 +435,7 @@ private void OnClientConnectedCallback(ulong playerId)
477435

478436
internal void CheckForAnimatorChanges()
479437
{
480-
if (!IsOwner && !IsServerAuthoritative || m_IsServerAuthoritative && !IsServer)
438+
if (!IsServer)
481439
{
482440
return;
483441
}
@@ -791,27 +749,11 @@ private unsafe void UpdateAnimationState(AnimationMessage animationState)
791749
[ServerRpc]
792750
private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parametersUpdate, ServerRpcParams serverRpcParams = default)
793751
{
794-
if (IsServerAuthoritative)
795-
{
796-
m_NetworkAnimatorStateChangeHandler.SendParameterUpdate(parametersUpdate);
797-
}
798-
else
752+
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
799753
{
800-
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
801-
{
802-
return;
803-
}
804-
UpdateParameters(parametersUpdate);
805-
if (NetworkManager.ConnectedClientsIds.Count - 2 > 0)
806-
{
807-
m_ClientSendList.Clear();
808-
m_ClientSendList.AddRange(NetworkManager.ConnectedClientsIds);
809-
m_ClientSendList.Remove(serverRpcParams.Receive.SenderClientId);
810-
m_ClientSendList.Remove(NetworkManager.ServerClientId);
811-
m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
812-
m_NetworkAnimatorStateChangeHandler.SendParameterUpdate(parametersUpdate, m_ClientRpcParams);
813-
}
754+
return;
814755
}
756+
m_NetworkAnimatorStateChangeHandler.SendParameterUpdate(parametersUpdate);
815757
}
816758

817759
/// <summary>
@@ -820,10 +762,7 @@ private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parame
820762
[ClientRpc]
821763
internal unsafe void SendParametersUpdateClientRpc(ParametersUpdateMessage parametersUpdate, ClientRpcParams clientRpcParams = default)
822764
{
823-
if (!IsServerAuthoritative && !IsOwner || IsServerAuthoritative)
824-
{
825-
m_NetworkAnimatorStateChangeHandler.ProcessParameterUpdate(parametersUpdate);
826-
}
765+
m_NetworkAnimatorStateChangeHandler.ProcessParameterUpdate(parametersUpdate);
827766
}
828767

829768
/// <summary>
@@ -833,27 +772,12 @@ internal unsafe void SendParametersUpdateClientRpc(ParametersUpdateMessage param
833772
[ServerRpc]
834773
private unsafe void SendAnimStateServerRpc(AnimationMessage animSnapshot, ServerRpcParams serverRpcParams = default)
835774
{
836-
if (IsServerAuthoritative)
775+
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
837776
{
838-
m_NetworkAnimatorStateChangeHandler.SendAnimationUpdate(animSnapshot);
839-
}
840-
else
841-
{
842-
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
843-
{
844-
return;
845-
}
846-
UpdateAnimationState(animSnapshot);
847-
if (NetworkManager.ConnectedClientsIds.Count - 2 > 0)
848-
{
849-
m_ClientSendList.Clear();
850-
m_ClientSendList.AddRange(NetworkManager.ConnectedClientsIds);
851-
m_ClientSendList.Remove(serverRpcParams.Receive.SenderClientId);
852-
m_ClientSendList.Remove(NetworkManager.ServerClientId);
853-
m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
854-
m_NetworkAnimatorStateChangeHandler.SendAnimationUpdate(animSnapshot, m_ClientRpcParams);
855-
}
777+
return;
856778
}
779+
780+
m_NetworkAnimatorStateChangeHandler.SendAnimationUpdate(animSnapshot);
857781
}
858782

859783
/// <summary>
@@ -862,10 +786,7 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animSnapshot, Server
862786
[ClientRpc]
863787
private unsafe void SendAnimStateClientRpc(AnimationMessage animSnapshot, ClientRpcParams clientRpcParams = default)
864788
{
865-
if (!IsServerAuthoritative && !IsOwner || IsServerAuthoritative)
866-
{
867-
UpdateAnimationState(animSnapshot);
868-
}
789+
UpdateAnimationState(animSnapshot);
869790
}
870791

871792
/// <summary>
@@ -875,30 +796,11 @@ private unsafe void SendAnimStateClientRpc(AnimationMessage animSnapshot, Client
875796
[ServerRpc]
876797
private void SendAnimTriggerServerRpc(AnimationTriggerMessage animationTriggerMessage, ServerRpcParams serverRpcParams = default)
877798
{
878-
if (IsServerAuthoritative)
799+
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
879800
{
880-
m_NetworkAnimatorStateChangeHandler.SendTriggerUpdate(animationTriggerMessage);
881-
}
882-
else
883-
{
884-
if (serverRpcParams.Receive.SenderClientId != OwnerClientId)
885-
{
886-
return;
887-
}
888-
// trigger the animation locally on the server...
889-
m_Animator.SetBool(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet);
890-
891-
if (NetworkManager.ConnectedClientsIds.Count - 2 > 0)
892-
{
893-
m_ClientSendList.Clear();
894-
m_ClientSendList.AddRange(NetworkManager.ConnectedClientsIds);
895-
m_ClientSendList.Remove(serverRpcParams.Receive.SenderClientId);
896-
m_ClientSendList.Remove(NetworkManager.ServerClientId);
897-
m_ClientRpcParams.Send.TargetClientIds = m_ClientSendList;
898-
m_NetworkAnimatorStateChangeHandler.SendTriggerUpdate(animationTriggerMessage, m_ClientRpcParams);
899-
}
801+
return;
900802
}
901-
803+
m_NetworkAnimatorStateChangeHandler.SendTriggerUpdate(animationTriggerMessage);
902804
}
903805

904806
/// <summary>
@@ -910,10 +812,7 @@ private void SendAnimTriggerServerRpc(AnimationTriggerMessage animationTriggerMe
910812
[ClientRpc]
911813
internal void SendAnimTriggerClientRpc(AnimationTriggerMessage animationTriggerMessage, ClientRpcParams clientRpcParams = default)
912814
{
913-
if (!IsServerAuthoritative && !IsOwner || IsServerAuthoritative)
914-
{
915-
m_Animator.SetBool(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet);
916-
}
815+
m_Animator.SetBool(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet);
917816
}
918817

919818
/// <summary>
@@ -930,7 +829,7 @@ public void SetTrigger(string triggerName)
930829
/// <param name="reset">If true, resets the trigger</param>
931830
public void SetTrigger(int hash, bool setTrigger = true)
932831
{
933-
if (IsOwner && !IsServerAuthoritative || IsServer && IsServerAuthoritative)
832+
if (IsOwner || IsServer)
934833
{
935834
var animTriggerMessage = new AnimationTriggerMessage() { Hash = hash, IsTriggerSet = setTrigger };
936835
if (IsServer)
@@ -941,8 +840,7 @@ public void SetTrigger(int hash, bool setTrigger = true)
941840
{
942841
SendAnimTriggerServerRpc(animTriggerMessage);
943842
}
944-
// trigger the animation locally on the server...
945-
m_Animator.SetBool(hash, setTrigger);
843+
946844
}
947845
}
948846

testproject/Assets/Tests/Manual/NetworkAnimatorTests/AnimatedCubeController.cs

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,13 @@ public override void OnNetworkSpawn()
3232

3333
private bool HasAuthority()
3434
{
35-
if (IsOwnerAuthority() || IsServerAuthority())
35+
if (IsServer || IsOwner)
3636
{
3737
return true;
3838
}
3939
return false;
4040
}
4141

42-
private bool IsServerAuthority()
43-
{
44-
if (IsServer && m_NetworkAnimator.IsServerAuthoritative)
45-
{
46-
return true;
47-
}
48-
return false;
49-
}
50-
51-
private bool IsOwnerAuthority()
52-
{
53-
if (IsOwner && m_NetworkAnimator.IsServerAuthoritative)
54-
{
55-
return true;
56-
}
57-
return false;
58-
}
59-
60-
6142
[ServerRpc(RequireOwnership = false)]
6243
private void ToggleRotateAnimationServerRpc(bool rotate)
6344
{
@@ -68,18 +49,11 @@ private void ToggleRotateAnimationServerRpc(bool rotate)
6849
internal void ToggleRotateAnimation()
6950
{
7051
m_Rotate = !m_Rotate;
71-
if (m_NetworkAnimator.IsServerAuthoritative)
52+
if (!IsServer && IsOwner)
7253
{
73-
if (!IsServer && IsOwner)
74-
{
75-
ToggleRotateAnimationServerRpc(m_Rotate);
76-
}
77-
else if (IsServer && IsOwner)
78-
{
79-
m_Animator.SetBool("Rotate", m_Rotate);
80-
}
54+
ToggleRotateAnimationServerRpc(m_Rotate);
8155
}
82-
else if (IsOwner)
56+
else if (IsServer && IsOwner)
8357
{
8458
m_Animator.SetBool("Rotate", m_Rotate);
8559
}
@@ -93,18 +67,11 @@ private void PlayPulseAnimationServerRpc(bool rotate)
9367

9468
internal void PlayPulseAnimation()
9569
{
96-
if (m_NetworkAnimator.IsServerAuthoritative)
70+
if (!IsServer && IsOwner)
9771
{
98-
if (!IsServer && IsOwner)
99-
{
100-
PlayPulseAnimationServerRpc(m_Rotate);
101-
}
102-
else if (IsServer && IsOwner)
103-
{
104-
m_NetworkAnimator.SetTrigger("Pulse");
105-
}
72+
PlayPulseAnimationServerRpc(m_Rotate);
10673
}
107-
else if (IsOwner)
74+
else if (IsServer && IsOwner)
10875
{
10976
m_NetworkAnimator.SetTrigger("Pulse");
11077
}

0 commit comments

Comments
 (0)