[Unity3d] Network 聊天

简介:

 在上一个例子基础上,我们构建一个聊天室程序。

1,首先建立一个新项目,文件夹名为chat。

2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

3,服务器端程序:(C# 脚本)

[csharp]  view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class server : MonoBehaviour {  
  5.       
  6.     int Port = 10100;  
  7.     string Message = "";  
  8.     //声明一个二维向量   
  9.     Vector2 Sc;   
  10.       
  11.     //OnGUI方法,所有GUI的绘制都需要在这个方法中实现  
  12.     void OnGUI(){  
  13.         //Network.peerType是端类型的状态:  
  14.         //即disconnected, connecting, server 或 client四种  
  15.         switch(Network.peerType){  
  16.             //禁止客户端连接运行, 服务器未初始化  
  17.             case NetworkPeerType.Disconnected:  
  18.                 StartServer();  
  19.                 break;  
  20.             //运行于服务器端  
  21.             case NetworkPeerType.Server:  
  22.                 OnServer();  
  23.                 break;  
  24.             //运行于客户端  
  25.             case NetworkPeerType.Client:  
  26.                 break;  
  27.             //正在尝试连接到服务器  
  28.             case NetworkPeerType.Connecting:  
  29.                 break;  
  30.         }  
  31.     }  
  32.       
  33.     void StartServer(){  
  34.         //当用户点击按钮的时候为true  
  35.         if (GUILayout.Button("创建服务器")) {  
  36.             //初始化本机服务器端口,第一个参数就是本机接收多少连接  
  37.             NetworkConnectionError error = Network.InitializeServer(12,Port,false);  
  38.             //连接状态  
  39.             switch(error){  
  40.                 case NetworkConnectionError.NoError:  
  41.                     break;  
  42.                 default:  
  43.                     Debug.Log("服务端错误"+error);  
  44.                     break;  
  45.             }  
  46.         }  
  47.     }  
  48.       
  49.     void OnServer(){  
  50.         GUILayout.Label("服务端已经运行,等待客户端连接");  
  51.         //Network.connections是所有连接的玩家, 数组[]  
  52.         //取客户端连接数.   
  53.         int length = Network.connections.Length;  
  54.         //按数组下标输出每个客户端的IP,Port  
  55.         for (int i=0; i<length; i++)  
  56.         {  
  57.             GUILayout.Label("客户端"+i);  
  58.             GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);  
  59.             GUILayout.Label("客户端端口"+Network.connections[i].port);  
  60.             GUILayout.Label("-------------------------------");  
  61.         }  
  62.         //当用户点击按钮的时候为true  
  63.         if (GUILayout.Button("断开服务器")){  
  64.             Network.Disconnect();  
  65.         }  
  66.         //创建开始滚动视图  
  67.         Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  
  68.         //绘制纹理, 显示内容  
  69.         GUILayout.Box(Message);  
  70.         //结束滚动视图, 注意, 与开始滚动视图成对出现  
  71.         GUILayout.EndScrollView();    
  72.     }  
  73.       
  74.     //接收请求的方法. 注意要在上面添加[RPC]  
  75.     [RPC]  
  76.     void ReciveMessage(string msg, NetworkMessageInfo info){  
  77.         //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
  78.         Message = "发送端"+info.sender  +"消息"+msg;  
  79.         //+"时间"+info.timestamp +"网络视图"+info.networkView  
  80.     }  
  81.       
  82.       
  83.     // Use this for initialization  
  84.     void Start () {  
  85.       
  86.     }  
  87.       
  88.     // Update is called once per frame  
  89.     void Update () {  
  90.       
  91.     }  
  92. }  

4,把脚本拖拽到主摄像机上,绑定。

5,运行程序 File---->Build settings---->Build And Run,选择Web Player

6,服务器端建立完毕,保持服务器端的运行状态。

7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

客户端代码:

