|
- using UnityEngine;
- using System.Collections;
- public class Chat : MonoBehaviour {
- bool usingChat = false;
- bool showChat = false;
- string inputField = "";
- Vector2 scrollposition;
- int width = 500;
- int height = 200;
- string playerName;
- float lastUnfocusTime = 0;
- Rect window;
- ArrayList playerList = new ArrayList();
- class PlayerNode
- {
- public string playerName;
- public NetworkPlayer player;//NetworkPlayer是一个数据结构,保存着你可以从网络定位的另一位玩家的信息。比如,基于NetworkPlayer你可以向另外一个玩家发送消息。
- }
- ArrayList chatEntries=new ArrayList();
- class ChatEntry
- {
- public string name="";
- public string text="";
- }
- // Use this for initialization
- void Start () {
- window = new Rect(Screen.width / 2-width/2,Screen.height-height+5,width,height);
- }
- void OnConnectedToServer()
- {
- playerName = PlayerPrefs.GetString("playerName","");
- if(playerName=="")
- {
- playerName = "RandomName"+Random.Range(1,999);
- }
- ShowChatWindow();
- networkView.RPC("TellServerOurName",RPCMode.Server,playerName);//在所有连接端调用一个RPC函数。
- addGameChatMessage(playerName+" hase just joined the chat!");
- }
-
- void OnServerInitialized()
- {
- playerName = PlayerPrefs.GetString("playerName","");
- if(playerName=="")
- {
- playerName = "RandomName"+Random.Range(1,999);
- }
- ShowChatWindow();
- PlayerNode newEntry =new PlayerNode();
- newEntry.playerName = playerName;
- newEntry.player = Network.player;
- playerList.Add(newEntry);
- addGameChatMessage(playerName+" hase just joined the chat!");
- }
- PlayerNode GetPlayerNode(NetworkPlayer netPlay)
- {
- foreach(PlayerNode entry in playerList)
- {
- if(entry.player==netPlay)
- {
- return entry;
- }
-
- }
- Debug.LogError("GetPlayNode:Requested a playernode of non-existing player!");
- return null;
- }
- void OnPlayerDisconnected(NetworkPlayer netPlayer)//当一个玩家从服务器上断开时在服务器端调用。
- {
- addGameChatMessage("A Player has discinnected");
- playerList.Remove(GetPlayerNode(netPlayer));
- }
- void OnDisconnectedFromServer()
- {
- CloseChatWindow();
- }
-
- [RPC]
- void TellServerOurName(string name,NetworkMessageInfo info)//NetworkMessageInfo 网络数据信息,刚从网络接收的数据的相关信息会被保存到这个结构中。它揭示了从哪里来(数据源),什么时间发送和什么网络视图发送;其中包括:数据源、发送时间、网络视图。http://3d.ceeger.com/Script/NetworkMessageInfo/NetworkMessageInfo.html
- {
- PlayerNode newEntry = new PlayerNode();
- newEntry.playerName = playerName;
- newEntry.player = Network.player;
- playerList.Add(newEntry);
- addGameChatMessage(playerName+" has just joined the chat!");
- }
- void CloseChatWindow()
- {
- showChat = false;
- inputField = "";
- chatEntries = new ArrayList();
- }
- void ShowChatWindow()
- {
- showChat = true;
- inputField = "";
- chatEntries = new ArrayList();
- }
-
-
- void OnGUI () {
- if (!showChat) return;
- if(Event.current.type==EventType.keyDown && Event.current.character=='\n' & inputField.Length<=0)
- {
- if(lastUnfocusTime + .25f < Time.time)
- {
- usingChat = true;
- GUI.FocusWindow(5);
- GUI.FocusControl("Chat input field");
- }
- }
- window = GUI.Window(5,window,GlobalChatWindow,"");
- }
- void GlobalChatWindow(int id)
- {
- GUILayout.BeginVertical();
- GUILayout.Space(10);
- GUILayout.EndVertical();
- scrollposition = GUILayout.BeginScrollView(scrollposition);
- foreach(ChatEntry entry in chatEntries)
- {
- GUILayout.BeginHorizontal();
- if (entry.name == " - ")
- {
- GUILayout.Label(entry.name + entry.text);
- }
- else
- {
- GUILayout.Label(entry.name+": "+entry.text);
- }
- GUILayout.EndHorizontal();
- GUILayout.Space(2);
- }
- GUILayout.EndScrollView();
- if(Event.current.type==EventType.keyDown && Event.current.character=='\n' & inputField.Length>0)
- {
- HitEnter(inputField);
- }
- GUI.SetNextControlName("Chat input field");
- inputField = GUILayout.TextField(inputField);
- if(Input.GetKeyDown("mouse 0"))
- {
- if(usingChat)
- {
- usingChat = false;
- GUI.UnfocusWindow();
- lastUnfocusTime = Time.time;
- }
- }
- }
- void HitEnter(string msg)
- {
- msg = msg.Replace('\n',' ');
- networkView.RPC("ApplyGlobalChatText",RPCMode.All,playerName,msg);
- }
- [RPC]
- void ApplyGlobalChatText(string name,string msg)
- {
- ChatEntry entry=new ChatEntry();
- entry.name=name;
- entry.text=msg;
- chatEntries.Add(entry);
- if(chatEntries.Count>4)
- {
- chatEntries.RemoveAt(0);
- }
- scrollposition.y=1000000;
- inputField="";
- }
- void addGameChatMessage(string str)
- {
- ApplyGlobalChatText(" - ",str);
- if(Network.connections.Length>0)
- {
- networkView.RPC("ApplyGlobalChatText",RPCMode.Others," - ",str);
- }
- }
- }
复制代码 |
|