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

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

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

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

跳转到指定楼层
楼主
发表于 2011-11-3 14:43:00 |只看该作者 |倒序浏览


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

                   }
           

               }
           

           }
         

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

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

沙发
发表于 2012-2-3 23:24:24 |只看该作者
非常感谢,管理员设置了需要对新回复进行审核,您的帖子通过审核后将被显示出来,现在将转入主题
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

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

板凳
发表于 2012-2-24 23:28:39 |只看该作者
这么后现代
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

地板
发表于 2012-4-8 23:23:45 |只看该作者
真不错,全存下来了.
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

5#
发表于 2012-4-13 23:21:10 |只看该作者
佩服,好多阿 ,哈哈
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

6#
发表于 2012-4-16 23:19:43 |只看该作者
都闪开,介个帖子,偶来顶
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

7#
发表于 2012-4-16 23:19:53 |只看该作者
佩服,好多阿 ,哈哈
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

8#
发表于 2012-6-23 23:26:06 |只看该作者
很经典,很实用,学习了!
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

9#
发表于 2012-7-25 23:21:23 |只看该作者
不错哦,顶一下......
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

10#
发表于 2012-7-27 23:26:25 |只看该作者
心中有爱,爱咋咋地
回复

使用道具 举报

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

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-27 16:41 , Processed in 0.123664 second(s), 28 queries .

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

© 2008-2019 Narkii Inc.

回顶部