- Home /
ClientRpc not working as expected
I edited the whole original post and changed it completely to simplify the problem:
public class Test : NetworkBehaviour {
NetworkManager manager;
public override void OnStartLocalPlayer()
{
CmdUpdateClients();
}
[Command]
void CmdUpdateClients()
{
if (manager == null)
{
manager = GameObject.Find("Network Manager").GetComponent<NetworkManager>();
}
if(manager.numPlayers == 3)
{
RpcAllClients();
}
}
[ClientRpc]
void RpcAllClients()
{
this.transform.position = new Vector3(0, 0, 0);
}
}
Why does the RpcAllClients function not run on all clients, but only on the last client to connect to the server?
Answer by Bunny83 · Jul 17, 2018 at 05:36 AM
RPCs and commands do not broadcast to all NetworkBehaviours in the scene. Commands and ClientRPCs are bound to the object they are send on / to. That means if a new player object is created on the new client you send a command to the server. This command is only executed on the player object of the new client since a client can only send commands to his own player object. The actual command method will be executed on the server. Here you send a ClientRPC to all clients but again only on the NetworkBehaviour of the new client. So the RPC is executed on all clients but only for the object that represents the new client.
What you can do inside your command on the server is to iterate through all connections, for each connection iterate through all playercontrollers that the specific client has and call your client RPC for each player object.
Note that your approach is generally not recommended. You currently let a client to kick off the reset action for all clients which doesn't make much sense. You probably want to use NetworkManager.OnServerReady to check for the number of players and if the number is right, send the required clientRPCs to the clients
Thanks a lot for your explanation I slowly start to understand the way multiplayer stuff works in Unity but I got to say I find it very complicated and confusing. Can you elaborate on the Network$$anonymous$$anager.OnServerReady approach? From my understanding you mean I have to set every player to ready and then use Network$$anonymous$$anager.OnServerReady to do whatever I want with the clients?
Your help is greatly appreciated!