diff --git a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs index 7d82872890..c77990b350 100644 --- a/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs +++ b/com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs @@ -14,8 +14,8 @@ namespace Unity.Netcode.Components { internal class NetworkAnimatorStateChangeHandler : INetworkUpdateSystem { - private NetworkAnimator m_NetworkAnimator; - private bool m_IsServer; + private readonly NetworkAnimator m_NetworkAnimator; + private readonly bool m_IsServer; /// /// This removes sending RPCs from within RPCs when the @@ -132,14 +132,14 @@ private struct AnimationUpdate public NetworkAnimator.AnimationMessage AnimationMessage; } - private List m_SendAnimationUpdates = new List(); + private readonly List m_SendAnimationUpdates = new List(); /// /// Invoked when a server needs to forwarding an update to the animation state /// internal void SendAnimationUpdate(NetworkAnimator.AnimationMessage animationMessage, RpcParams rpcParams = default) { - m_SendAnimationUpdates.Add(new AnimationUpdate() { RpcParams = rpcParams, AnimationMessage = animationMessage }); + m_SendAnimationUpdates.Add(new AnimationUpdate { RpcParams = rpcParams, AnimationMessage = animationMessage }); } private struct ParameterUpdate @@ -148,17 +148,17 @@ private struct ParameterUpdate public NetworkAnimator.ParametersUpdateMessage ParametersUpdateMessage; } - private List m_SendParameterUpdates = new List(); + private readonly List m_SendParameterUpdates = new List(); /// /// Invoked when a server needs to forwarding an update to the parameter state /// internal void SendParameterUpdate(NetworkAnimator.ParametersUpdateMessage parametersUpdateMessage, RpcParams rpcParams = default) { - m_SendParameterUpdates.Add(new ParameterUpdate() { RpcParams = rpcParams, ParametersUpdateMessage = parametersUpdateMessage }); + m_SendParameterUpdates.Add(new ParameterUpdate { RpcParams = rpcParams, ParametersUpdateMessage = parametersUpdateMessage }); } - private List m_ProcessParameterUpdates = new List(); + private readonly List m_ProcessParameterUpdates = new List(); internal void ProcessParameterUpdate(NetworkAnimator.ParametersUpdateMessage parametersUpdateMessage) { m_ProcessParameterUpdates.Add(parametersUpdateMessage); @@ -171,31 +171,31 @@ private struct TriggerUpdate public NetworkAnimator.AnimationTriggerMessage AnimationTriggerMessage; } - private List m_SendTriggerUpdates = new List(); + private readonly List m_SendTriggerUpdates = new List(); /// /// Invoked when a server needs to forward an update to a Trigger state /// internal void QueueTriggerUpdateToClient(NetworkAnimator.AnimationTriggerMessage animationTriggerMessage, RpcParams clientRpcParams = default) { - m_SendTriggerUpdates.Add(new TriggerUpdate() { RpcParams = clientRpcParams, AnimationTriggerMessage = animationTriggerMessage }); + m_SendTriggerUpdates.Add(new TriggerUpdate { RpcParams = clientRpcParams, AnimationTriggerMessage = animationTriggerMessage }); } internal void QueueTriggerUpdateToServer(NetworkAnimator.AnimationTriggerMessage animationTriggerMessage) { - m_SendTriggerUpdates.Add(new TriggerUpdate() { AnimationTriggerMessage = animationTriggerMessage, SendToServer = true }); + m_SendTriggerUpdates.Add(new TriggerUpdate { AnimationTriggerMessage = animationTriggerMessage, SendToServer = true }); } internal void DeregisterUpdate() { - NetworkUpdateLoop.UnregisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate); + this.UnregisterNetworkUpdate(NetworkUpdateStage.PreUpdate); } internal NetworkAnimatorStateChangeHandler(NetworkAnimator networkAnimator) { m_NetworkAnimator = networkAnimator; m_IsServer = networkAnimator.LocalNetworkManager.IsServer; - NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate); + this.RegisterNetworkUpdate(NetworkUpdateStage.PreUpdate); } } @@ -213,7 +213,7 @@ public class NetworkAnimator : NetworkBehaviour, ISerializationCallbackReceiver #endif [Serializable] - internal class TransitionStateinfo + internal class TransitionStateInfo { public bool IsCrossFadeExit; public int Layer; @@ -260,11 +260,8 @@ public enum AuthorityModes /// public Animator Animator { - get { return m_Animator; } - set - { - m_Animator = value; - } + get => m_Animator; + set => m_Animator = value; } /// @@ -272,11 +269,11 @@ public Animator Animator /// [HideInInspector] [SerializeField] - internal List TransitionStateInfoList; + internal List TransitionStateInfoList; // Used to get the associated transition information required to synchronize late joining clients with transitions // [Layer][DestinationState][TransitionStateInfo] - private Dictionary> m_DestinationStateToTransitioninfo = new Dictionary>(); + private readonly Dictionary> m_DestinationStateToTransitionInfo = new Dictionary>(); // Named differently to avoid serialization conflicts with NetworkBehaviour internal NetworkManager LocalNetworkManager; @@ -284,21 +281,15 @@ public Animator Animator internal bool DistributedAuthorityMode; /// - /// Builds the m_DestinationStateToTransitioninfo lookup table + /// Builds the lookup table /// private void BuildDestinationToTransitionInfoTable() { foreach (var entry in TransitionStateInfoList) { - if (!m_DestinationStateToTransitioninfo.ContainsKey(entry.Layer)) - { - m_DestinationStateToTransitioninfo.Add(entry.Layer, new Dictionary()); - } - var destinationStateTransitionInfo = m_DestinationStateToTransitioninfo[entry.Layer]; - if (!destinationStateTransitionInfo.ContainsKey(entry.DestinationState)) - { - destinationStateTransitionInfo.Add(entry.DestinationState, entry); - } + m_DestinationStateToTransitionInfo.TryAdd(entry.Layer, new Dictionary()); + var destinationStateTransitionInfo = m_DestinationStateToTransitionInfo[entry.Layer]; + destinationStateTransitionInfo.TryAdd(entry.DestinationState, entry); } } @@ -323,14 +314,14 @@ internal class AnimatorParametersListContainer [SerializeField] internal AnimatorParametersListContainer AnimatorParameterEntries; - internal Dictionary AnimatorParameterEntryTable = new Dictionary(); + private readonly Dictionary m_AnimatorParameterEntryTable = new Dictionary(); #if UNITY_EDITOR [HideInInspector] [SerializeField] internal bool AnimatorParametersExpanded; - internal Dictionary ParameterToNameLookup = new Dictionary(); + private readonly Dictionary m_ParameterToNameLookup = new Dictionary(); private void ParseStateMachineStates(int layerIndex, ref AnimatorController animatorController, ref AnimatorStateMachine stateMachine) { @@ -371,7 +362,7 @@ private void ParseStateMachineStates(int layerIndex, ref AnimatorController anim } else if (transition.destinationState != null) { - var transitionInfo = new TransitionStateinfo() + var transitionInfo = new TransitionStateInfo() { Layer = layerIndex, OriginatingState = animatorState.nameHash, @@ -408,7 +399,7 @@ private void BuildTransitionStateInfoList() return; } - TransitionStateInfoList = new List(); + TransitionStateInfoList = new List(); var animControllerType = m_Animator.runtimeAnimatorController.GetType(); var animatorController = (AnimatorController)null; @@ -433,7 +424,7 @@ private void BuildTransitionStateInfoList() } } - internal void ProcessParameterEntries() + private void ProcessParameterEntries() { if (!Animator) { @@ -462,18 +453,18 @@ internal void ProcessParameterEntries() var parameters = animatorController.parameters; var parametersToRemove = new List(); - ParameterToNameLookup.Clear(); + m_ParameterToNameLookup.Clear(); foreach (var parameter in parameters) { - ParameterToNameLookup.Add(parameter.nameHash, parameter); + m_ParameterToNameLookup.Add(parameter.nameHash, parameter); } // Rebuild the parameter entry table for the inspector view - AnimatorParameterEntryTable.Clear(); + m_AnimatorParameterEntryTable.Clear(); foreach (var parameterEntry in AnimatorParameterEntries.ParameterEntries) { // Check for removed parameters. - if (!ParameterToNameLookup.ContainsKey(parameterEntry.NameHash)) + if (!m_ParameterToNameLookup.ContainsKey(parameterEntry.NameHash)) { parametersToRemove.Add(parameterEntry); // Skip this removed entry @@ -481,12 +472,9 @@ internal void ProcessParameterEntries() } // Build the list of known parameters - if (!AnimatorParameterEntryTable.ContainsKey(parameterEntry.NameHash)) - { - AnimatorParameterEntryTable.Add(parameterEntry.NameHash, parameterEntry); - } + m_AnimatorParameterEntryTable.TryAdd(parameterEntry.NameHash, parameterEntry); - var parameter = ParameterToNameLookup[parameterEntry.NameHash]; + var parameter = m_ParameterToNameLookup[parameterEntry.NameHash]; parameterEntry.name = parameter.name; parameterEntry.ParameterType = parameter.type; } @@ -498,9 +486,9 @@ internal void ProcessParameterEntries() } // Update any newly added parameters - foreach (var parameterLookUp in ParameterToNameLookup) + foreach (var parameterLookUp in m_ParameterToNameLookup) { - if (!AnimatorParameterEntryTable.ContainsKey(parameterLookUp.Value.nameHash)) + if (!m_AnimatorParameterEntryTable.ContainsKey(parameterLookUp.Value.nameHash)) { var animatorParameterEntry = new AnimatorParameterEntry() { @@ -510,7 +498,7 @@ internal void ProcessParameterEntries() Synchronize = true, }; AnimatorParameterEntries.ParameterEntries.Add(animatorParameterEntry); - AnimatorParameterEntryTable.Add(parameterLookUp.Value.nameHash, animatorParameterEntry); + m_AnimatorParameterEntryTable.Add(parameterLookUp.Value.nameHash, animatorParameterEntry); } } } @@ -602,7 +590,7 @@ public void NetworkSerialize(BufferSerializer serializer) where T : IReade serializer.SerializeValue(ref NormalizedTime); serializer.SerializeValue(ref Weight); - // Cross fading includes the duration of the cross fade. + // Cross-fading includes the duration of the cross-fade. if (CrossFade) { serializer.SerializeValue(ref Duration); @@ -680,7 +668,6 @@ public void NetworkSerialize(BufferSerializer serializer) where T : IReade /// Determines whether the is or based on the field. /// Optionally, you can still derive from and override the method. /// - /// or public bool IsServerAuthoritative() { return OnIsServerAuthoritative(); @@ -788,7 +775,7 @@ protected virtual void Awake() foreach (var parameterEntry in AnimatorParameterEntries.ParameterEntries) { - AnimatorParameterEntryTable.TryAdd(parameterEntry.NameHash, parameterEntry); + m_AnimatorParameterEntryTable.TryAdd(parameterEntry.NameHash, parameterEntry); } int layers = m_Animator.layerCount; @@ -814,10 +801,7 @@ protected virtual void Awake() // AnimationMessage. m_AnimationMessage.AnimationStates.Add(new AnimationState()); float layerWeightNow = m_Animator.GetLayerWeight(layer); - if (layerWeightNow != m_LayerWeights[layer]) - { - m_LayerWeights[layer] = layerWeightNow; - } + m_LayerWeights[layer] = layerWeightNow; } // The total initialization size calculated for the m_ParameterWriter write buffer. @@ -835,9 +819,9 @@ protected virtual void Awake() { var parameter = parameters[i]; var synchronizeParameter = true; - if (AnimatorParameterEntryTable.ContainsKey(parameter.nameHash)) + if (m_AnimatorParameterEntryTable.TryGetValue(parameter.nameHash, out var entry)) { - synchronizeParameter = AnimatorParameterEntryTable[parameter.nameHash].Synchronize; + synchronizeParameter = entry.Synchronize; } var cacheParam = new AnimatorParamCache @@ -863,8 +847,6 @@ protected virtual void Awake() var valueBool = m_Animator.GetBool(cacheParam.Hash); UnsafeUtility.WriteArrayElement(cacheParam.Value, 0, valueBool); break; - default: - break; } } @@ -986,12 +968,12 @@ private void WriteSynchronizationData(ref BufferSerializer serializer) whe 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 + // 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 + // handled by cross-fading between the late joining client's current layer's AnimationState // and the transition's destination AnimationState. if (isInTransition) { @@ -1014,14 +996,14 @@ private void WriteSynchronizationData(ref BufferSerializer serializer) whe 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)) + // synchronize using cross-fading + if (m_DestinationStateToTransitionInfo.ContainsKey(layer)) { - if (m_DestinationStateToTransitioninfo[layer].ContainsKey(nextState.shortNameHash)) + if (m_DestinationStateToTransitionInfo[layer].ContainsKey(nextState.shortNameHash)) { - var destinationInfo = m_DestinationStateToTransitioninfo[layer][nextState.shortNameHash]; + var destinationInfo = m_DestinationStateToTransitionInfo[layer][nextState.shortNameHash]; stateHash = destinationInfo.OriginatingState; - // Set the destination state to cross fade to from the originating state + // Set the destination state to cross-fade to from the originating state animationState.DestinationStateHash = destinationInfo.DestinationState; } } @@ -1070,7 +1052,7 @@ protected override void OnSynchronize(ref BufferSerializer serializer) /// /// Checks for animation state changes in: /// -Layer weights - /// -Cross fades + /// -Cross-fades /// -Transitions /// -Layer AnimationStates /// @@ -1104,7 +1086,7 @@ private void CheckForStateChange(int layer) { m_TransitionHash[layer] = nt.fullPathHash; m_AnimationHash[layer] = 0; - // Next state is the destination state for cross fade + // Next state is the destination state for cross-fade animState.DestinationStateHash = nt.fullPathHash; animState.CrossFade = true; animState.Transition = true; @@ -1117,8 +1099,8 @@ private void CheckForStateChange(int layer) // current layer (i.e. transitioning into a state from another layer) =or= we do contain the layer and the layer contains state to transition to is contained within our pre-built destination // state then we can handle this transition as a non-cross fade state transition between layers. // Otherwise, if we don't enter into this then this is a "trigger transition to some state that is now being transitioned back to the Idle state via trigger" or "Dual Triggers" IDLE<-->State. - else if (!tt.anyState && tt.fullPathHash != m_TransitionHash[layer] && (!m_DestinationStateToTransitioninfo.ContainsKey(layer) || - (m_DestinationStateToTransitioninfo.ContainsKey(layer) && m_DestinationStateToTransitioninfo[layer].ContainsKey(nt.fullPathHash)))) + else if (!tt.anyState && tt.fullPathHash != m_TransitionHash[layer] && (!m_DestinationStateToTransitionInfo.ContainsKey(layer) || + (m_DestinationStateToTransitionInfo.ContainsKey(layer) && m_DestinationStateToTransitionInfo[layer].ContainsKey(nt.fullPathHash)))) { // first time in this transition for this layer m_TransitionHash[layer] = tt.fullPathHash; @@ -1128,7 +1110,7 @@ private void CheckForStateChange(int layer) animState.CrossFade = false; animState.Transition = true; animState.NormalizedTime = tt.normalizedTime; - if (m_DestinationStateToTransitioninfo.ContainsKey(layer) && m_DestinationStateToTransitioninfo[layer].ContainsKey(nt.fullPathHash)) + if (m_DestinationStateToTransitionInfo.ContainsKey(layer) && m_DestinationStateToTransitionInfo[layer].ContainsKey(nt.fullPathHash)) { animState.DestinationStateHash = nt.fullPathHash; } @@ -1189,9 +1171,6 @@ internal void CheckForAnimatorChanges() // This sends updates only if a layer's state has changed for (int layer = 0; layer < m_Animator.layerCount; layer++) { - AnimatorStateInfo st = m_Animator.GetCurrentAnimatorStateInfo(layer); - var totalSpeed = st.speed * st.speedMultiplier; - var adjustedNormalizedMaxTime = totalSpeed > 0.0f ? 1.0f / totalSpeed : 0.0f; CheckForStateChange(layer); } @@ -1337,8 +1316,8 @@ private unsafe bool CheckParametersChanged() } /// - /// Writes all of the Animator's parameters - /// This uses the m_ParametersToUpdate list to write out only + /// Writes all the Animator's parameters + /// This uses the list to write out only /// the parameters that have changed /// private unsafe void WriteParameters(ref FastBufferWriter writer) @@ -1368,7 +1347,7 @@ private unsafe void WriteParameters(ref FastBufferWriter writer) BytePacker.WriteValuePacked(writer, (uint)valueInt); } } - else // Note: Triggers are treated like boolean values + else if (cacheValue.Type == AnimationParamEnumWrapper.AnimatorControllerParameterBool) { var valueBool = m_Animator.GetBool(hash); @@ -1453,7 +1432,7 @@ internal unsafe void UpdateParameters(ref ParametersUpdateMessage parametersUpda /// /// Applies the AnimationState state to the Animator /// - internal void UpdateAnimationState(AnimationState animationState) + private void UpdateAnimationState(AnimationState animationState) { // Handle updating layer weights first. if (animationState.Layer < m_LayerWeights.Length) @@ -1477,18 +1456,18 @@ internal void UpdateAnimationState(AnimationState animationState) { // We should have all valid entries for any animation state transition update // Verify the AnimationState's assigned Layer exists - if (m_DestinationStateToTransitioninfo.ContainsKey(animationState.Layer)) + if (m_DestinationStateToTransitionInfo.ContainsKey(animationState.Layer)) { // Verify the inner-table has the destination AnimationState name hash - if (m_DestinationStateToTransitioninfo[animationState.Layer].ContainsKey(animationState.DestinationStateHash)) + if (m_DestinationStateToTransitionInfo[animationState.Layer].ContainsKey(animationState.DestinationStateHash)) { - // Make sure we are on the originating/starting state we are going to cross fade into + // Make sure we are on the originating/starting state we are going to cross-fade into if (currentState.shortNameHash == animationState.StateHash) { // Get the transition state information - var transitionStateInfo = m_DestinationStateToTransitioninfo[animationState.Layer][animationState.DestinationStateHash]; + var transitionStateInfo = m_DestinationStateToTransitionInfo[animationState.Layer][animationState.DestinationStateHash]; - // Cross fade from the current to the destination state for the transitions duration while starting at the server's current normalized time of the transition + // Cross-fade from the current to the destination state for the transitions duration while starting at the server's current normalized time of the transition m_Animator.CrossFade(transitionStateInfo.DestinationState, transitionStateInfo.TransitionDuration, transitionStateInfo.Layer, 0.0f, animationState.NormalizedTime); } else if (LocalNetworkManager.LogLevel == LogLevel.Developer) @@ -1526,7 +1505,7 @@ internal void UpdateAnimationState(AnimationState animationState) /// The server sets its local parameters and then forwards the message to the remaining clients /// [Rpc(SendTo.Server, AllowTargetOverride = true, InvokePermission = RpcInvokePermission.Owner)] - private unsafe void SendServerParametersUpdateRpc(ParametersUpdateMessage parametersUpdate, RpcParams rpcParams = default) + private void SendServerParametersUpdateRpc(ParametersUpdateMessage parametersUpdate, RpcParams rpcParams = default) { if (IsServerAuthoritative()) { @@ -1708,9 +1687,6 @@ internal void SendServerAnimTriggerRpc(AnimationTriggerMessage animationTriggerM } } - /// - /// See above - /// private void InternalSetTrigger(int hash, bool isSet = true) { m_Animator.SetBool(hash, isSet); @@ -1721,6 +1697,7 @@ private void InternalSetTrigger(int hash, bool isSet = true) /// to forward a trigger to a client /// /// the payload containing the trigger data to apply + /// [Rpc(SendTo.NotAuthority, AllowTargetOverride = true, InvokePermission = RpcInvokePermission.Owner)] internal void SendAnimTriggerRpc(AnimationTriggerMessage animationTriggerMessage, RpcParams rpcParams = default) { @@ -1732,7 +1709,7 @@ internal void SendAnimTriggerRpc(AnimationTriggerMessage animationTriggerMessage /// a trigger to a client /// /// the payload containing the trigger data to apply - /// unused + /// unused [Rpc(SendTo.NotServer, AllowTargetOverride = true)] internal void SendClientAnimTriggerRpc(AnimationTriggerMessage animationTriggerMessage, RpcParams rpcParams = default) { @@ -1775,13 +1752,11 @@ public void SetTrigger(int hash, bool setTrigger = true) { if (IsServer) { - /// as to why we queue m_NetworkAnimatorStateChangeHandler.QueueTriggerUpdateToClient(animTriggerMessage); InternalSetTrigger(hash, setTrigger); } else { - /// as to why we queue m_NetworkAnimatorStateChangeHandler.QueueTriggerUpdateToServer(animTriggerMessage); if (!IsServerAuthoritative()) {