[Unity3d] Network 聊天

简介:  在上一个例子基础上,我们构建一个聊天室程序。 1,首先建立一个新项目,文件夹名为chat。 2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。

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

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. }  

服务端运行状态:



客户端运行状态:


相关文章
XR Interaction Toolkit教程⭐二、实现移动、传送和人物的碰撞功能
XR Interaction Toolkit教程⭐二、实现移动、传送和人物的碰撞功能
XR Interaction Toolkit教程⭐三、实现抓取和交互功能
XR Interaction Toolkit教程⭐三、实现抓取和交互功能
|
4月前
|
编解码 前端开发
XR Interaction Toolkit教程⭐四、实现与UI交互
XR Interaction Toolkit教程⭐四、实现与UI交互
|
开发工具 图形学
|
Android开发 iOS开发 C++
使用Xamarin开发即时通信系统 -- 基础篇(大量图文讲解 step by step,附源码下载)
本系列文章将详细介绍如何使用 Xamarin 开发出一个移动端的即时通信系统(手机版的聊天程序),本文作为基础篇,将着重介绍Xamarin Android和Xamarin iOS环境的搭建,包括安装、设置、模拟器、部署、运行调试等。
4792 0
|
测试技术 C# Windows
一起谈.NET技术,WPF Multi-Touch 开发:Windows 7 安装多点触屏模拟器
  本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序。众所周知Windows 7 操作系统自身已经支持具有MT 功能的硬件设备, 画板程序(Paint)就是一个很好的例子,如果你的显示设备具有MT 功能,便可以用两个手指同时在画板中绘制不同的图案。
1593 0
|
Android开发 iOS开发 C++
使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)
原文:使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)         如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购并被大力推广,.NET开发人员将时间投资在Xamarin上,以应对移动开发的热潮,应该是值得的。
1629 0
|
移动开发 图形学