Unity 网络部分

原创 2013年12月06日 13:23:57

Unity中使用peerType表示网络连接的状态(NetworkPeerType),共分四种:未连接(disconnected)、连接中(connecting)、服务器(server)、客户端(client)。

 

通常,网络中,我们需要服务器端和客户端。在服务端中,当peerType处于disconnected 状态时, 需要创建服务,创建服务结束后,peerType 将处于 server 状态。在客户端,当peerType 处于 disconnected 状态时,需要做的是连接来着服务端的服务,连接成功后,peerType 处于 client 状态。 当处于server 和 client 状态后,我们可以断开服务或者连接。  这些动作的执行,在Network中,都有提供方法。分别是:InitializeServer()、connect()、disconnect().

做完这些,服务端和客户端便连接成功了。

 

但是,这时,还只是能够在服务端,看到 客户端的连接信息,但客户端与客户端之间不能够有任何的通信, 相互之间看不到对方的信息。那么怎样才能实现,一个客户端能够看到另一个客户端的消息呢?其实,消息的传递是通过,服务器的转发实现的。首先,客户端将消息发送给服务器,然后,由服务器再发送给其它客户端。

 

为了让客户端发送的消息能够被服务器接受到,我们需要在 连接脚本 的对象上,添加一个 NetworkView 组件。使用NetworkView.RPC()发送消息。

 

1、简单的server/client连接实例

首先,建立服务器端脚本,并且添加为 摄像机的组件。

server.cs

 

using UnityEngine;
using System.Collections;

public class server : MonoBehaviour {
	
	int Port = 10000;
	string Message ="";
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	
	void OnGUI() {
		
		switch(Network.peerType) {
			
		case NetworkPeerType.Server:
			OnServer();
			break;
		case NetworkPeerType.Client:
			break;
		case NetworkPeerType.Disconnected:
			StartServer();
			break;
		case NetworkPeerType.Connecting:
			break;
		}
	}
	
	void StartServer() {
		
		if(GUILayout.Button("创建本机服务")) {
			
			NetworkConnectionError error = Network.InitializeServer(10, Port, false);
			Debug.Log("连接状态" + error);
		}
	}
	
	void OnServer() {
		
		GUILayout.Label("服务器创建完毕, 等待客户端连接");
		
		int length = Network.connections.Length;
		for(int i = 0; i< length; i++) {
			
			GUILayout.Label("连接服务器客户端ID" + i);
			GUILayout.Label("连接服务器客户端ip" + Network.connections[i].ipAddress);
			GUILayout.Label("端口号" + Network.connections[i].port);
		}
		
		if(GUILayout.Button("断开服务器")) {
			
			Network.Disconnect();
		}
	}
	
}

 

在发布前,先设置 project setting->player setting->run in background.

 

然后,再制作一个client端。

client.cs

using UnityEngine;
using System.Collections;

public class client1 : MonoBehaviour {
	
	string IP = "127.0.0.1";
	int Port = 10000;
	string inputMessage = "请输入信息";
	
	string Message = "";
	Vector2 scrollPos = Vector2.zero;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	
	void OnGUI() {
		
		switch(Network.peerType) {
			
		case NetworkPeerType.Disconnected:
			StartConnect();
			break;
		case NetworkPeerType.Client:
			OnClient();
			break;
		case NetworkPeerType.Server:
			break;
			
		case NetworkPeerType.Connecting:
			break;
		}
	}
	
	void StartConnect() {
		
		if(GUILayout.Button("连接服务器")) {
			
			NetworkConnectionError error = Network.Connect(IP, Port);
			Debug.Log("连接状态:" + error);
		}
	}
	
	void OnClient() {
		
		scrollPos = GUILayout.BeginScrollView(scrollPos, GUILayout.Width(200), GUILayout.Height(500));
		
		GUILayout.Box(Message);
		
		GUILayout.BeginHorizontal();
		
		inputMessage = GUILayout.TextArea(inputMessage);
		
		if(GUILayout.Button("发送消息")) {
			
			networkView.RPC("RequestMessage", RPCMode.Others, inputMessage);
		}
		
		GUILayout.EndHorizontal();
		
		if(GUILayout.Button("断开连接")) {
			
			Network.Disconnect();
			Message = "";
		}
		
		GUILayout.EndScrollView();
	}
	
}


 

下面链接可能能够帮你做一个更好的网络小游戏。LOL...

http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

多人网络实时sdk

http://appwarp.shephertz.com/build-unity3d-multiplayer-game/

 

网络部分

//网络部分 public class GF_Network { /* * C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP) ...
  • lonestar555
  • lonestar555
  • 2011年11月02日 23:02
  • 483

游戏引擎最重要的部分和最难的部分

 经常有人问我什么是游戏引擎最重要的部分,我并不认为哪个部分比哪个部分更重要,任何部分都是不可替代的一个部分,例如好的游戏网络性能依赖于可预测的物理模型,而好的物理依赖于高效的碰撞检测,碰撞检测的高效...
  • SeaFantasy
  • SeaFantasy
  • 2009年10月13日 14:57
  • 370

U3D 初窥网络通讯教程1

OK,编辑了两款单机游戏之后我们现在应该尝试一下网络通讯功能了。 一听到网络通讯功能...
  • zhe13
  • zhe13
  • 2014年11月20日 22:14
  • 1383

【Linux 内核网络协议栈源码剖析】accept 函数剖析

好,tcp 协议建立连接的几个函数到这,就还差个accept 函数,这里直接贴代码了,不再向前面那般赘述了。 一、应用层——accept 函数 该函数返回一个已建立连接的可用于数据通信的套接字。 ...
  • yeswenqian
  • yeswenqian
  • 2015年07月07日 21:55
  • 1956

c# 网络部分

public class GF_Network     {         /*          * C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)           ...
  • lisiyi523897080
  • lisiyi523897080
  • 2013年04月17日 11:04
  • 10857

网络部分试题

一、选择题1.计算机网络建立的主要目的是(   )。   A. 提高可靠性  B. 节省通讯费用 C. 分担负荷     D. 资源共享2.一般来说,下列网络中数据传输速率最快的是(   )。A. L...
  • yanheven1
  • yanheven1
  • 2013年11月19日 15:01
  • 658

网络部分知识点

这部分内容不难,但要多理解,多练习。尤其是对子网掩码部分要实际操作!知识点概况如下图: ...
  • dongzi87
  • dongzi87
  • 2010年08月26日 20:01
  • 665

网络部分(二)

JSON数据(NSData) -> OC对象(Foundation Object) JSON和OC对象转换后对应数据类型{} -> NSDictionary @{} [] -> NSArray @[]...
  • adrianoll
  • adrianoll
  • 2015年09月08日 23:49
  • 129

网络部分(三)

NSURLConnection和RunLoop 默认情况会将NSURLConnection添加当前线程到RunLoop,如果是在子线程中调用NSURLConnection可能会有问题, 因为子线程默认...
  • adrianoll
  • adrianoll
  • 2015年09月10日 22:57
  • 142

网络部分(一)

什么是RunLoop运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前M...
  • adrianoll
  • adrianoll
  • 2015年09月07日 00:20
  • 106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity 网络部分
举报原因:
原因补充:

(最多只允许输入30个字)