I have already created the functionality for detecting when the player speaks and move the mouth with it. But how do I sync it over the network with netcode? I tried ServerRpc/ClientRpc and this which was the closest to working but it only works on Host because ConnectedClients can be only used on Server.
private void UpdateMouth()
{
foreach (var networkClient in NetworkManager.Singleton.ConnectedClients)
{
if (networkClient.Key == 0)
{
if (MicLoudness*100 <= 1f && endTalking)
{
//FixMouthServerRpc();
return;
}
endTalking = false;
mouth1.Value = networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>()
.GetBlendShapeWeight(1);
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1,
_skinnedMeshRenderer.GetBlendShapeWeight(1) + Time.deltaTime * reverseMouth);
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) <= 0f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 0.01f);
}
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) >= 100f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 99f);
}
StartCoroutine(StopTalking());
}
else if (networkClient.Key == 1)
{
if (MicLoudness*100 <= 1f && endTalking)
{
//FixMouthServerRpc();
return;
}
endTalking = false;
mouth2.Value = networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>()
.GetBlendShapeWeight(1);
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1,
_skinnedMeshRenderer.GetBlendShapeWeight(1) + Time.deltaTime * reverseMouth);
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) <= 0f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 0.01f);
}
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) >= 100f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 99f);
}
StartCoroutine(StopTalking());
}
else if (networkClient.Key == 2)
{
if (MicLoudness*100 <= 1f && endTalking)
{
//FixMouthServerRpc();
return;
}
endTalking = false;
mouth3.Value = networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>()
.GetBlendShapeWeight(1);
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1,
_skinnedMeshRenderer.GetBlendShapeWeight(1) + Time.deltaTime * reverseMouth);
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) <= 0f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 0.01f);
}
if (networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().GetBlendShapeWeight(1) >= 100f)
{
reverseMouth = -1f * reverseMouth;
networkClient.Value.PlayerObject.GetComponentInChildren<SkinnedMeshRenderer>().SetBlendShapeWeight(1, 99f);
}
StartCoroutine(StopTalking());
}
}
}