@@ -58,11 +58,10 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
58
58
m_ProcessParameterUpdates . Clear ( ) ;
59
59
60
60
// Only owners check for Animator changes
61
- if ( m_NetworkAnimator . IsOwner )
61
+ if ( m_NetworkAnimator . IsOwner && ! m_NetworkAnimator . IsServerAuthoritative ( ) || m_NetworkAnimator . IsServerAuthoritative ( ) && m_NetworkAnimator . NetworkManager . IsServer )
62
62
{
63
63
m_NetworkAnimator . CheckForAnimatorChanges ( ) ;
64
64
}
65
-
66
65
break ;
67
66
}
68
67
}
@@ -209,6 +208,19 @@ public Animator Animator
209
208
}
210
209
}
211
210
211
+ internal bool IsServerAuthoritative ( )
212
+ {
213
+ return OnIsServerAuthoritative ( ) ;
214
+ }
215
+
216
+ /// <summary>
217
+ /// Override this method and return false to switch to owner authoritative mode
218
+ /// </summary>
219
+ protected virtual bool OnIsServerAuthoritative ( )
220
+ {
221
+ return true ;
222
+ }
223
+
212
224
// Animators only support up to 32 params
213
225
private const int k_MaxAnimationParams = 32 ;
214
226
@@ -276,13 +288,10 @@ public override void OnDestroy()
276
288
base . OnDestroy ( ) ;
277
289
}
278
290
279
-
280
291
private List < int > m_ParametersToUpdate ;
281
-
282
292
private List < ulong > m_ClientSendList ;
283
293
private ClientRpcParams m_ClientRpcParams ;
284
294
285
-
286
295
public override void OnNetworkSpawn ( )
287
296
{
288
297
if ( IsOwner || IsServer )
@@ -439,7 +448,7 @@ private void OnClientConnectedCallback(ulong playerId)
439
448
440
449
internal void CheckForAnimatorChanges ( )
441
450
{
442
- if ( ! IsOwner )
451
+ if ( ! IsOwner && ! IsServerAuthoritative ( ) || IsServerAuthoritative ( ) && ! IsServer )
443
452
{
444
453
return ;
445
454
}
@@ -747,25 +756,32 @@ private unsafe void UpdateAnimationState(AnimationMessage animationState)
747
756
}
748
757
749
758
/// <summary>
750
- /// Sever -side animator parameter update request
759
+ /// Server -side animator parameter update request
751
760
/// The server sets its local parameters and then forwards the message to the remaining clients
752
761
/// </summary>
753
762
[ ServerRpc ]
754
763
private unsafe void SendParametersUpdateServerRpc ( ParametersUpdateMessage parametersUpdate , ServerRpcParams serverRpcParams = default )
755
764
{
756
- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
765
+ if ( IsServerAuthoritative ( ) )
757
766
{
758
- return ;
767
+ m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate ) ;
759
768
}
760
- UpdateParameters ( parametersUpdate ) ;
761
- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
769
+ else
762
770
{
763
- m_ClientSendList . Clear ( ) ;
764
- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
765
- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
766
- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
767
- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
768
- m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate , m_ClientRpcParams ) ;
771
+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
772
+ {
773
+ return ;
774
+ }
775
+ UpdateParameters ( parametersUpdate ) ;
776
+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
777
+ {
778
+ m_ClientSendList . Clear ( ) ;
779
+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
780
+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
781
+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
782
+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
783
+ m_NetworkAnimatorStateChangeHandler . SendParameterUpdate ( parametersUpdate , m_ClientRpcParams ) ;
784
+ }
769
785
}
770
786
}
771
787
@@ -775,33 +791,40 @@ private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parame
775
791
[ ClientRpc ]
776
792
internal unsafe void SendParametersUpdateClientRpc ( ParametersUpdateMessage parametersUpdate , ClientRpcParams clientRpcParams = default )
777
793
{
778
- if ( ! IsOwner )
794
+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
795
+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
779
796
{
780
797
m_NetworkAnimatorStateChangeHandler . ProcessParameterUpdate ( parametersUpdate ) ;
781
798
}
782
799
}
783
800
784
801
/// <summary>
785
- /// Sever -side animation state update request
802
+ /// Server -side animation state update request
786
803
/// The server sets its local state and then forwards the message to the remaining clients
787
804
/// </summary>
788
805
[ ServerRpc ]
789
806
private unsafe void SendAnimStateServerRpc ( AnimationMessage animSnapshot , ServerRpcParams serverRpcParams = default )
790
807
{
791
- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
808
+ if ( IsServerAuthoritative ( ) )
792
809
{
793
- return ;
810
+ m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot ) ;
794
811
}
795
-
796
- UpdateAnimationState ( animSnapshot ) ;
797
- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
812
+ else
798
813
{
799
- m_ClientSendList . Clear ( ) ;
800
- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
801
- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
802
- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
803
- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
804
- m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot , m_ClientRpcParams ) ;
814
+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
815
+ {
816
+ return ;
817
+ }
818
+ UpdateAnimationState ( animSnapshot ) ;
819
+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
820
+ {
821
+ m_ClientSendList . Clear ( ) ;
822
+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
823
+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
824
+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
825
+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
826
+ m_NetworkAnimatorStateChangeHandler . SendAnimationUpdate ( animSnapshot , m_ClientRpcParams ) ;
827
+ }
805
828
}
806
829
}
807
830
@@ -811,36 +834,44 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animSnapshot, Server
811
834
[ ClientRpc ]
812
835
private unsafe void SendAnimStateClientRpc ( AnimationMessage animSnapshot , ClientRpcParams clientRpcParams = default )
813
836
{
814
- if ( ! IsOwner )
837
+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
838
+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
815
839
{
816
840
UpdateAnimationState ( animSnapshot ) ;
817
841
}
818
842
}
819
843
820
844
/// <summary>
821
- /// Sever -side trigger state update request
845
+ /// Server -side trigger state update request
822
846
/// The server sets its local state and then forwards the message to the remaining clients
823
847
/// </summary>
824
848
[ ServerRpc ]
825
849
private void SendAnimTriggerServerRpc ( AnimationTriggerMessage animationTriggerMessage , ServerRpcParams serverRpcParams = default )
826
850
{
827
- if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
851
+ if ( IsServerAuthoritative ( ) )
828
852
{
829
- return ;
853
+ m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage ) ;
830
854
}
831
-
832
- // trigger the animation locally on the server...
833
- m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
834
-
835
- if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
855
+ else
836
856
{
837
- m_ClientSendList . Clear ( ) ;
838
- m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
839
- m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
840
- m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
841
- m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
842
- m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage , m_ClientRpcParams ) ;
857
+ if ( serverRpcParams . Receive . SenderClientId != OwnerClientId )
858
+ {
859
+ return ;
860
+ }
861
+ // trigger the animation locally on the server...
862
+ m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
863
+
864
+ if ( NetworkManager . ConnectedClientsIds . Count - 2 > 0 )
865
+ {
866
+ m_ClientSendList . Clear ( ) ;
867
+ m_ClientSendList . AddRange ( NetworkManager . ConnectedClientsIds ) ;
868
+ m_ClientSendList . Remove ( serverRpcParams . Receive . SenderClientId ) ;
869
+ m_ClientSendList . Remove ( NetworkManager . ServerClientId ) ;
870
+ m_ClientRpcParams . Send . TargetClientIds = m_ClientSendList ;
871
+ m_NetworkAnimatorStateChangeHandler . SendTriggerUpdate ( animationTriggerMessage , m_ClientRpcParams ) ;
872
+ }
843
873
}
874
+
844
875
}
845
876
846
877
/// <summary>
@@ -852,7 +883,8 @@ private void SendAnimTriggerServerRpc(AnimationTriggerMessage animationTriggerMe
852
883
[ ClientRpc ]
853
884
internal void SendAnimTriggerClientRpc ( AnimationTriggerMessage animationTriggerMessage , ClientRpcParams clientRpcParams = default )
854
885
{
855
- if ( ! IsOwner )
886
+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
887
+ if ( ! isServerAuthoritative && ! IsOwner || isServerAuthoritative )
856
888
{
857
889
m_Animator . SetBool ( animationTriggerMessage . Hash , animationTriggerMessage . IsTriggerSet ) ;
858
890
}
@@ -869,10 +901,11 @@ public void SetTrigger(string triggerName)
869
901
870
902
/// <inheritdoc cref="SetTrigger(string)" />
871
903
/// <param name="hash">The hash for the trigger to activate</param>
872
- /// <param name="reset">If true, resets the trigger</param>
904
+ /// <param name="setTrigger">sets ( true) or resets (false) the trigger. The default is to set it (true). </param>
873
905
public void SetTrigger ( int hash , bool setTrigger = true )
874
906
{
875
- if ( IsOwner )
907
+ var isServerAuthoritative = IsServerAuthoritative ( ) ;
908
+ if ( IsOwner && ! isServerAuthoritative || IsServer && isServerAuthoritative )
876
909
{
877
910
var animTriggerMessage = new AnimationTriggerMessage ( ) { Hash = hash , IsTriggerSet = setTrigger } ;
878
911
if ( IsServer )
0 commit comments