Unity网络通信(二)Unity Network 聊天

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

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

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

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

using UnityEngine;
using System.Collections;

public class server : MonoBehaviour {
	
	int Port = 10100;
	string Message = "";
	//声明一个二维向量 
	Vector2 Sc; 
	
	//OnGUI方法,所有GUI的绘制都需要在这个方法中实现
	void OnGUI(){
		//Network.peerType是端类型的状态:
		//即disconnected, connecting, server 或 client四种
		switch(Network.peerType){
			//禁止客户端连接运行, 服务器未初始化
			case NetworkPeerType.Disconnected:
				StartServer();
			    break;
			//运行于服务器端
			case NetworkPeerType.Server:
				OnServer();
			    break;
			//运行于客户端
			case NetworkPeerType.Client:
			    break;
			//正在尝试连接到服务器
			case NetworkPeerType.Connecting:
				break;
		}
	}
	
	void StartServer(){
		//当用户点击按钮的时候为true
		if (GUILayout.Button("创建服务器")) {
			//初始化本机服务器端口,第一个参数就是本机接收多少连接
			NetworkConnectionError error = Network.InitializeServer(12,Port,false);
			//连接状态
			switch(error){
				case NetworkConnectionError.NoError:
				    break;
			    default:
			        Debug.Log("服务端错误"+error);
				    break;
			}
		}
	}
	
	void OnServer(){
		GUILayout.Label("服务端已经运行,等待客户端连接");
		//Network.connections是所有连接的玩家, 数组[]
		//取客户端连接数. 
		int length = Network.connections.Length;
		//按数组下标输出每个客户端的IP,Port
		for (int i=0; i<length; i++)
		{
			GUILayout.Label("客户端"+i);
			GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);
			GUILayout.Label("客户端端口"+Network.connections[i].port);
			GUILayout.Label("-------------------------------");
		}
		//当用户点击按钮的时候为true
		if (GUILayout.Button("断开服务器")){
			Network.Disconnect();
		}
		//创建开始滚动视图
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
		//绘制纹理, 显示内容
		GUILayout.Box(Message);
		//结束滚动视图, 注意, 与开始滚动视图成对出现
		GUILayout.EndScrollView();	
	}
	
	//接收请求的方法. 注意要在上面添加[RPC]
	[RPC]
	void ReciveMessage(string msg, NetworkMessageInfo info){
		//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
		Message = "发送端"+info.sender  +"消息"+msg;
		//+"时间"+info.timestamp +"网络视图"+info.networkView
	}
	
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

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

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

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

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

客户端代码:

using UnityEngine;
using System.Collections;

public class client : MonoBehaviour {
	//要连接的服务器地址
	string IP = "127.0.0.1";
	//要连接的端口
	int Port = 10100;
	//聊天信息
	string Message = "";
	//声明一个二维向量 
	Vector2 Sc; 
		
	void OnGUI(){
		//端类型的状态
		switch(Network.peerType){
			//禁止客户端连接运行, 服务器未初始化
			case NetworkPeerType.Disconnected:
				StartConnect();
			    break;
			//运行于服务器端
			case NetworkPeerType.Server:
			    break;
			//运行于客户端
			case NetworkPeerType.Client:
			    OnClient();
			    break;
			//正在尝试连接到服务器
			case NetworkPeerType.Connecting:
				break;
		}
	}
		
	void StartConnect(){
		if (GUILayout.Button("连接服务器")){
			NetworkConnectionError error = Network.Connect(IP,Port);
			//连接状态
			switch(error){
				case NetworkConnectionError.NoError:
				    break;
			    default:
			        Debug.Log("客户端错误"+error);
				    break;
			}
		}
	}
	
	void OnClient(){
		//创建开始滚动视图
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
		//绘制纹理, 显示内容
		GUILayout.Box(Message);
		//文本框
		Message = GUILayout.TextArea(Message);
		if (GUILayout.Button("发送")){
			//发送给接收的函数, 模式为全部, 参数为信息
			networkView.RPC("ReciveMessage", RPCMode.All, Message);
		}
		//结束滚动视图, 注意, 与开始滚动视图成对出现
		GUILayout.EndScrollView();
		
	}
	
    //接收请求的方法. 注意要在上面添加[RPC]
	[RPC]
	void ReciveMessage(string msg, NetworkMessageInfo info){
		//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
		Message = "发送端"+info.sender  +"消息"+msg;
	}
		
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

服务端运行状态:



客户端运行状态:


附注: 本文大部分代码出自《Unity 3D 游戏开发》,作者宣雨松。





  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值