Skip to content

Commit

Permalink
feat: Added Layer Weight to NetworkAnimator (#2134)
Browse files Browse the repository at this point in the history
* Added Layer Weight to NetworkAnimator

Now NetworkAnimator is aware of each layer weight on it's references
Animator and will sync layer weights across the network.

* NetworkAnimator layers Float equality fix

* Update Assets/Mirror/Components/NetworkAnimator.cs

Co-authored-by: James Frowen <jamesfrowen5@gmail.com>

* Update Assets/Mirror/Components/NetworkAnimator.cs

Co-authored-by: James Frowen <jamesfrowen5@gmail.com>

* Remove GetLayerWeight check every incoming packet as is extern call

Co-authored-by: James Frowen <jamesfrowen5@gmail.com>
  • Loading branch information
kaffo and James-Frowen committed Aug 5, 2020
1 parent 87a96d1 commit 23b9fb0
Showing 1 changed file with 26 additions and 12 deletions.
38 changes: 26 additions & 12 deletions Assets/Mirror/Components/NetworkAnimator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public class NetworkAnimator : NetworkBehaviour
// multiple layers
int[] animationHash;
int[] transitionHash;
float[] layerWeight;
float nextSendTime;

bool SendMessagesAllowed
Expand Down Expand Up @@ -78,6 +79,7 @@ void Awake()

animationHash = new int[animator.layerCount];
transitionHash = new int[animator.layerCount];
layerWeight = new float[animator.layerCount];
}

void FixedUpdate()
Expand All @@ -102,16 +104,24 @@ void FixedUpdate()
using (PooledNetworkWriter writer = NetworkWriterPool.GetWriter())
{
WriteParameters(writer);
SendAnimationMessage(stateHash, normalizedTime, i, writer.ToArray());
SendAnimationMessage(stateHash, normalizedTime, i, layerWeight[i], writer.ToArray());
}
}
}

bool CheckAnimStateChanged(out int stateHash, out float normalizedTime, int layerId)
{
bool change = false;
stateHash = 0;
normalizedTime = 0;

float lw = animator.GetLayerWeight(layerId);
if (Mathf.Abs(lw - layerWeight[layerId]) > 0.001f)
{
layerWeight[layerId] = lw;
change = true;
}

if (animator.IsInTransition(layerId))
{
AnimatorTransitionInfo tt = animator.GetAnimatorTransitionInfo(layerId);
Expand All @@ -122,7 +132,7 @@ bool CheckAnimStateChanged(out int stateHash, out float normalizedTime, int laye
animationHash[layerId] = 0;
return true;
}
return false;
return change;
}

AnimatorStateInfo st = animator.GetCurrentAnimatorStateInfo(layerId);
Expand All @@ -139,7 +149,7 @@ bool CheckAnimStateChanged(out int stateHash, out float normalizedTime, int laye
animationHash[layerId] = st.fullPathHash;
return true;
}
return false;
return change;
}

void CheckSendRate()
Expand All @@ -157,15 +167,15 @@ void CheckSendRate()
}
}

void SendAnimationMessage(int stateHash, float normalizedTime, int layerId, byte[] parameters)
void SendAnimationMessage(int stateHash, float normalizedTime, int layerId, float weight, byte[] parameters)
{
if (isServer)
{
RpcOnAnimationClientMessage(stateHash, normalizedTime, layerId, parameters);
RpcOnAnimationClientMessage(stateHash, normalizedTime, layerId, weight, parameters);
}
else if (ClientScene.readyConnection != null)
{
CmdOnAnimationServerMessage(stateHash, normalizedTime, layerId, parameters);
CmdOnAnimationServerMessage(stateHash, normalizedTime, layerId, weight, parameters);
}
}

Expand All @@ -181,7 +191,7 @@ void SendAnimationParametersMessage(byte[] parameters)
}
}

void HandleAnimMsg(int stateHash, float normalizedTime, int layerId, NetworkReader reader)
void HandleAnimMsg(int stateHash, float normalizedTime, int layerId, float weight, NetworkReader reader)
{
if (hasAuthority && clientAuthority)
return;
Expand All @@ -194,6 +204,8 @@ void HandleAnimMsg(int stateHash, float normalizedTime, int layerId, NetworkRead
animator.Play(stateHash, layerId, normalizedTime);
}

animator.SetLayerWeight(layerId, weight);

ReadParameters(reader);
}

Expand Down Expand Up @@ -340,6 +352,7 @@ public override bool OnSerialize(NetworkWriter writer, bool initialState)
writer.WriteInt32(st.fullPathHash);
writer.WriteSingle(st.normalizedTime);
}
writer.WriteSingle(animator.GetLayerWeight(i));
}
WriteParameters(writer, initialState);
return true;
Expand All @@ -360,6 +373,7 @@ public override void OnDeserialize(NetworkReader reader, bool initialState)
{
int stateHash = reader.ReadInt32();
float normalizedTime = reader.ReadSingle();
animator.SetLayerWeight(i, reader.ReadSingle());
animator.Play(stateHash, i, normalizedTime);
}

Expand Down Expand Up @@ -468,7 +482,7 @@ public void ResetTrigger(int hash)
#region server message handlers

[Command]
void CmdOnAnimationServerMessage(int stateHash, float normalizedTime, int layerId, byte[] parameters)
void CmdOnAnimationServerMessage(int stateHash, float normalizedTime, int layerId, float weight, byte[] parameters)
{
// Ignore messages from client if not in client authority mode
if (!clientAuthority)
Expand All @@ -479,8 +493,8 @@ void CmdOnAnimationServerMessage(int stateHash, float normalizedTime, int layerI
// handle and broadcast
using (PooledNetworkReader networkReader = NetworkReaderPool.GetReader(parameters))
{
HandleAnimMsg(stateHash, normalizedTime, layerId, networkReader);
RpcOnAnimationClientMessage(stateHash, normalizedTime, layerId, parameters);
HandleAnimMsg(stateHash, normalizedTime, layerId, weight, networkReader);
RpcOnAnimationClientMessage(stateHash, normalizedTime, layerId, weight, parameters);
}
}

Expand Down Expand Up @@ -532,10 +546,10 @@ void CmdOnAnimationResetTriggerServerMessage(int hash)
#region client message handlers

[ClientRpc]
void RpcOnAnimationClientMessage(int stateHash, float normalizedTime, int layerId, byte[] parameters)
void RpcOnAnimationClientMessage(int stateHash, float normalizedTime, int layerId, float weight, byte[] parameters)
{
using (PooledNetworkReader networkReader = NetworkReaderPool.GetReader(parameters))
HandleAnimMsg(stateHash, normalizedTime, layerId, networkReader);
HandleAnimMsg(stateHash, normalizedTime, layerId, weight, networkReader);
}

[ClientRpc]
Expand Down

0 comments on commit 23b9fb0

Please sign in to comment.