[csharp]  view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class client : MonoBehaviour {  
  5.     //要连接的服务器地址  
  6.     string IP = "127.0.0.1";  
  7.     //要连接的端口  
  8.     int Port = 10100;  
  9.     //聊天信息  
  10.     string Message = "";  
  11.     //声明一个二维向量   
  12.     Vector2 Sc;   
  13.           
  14.     void OnGUI(){  
  15.         //端类型的状态  
  16.         switch(Network.peerType){  
  17.             //禁止客户端连接运行, 服务器未初始化  
  18.             case NetworkPeerType.Disconnected:  
  19.                 StartConnect();  
  20.                 break;  
  21.             //运行于服务器端  
  22.             case NetworkPeerType.Server:  
  23.                 break;  
  24.             //运行于客户端  
  25.             case NetworkPeerType.Client:  
  26.                 OnClient();  
  27.                 break;  
  28.             //正在尝试连接到服务器  
  29.             case NetworkPeerType.Connecting:  
  30.                 break;  
  31.         }  
  32.     }  
  33.           
  34.     void StartConnect(){  
  35.         if (GUILayout.Button("连接服务器")){  
  36.             NetworkConnectionError error = Network.Connect(IP,Port);  
  37.             //连接状态  
  38.             switch(error){  
  39.                 case NetworkConnectionError.NoError:  
  40.                     break;  
  41.                 default:  
  42.                     Debug.Log("客户端错误"+error);  
  43.                     break;  
  44.             }  
  45.         }  
  46.     }  
  47.       
  48.     void OnClient(){  
  49.         //创建开始滚动视图  
  50.         Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  
  51.         //绘制纹理, 显示内容  
  52.         GUILayout.Box(Message);  
  53.         //文本框  
  54.         Message = GUILayout.TextArea(Message);  
  55.         if (GUILayout.Button("发送")){  
  56.             //发送给接收的函数, 模式为全部, 参数为信息  
  57.             networkView.RPC("ReciveMessage", RPCMode.All, Message);  
  58.         }  
  59.         //结束滚动视图, 注意, 与开始滚动视图成对出现  
  60.         GUILayout.EndScrollView();  
  61.           
  62.     }  
  63.       
  64.     //接收请求的方法. 注意要在上面添加[RPC]  
  65.     [RPC]  
  66.     void ReciveMessage(string msg, NetworkMessageInfo info){  
  67.         //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
  68.         Message = "发送端"+info.sender  +"消息"+msg;  
  69.     }  
  70.           
  71.     // Use this for initialization  
  72.     void Start () {  
  73.       
  74.     }  
  75.       
  76.     // Update is called once per frame  
  77.     void Update () {  
  78.       
  79.     }  
  80. }  

服务端运行状态:



客户端运行状态:















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366204,如需转载请自行联系原作者
相关文章
|
1月前
|
人工智能
Adobe推出文生音乐工具Project Music GenAI Control
【2月更文挑战第13天】Adobe推出文生音乐工具Project Music GenAI Control
59 2
Adobe推出文生音乐工具Project Music GenAI Control
|
JSON 数据格式
APICloud 入门教程窗口篇
什么是窗口,窗口可以理解为一屏幕内容的一个基本载体,里面可以放导航,图片,视频,文字等组成一屏幕内容。
271 0
APICloud 入门教程窗口篇
一起谈.NET技术,Silverlight实例教程 - Out of Browser音乐播放器
  Silverlight 实例教程索引 Silverlight 实例教程 - Out of Browser开篇 Silverlight 实例教程 - Out of Browser配置,安装和卸载 Silverlight 实例教程 - Out of Browser的自定义应用 Silverligh...
1049 0
|
Android开发 iOS开发 C++
使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)
原文:使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)         如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购并被大力推广,.NET开发人员将时间投资在Xamarin上,以应对移动开发的热潮,应该是值得的。
1576 0
|
搜索推荐 Android开发 iOS开发
UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial
原文:UWP 手绘视频创作工具技术分享系列 - Ink & Surface Dial 本篇作为技术分享系列的第四篇,详细讲一下手绘视频中 Surface Pen 和 Surface Dial 的使用场景。
1421 0
|
移动开发 图形学
|
图形学 数据安全/隐私保护