Unity網路通訊(二)Unity Network 聊天
阿新 • • 發佈:2019-01-29
在上一個例子基礎上,我們構建一個聊天室程式。
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 遊戲開發》,作者宣雨鬆。