1. 程式人生 > >Unity網路通訊(二)Unity Network 聊天

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 遊戲開發》,作者宣雨鬆。