• unity3d中实现聊天功能


    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/Netw ... orkMessageInfo.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);
            }
        }
    }

  • 相关阅读:
    tp3.2 企业转账到零钱
    nodejs 定时器
    lake counting DFS 搜索
    巧抓纪念币 BFS 剪枝优化
    E Road Reduction BFS & Dijkstra
    CPU Scheduling in Operating Systems
    D Together Square
    Dijkstra's algorithm a greedy or dynamic programming algorithm?
    K Swap 归并排序
    C#和Java,究竟选哪个方向?我只说事实,你自己分析……
  • 原文地址:https://www.cnblogs.com/softimagewht/p/2961987.html
Copyright © 2020-2023  润新知