12 第1页 | 共2 页下一页
返回列表 发新帖
查看: 3447|回复: 10
打印 上一主题 下一主题

unity3d中实现聊天功能的C#代码_教程

[复制链接]

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2011-9-23 14:21:55 |只看该作者 |倒序浏览
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);

        }

    }

}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

Asen    

867

主题

0

听众

1万

积分

外协人员

Rank: 7Rank: 7Rank: 7

纳金币
17488
精华
1
沙发
发表于 2011-9-23 15:13:18 |只看该作者
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2012-2-26 23:30:09 |只看该作者
响应天帅号召,顶
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-3-7 23:26:37 |只看该作者
水。。。
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-3-19 23:28:41 |只看该作者
呵呵,很好,方便罗。
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-4-6 23:24:52 |只看该作者
长了不少见识
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-5-3 23:22:23 |只看该作者
真是不错啊
回复

使用道具 举报

markq    

511

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
15839
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-5-4 23:20:52 |只看该作者
  谢谢分享



爱生活 爱3D 爱纳金网



www.narkii.com
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2012-5-23 23:19:55 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

10#
发表于 2012-7-30 23:19:17 |只看该作者
很经典,很实用,学习了!
回复

使用道具 举报

12 第1页 | 共2 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-21 20:26 , Processed in 0.094702 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部