纳金网

标题: 实现聊天功能的C#代码_教程 [打印本页]

作者: 她。    时间: 2012-6-29 14:21
标题: 实现聊天功能的C#代码_教程

    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 = ***e;

     
            inputField = "";

     
            chatEntries = new ArrayList();

     
        }

     
            

     
            

     
            void OnGUI () {

     
            if (!showChat) return;

     
            if(Event.current.type==EventType.keyDown && Event.current.character=='
' & inputField.Length<=0)

     
            {

     
                if(lastUnfocusTime + .25f < Time.time)

     
                {

     
                    usingChat = ***e;

     
                    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=='
' & 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('
',' ');

     
                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);

     
            }

     
        }

     
    }

作者: 王者再临    时间: 2012-12-30 04:15
学习了,虽然还是有难度,谢谢楼主的用心




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5