- Home /
How to display player ID on client sides?
Hi,
I followed this great tutorial to build a multiplayer application with a specific server and each client being a player: http://3dgep.com/?p=4609
In a fully authoritative mode, I don't know how to send specific variables (I mean other than the position/rotation of the transform) to each player. For example, to display the player ID on each player (cube), I've been doing the following in a ServerPlayerManager (server-side):
Hashtable players = new Hashtable();
public void spawnPlayer(NetworkPlayer player) {
Debug.Log("Spawning player game object for player " + player);
PlayerInfo ply = GameObject.FindObjectOfType(typeof(PlayerInfo)) as PlayerInfo;
GameObject go = (GameObject)Network.Instantiate(ply.playerPrefab, Vector3.up*3, Quaternion.identity, 0);
players[player] = go;
networkView.RPC("setID", RPCMode.All, player);
}
[RPC]
void setID(NetworkPlayer player) {
GameObject go = (GameObject)players[player];
cubeScript cSript = (cubeScript)go.GetComponent<cubeScript>();
cSript.ID = player.ToString();
}
In my cube/player prefab, I attached a script (observed by a NetworkView) with a public variable ID, which I link to a TextMesh.
Problem: On the server side, each cube has its own label displayed correctly. BUT on the client side - it does not work.
It looks like the reason is that the Hashtable "players" is empty on the client side - so the code cannot reach specifically each player displayed to update the correct ID.
Can somebody help on that?
Thanks!
Answer by JooZ · Apr 12, 2014 at 02:16 AM
OK. Not sure if anyone is interested, but I found my answer and post it here in case somebody arrived later with the same question.
The trick here is be able to get access to the networkView of the prefab itself and to call a function from there towards every other player or server.
What I had above as setID function needs to be moved in the script attached to the player prefab:
[RPC]
void setID(NetworkPlayer player)
{
this.ID = player.ToString();
}
Then in my SpawnPlayer function above, where I instantiate the players from the server, I need to do an RPC from the prefab of the script itself. Something like:
Hashtable players = new Hashtable();
public void spawnPlayer(NetworkPlayer player) {
Debug.Log("Spawning player game object for player " + player);
PlayerInfo ply = GameObject.FindObjectOfType(typeof(PlayerInfo)) as PlayerInfo;
GameObject go = (GameObject)Network.Instantiate(ply.playerPrefab, Vector3.up*3, Quaternion.identity, 0);
players[player] = go;
NetworkView remoteNetworkView = go.networkView;
remoteNetworkView.RPC("SetID", RPCMode.AllBuffered, player);
}
So the difference from what I was doing previously is the networkview on which I was running an RPC.
Your answer
Follow this Question
Related Questions
How to check when a new client/local player is loaded? 1 Answer
Authoritative vs Non-authoritative server (turn-based) 0 Answers
Player Object Not Spawning 0 Answers
SetClientOwner m_ClientAuthorityOwner alread set! 2 Answers
Instantiated object from client player not moving when spawned. How can I fix this? 0 Answers