mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
feat: Added Layer Weight to NetworkAnimator (#2134)
* 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>
This commit is contained in:
parent
87a96d17ca
commit
23b9fb0214
@ -41,6 +41,7 @@ public class NetworkAnimator : NetworkBehaviour
|
||||
// multiple layers
|
||||
int[] animationHash;
|
||||
int[] transitionHash;
|
||||
float[] layerWeight;
|
||||
float nextSendTime;
|
||||
|
||||
bool SendMessagesAllowed
|
||||
@ -78,6 +79,7 @@ void Awake()
|
||||
|
||||
animationHash = new int[animator.layerCount];
|
||||
transitionHash = new int[animator.layerCount];
|
||||
layerWeight = new float[animator.layerCount];
|
||||
}
|
||||
|
||||
void FixedUpdate()
|
||||
@ -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);
|
||||
@ -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);
|
||||
@ -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()
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -194,6 +204,8 @@ void HandleAnimMsg(int stateHash, float normalizedTime, int layerId, NetworkRead
|
||||
animator.Play(stateHash, layerId, normalizedTime);
|
||||
}
|
||||
|
||||
animator.SetLayerWeight(layerId, weight);
|
||||
|
||||
ReadParameters(reader);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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]
|
||||
|
Loading…
Reference in New Issue
Block a user