- Home /
Textmesh Username for networkplayers. help.
Hello im looking for a solution, so far i have managed to use a textmesh component that is attached to and object, which is a child of the instantiated prefab, therefore each user has this textmesh object. I have edited code based on chat scripts to make arrays of all users. This script works for two connections, both can see eachothers names above thier avatars head but when the third connects serverside remote 1 and 2 swap usernames and on clients remote 1 & 2 have the same username, lookin for advanced advice on how i can make this work. Thanks.
Namespace..
public var UserName: GameObject; public var Cam: GameObject; public var player : NetworkPlayer; public var username : String; public var awakeName: String; public var remoteUsers : int; public var remoteInt : int = 1; public var userList = new Array(); public var userName: String;
class UserNode{ var userName : String; var networkPlayer : NetworkPlayer; } //
body..
function Awake () { userName = ConnectGui.playerNameInput; // this is a PlayerPrefs.GetString in ConnectGui script. awakeName = userName;
if(networkView.isMine){ gameObject.tag = "LocalName"; gameObject.GetComponentInChildren(TextMesh).text = awakeName; }
if(!networkView.isMine){
gameObject.tag = "RemoteName";
}
RemoteNameInst (); //renames this object from username to unsername1 ...2 ...3 etc.
if(Network.isClient || Network.isServer){
networkView.RPC ("TellOurUser", RPCMode.OthersBuffered, awakeName);
}
networkView.RPC("MeshName", RPCMode.OthersBuffered, awakeName);}
function Update () {
remoteUsers = userList.length;
UserName = GameObject.FindWithTag("LocalName"); UserName.transform.localPosition = Vector3(0, 2, 0); Cam = GameObject.FindWithTag("MainCamera"); var direction : Vector3 = Cam.transform.position - UserName.transform.position; transform.LookAt(UserName.transform.position - direction);
}
Other functions ...
function OnPlayerDisconnected(player: NetworkPlayer) { userList.Remove(GetUserNode(player)); } function OnNetworkInstantiate (info : NetworkMessageInfo){ remoteInt +=1; RemoteNameInst (); } @RPC //Sent by newly connected clients, recieved by server function TellOurUser(name : String, info : NetworkMessageInfo){ var newEntry : UserNode = new UserNode(); newEntry.userName=name; newEntry.networkPlayer=info.sender; userList.Add(newEntry); }
@RPC
function MeshName (name : String){
for(var entry : UserNode in userList){
if(entry.userName==name){
LocalUserName (name); // function bellow changes remotes username textmesh.name
}
}
}
function GetUserNode(networkPlayer : NetworkPlayer){
for(var entry : UserNode in userList){
if(entry.networkPlayer==networkPlayer){
return entry;
}
}
Debug.LogError("GetUserNode: Requested a playernode of non-existing player!");
return null;
}
function LocalUserName (name : String){
var remotelist = gameObject.FindGameObjectsWithTag ("RemoteName");
if(!gameObject.Find("Username2")){
remotelist[0].GetComponent(TextMesh).text = name;
}
if(gameObject.Find("Username1") && gameObject.Find("Username2")){
remotelist[1].GetComponent(TextMesh).text = name;
}
if(gameObject.Find("Username1") && gameObject.Find("Username2")&& gameObject.Find("Username3")){
remotelist[2].GetComponent(TextMesh).text = name;
}
return;
}
function RemoteNameInst (){
var rgo = gameObject.FindGameObjectsWithTag ("RemoteName");
if(!networkView.isMine){
if(remoteInt == 1){
rgo[0].name = "Username" + 1;
}
if(remoteInt == 2){
rgo[0].name = "Username" + 1;
rgo[1].name = "Username" + 2;
}
if(remoteInt == 3){
rgo[0].name = "Username" + 1;
rgo[1].name = "Username" + 2;
rgo[2].name = "Username" + 3;
}
}
}
Answer by Sinncere · Apr 19, 2010 at 01:28 PM
nevermind, ive managed to create a workin script for this problem. Any improvements are welcome.
few edits ...
RPCMode's ...
@RPC function TellOurUser(name : String, info : NetworkMessageInfo){ var newEntry : UserNode = new UserNode(); newEntry.userName=name; newEntry.networkPlayer=info.sender; userList.Add(newEntry); PlayerPrefs.SetString(name, name); // <---- creating keys for remote usernames. }
@RPC function MeshName (name : String){ for(var entry : UserNode in userList){ if(entry.userName==name){
var userPrefs = PlayerPrefs.GetString(name, "");
LocalUserName (userPrefs); // <-- if remote name == the username in our array, then userPrefs = string key name from playerPrefs.
} } }
related functions ...
function LocalUserName (name : String){ var remotelist = gameObject.FindGameObjectsWithTag ("RemoteName"); if(gameObject.Find("Username1")){ var un1 : GameObject = gameObject.Find("Username1"); if(un1.GetComponent(TextMesh).text.Length ==0){ remotelist[0].GetComponent(TextMesh).text = name; } } if(gameObject.Find("Username2")){ var un2 : GameObject = gameObject.Find("Username2"); if(un2.GetComponent(TextMesh).text.Length ==0){ remotelist[1].GetComponent(TextMesh).text = name; } } if(gameObject.Find("Username3")){ var un3 : GameObject = gameObject.Find("Username3"); if(un3.GetComponent(TextMesh).text.Length ==0){ remotelist[2].GetComponent(TextMesh).text = name; } }
return; }
function RemoteNameInst (){ var rgo = gameObject.FindGameObjectsWithTag ("RemoteName"); if(!networkView.isMine){ if(remoteInt == 1){ rgo[0].name = "Username" + 1; } if(remoteInt == 2){ rgo[0].name = "Username" + 1; rgo[1].name = "Username" + 2; } if(remoteInt == 3){ rgo[0].name = "Username" + 1; rgo[1].name = "Username" + 2; rgo[2].name = "Username" + 3; }
} }
Your answer
Follow this Question
Related Questions
TextMesh multiplayer/network issue 0 Answers
TextMesh sync player names with other players 1 Answer
Deleting a player over the network 1 Answer
How to Get a Char from his name ? 1 Answer
Assigning Player Numbers 0 Answers