纳金网

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

作者: 晃晃    时间: 2011-9-23 14:21
标题: unity3d中实现聊天功能的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 = true;

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

        }

    }

}
作者: Asen    时间: 2011-9-23 15:13

作者: 菜刀吻电线    时间: 2012-2-26 23:30
响应天帅号召,顶

作者: tc    时间: 2012-3-7 23:26
水。。。

作者: 菜刀吻电线    时间: 2012-3-19 23:28
呵呵,很好,方便罗。

作者: C.R.CAN    时间: 2012-4-6 23:24
长了不少见识

作者: tc    时间: 2012-5-3 23:22
真是不错啊

作者: markq    时间: 2012-5-4 23:20
  谢谢分享



爱生活 爱3D 爱纳金网



www.narkii.com
作者: 奇    时间: 2012-5-23 23:19
凡系斑竹滴话要听;凡系朋友滴帖要顶

作者: tc    时间: 2012-7-30 23:19
很经典,很实用,学习了!

作者: C.R.CAN    时间: 2012-9-10 08:36
我是老实人,我来也!





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