Unity 網絡通信


http://blog.csdn.net/chenggong2dm/article/details/7896440


 

  最新消息:在11月2日的開發者大會上,我問了一下unity的人,會不會對網絡層進行封裝和改進,unity的人表示,最晚5.0,最快4.x版本里,就會加入新的網絡通信接口,他們已經在測試階段了。 

    翻了半天unity的API,也沒有發現可以處理Socket的方法。Unity自己封了個網絡處理的類Network,主要用於狀態同步。 似乎是要實現MMO級別的網絡應用,只能用C#自己去寫了。(Unity不像AS,有直接處理數據包、字節級別的底層函數。至少現在沒有。如果您要應用於實際,比如做了個網游,那么您需要用unity自帶的C#去寫一套自定義通信協議來實現。這個我在后面的文章中會寫一個示例。)

    我們還是先了解一下Unity,看看用Unity自帶的組件,如何編寫通信,從最簡單的開始。


1,新建項目。新建一個項目里面會有一個攝像機。

2,編寫服務器代碼cs:

 

[csharp]  view plain copy
 
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class server : MonoBehaviour {  
  5.       
  6.     int Port = 10000;  
  7.       
  8.     //OnGUI方法,所有GUI的繪制都需要在這個方法中實現  
  9.     void OnGUI(){  
  10.         //Network.peerType是端類型的狀態:  
  11.         //即disconnected, connecting, server 或 client四種  
  12.         switch(Network.peerType){  
  13.             //禁止客戶端連接運行, 服務器未初始化  
  14.             case NetworkPeerType.Disconnected:  
  15.                 StartServer();  
  16.                 break;  
  17.             //運行於服務器端  
  18.             case NetworkPeerType.Server:  
  19.                 OnServer();  
  20.                 break;  
  21.             //運行於客戶端  
  22.             case NetworkPeerType.Client:  
  23.                 break;  
  24.             //正在嘗試連接到服務器  
  25.             case NetworkPeerType.Connecting:  
  26.                 break;  
  27.         }  
  28.     }  
  29.       
  30.     void StartServer(){  
  31.         //當用戶點擊按鈕的時候為true  
  32.         if (GUILayout.Button("創建服務器")) {  
  33.             //初始化本機服務器端口,第一個參數就是本機接收多少連接  
  34.             NetworkConnectionError error = Network.InitializeServer(12,Port,false);  
  35.             Debug.Log("錯誤日志"+error);  
  36.         }  
  37.     }  
  38.       
  39.     void OnServer(){  
  40.         GUILayout.Label("服務端已經運行,等待客戶端連接");  
  41.         //Network.connections是所有連接的玩家, 數組[]  
  42.         //取客戶端連接數.   
  43.         int length = Network.connections.Length;  
  44.         //按數組下標輸出每個客戶端的IP,Port  
  45.         for (int i=0; i<length; i++)  
  46.         {  
  47.             GUILayout.Label("客戶端"+i);  
  48.             GUILayout.Label("客戶端ip"+Network.connections[i].ipAddress);  
  49.             GUILayout.Label("客戶端端口"+Network.connections[i].port);  
  50.         }  
  51.         //當用戶點擊按鈕的時候為true  
  52.         if (GUILayout.Button("斷開服務器")){  
  53.             Network.Disconnect();  
  54.         }  
  55.     }  
  56.       
  57.       
  58.     /* 系統提供的方法,該方法只執行一次 */  
  59.     // Use this for initialization  
  60.     void Start () {  
  61.       
  62.     }  
  63.       
  64.     // Update is called once per frame  
  65.     void Update () {  
  66.       
  67.     }  
  68. }  

 

 

3,把這個代碼拖拽到攝像機上。

 

4,運行程序 File---->Build settings---->Build And Run,選擇Web Player

5,服務器端建立完畢,保持服務器端的運行狀態。

6,這里可以再新建立個項目寫客戶端。嫌麻煩也可以像我這樣,先把攝像機上的服務器腳本刪掉,再把下面的客戶端腳本拖拽上去。

客戶端代碼如下:

 

[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 = 10000;  
  9.           
  10.     void OnGUI(){  
  11.         //端類型的狀態  
  12.         switch(Network.peerType){  
  13.             //禁止客戶端連接運行, 服務器未初始化  
  14.             case NetworkPeerType.Disconnected:  
  15.                 StartConnect();  
  16.                 break;  
  17.             //運行於服務器端  
  18.             case NetworkPeerType.Server:  
  19.                 break;  
  20.             //運行於客戶端  
  21.             case NetworkPeerType.Client:  
  22.                 break;  
  23.             //正在嘗試連接到服務器  
  24.             case NetworkPeerType.Connecting:  
  25.                 break;  
  26.         }  
  27.     }  
  28.           
  29.           
  30.     void StartConnect(){  
  31.         if (GUILayout.Button("連接服務器")){  
  32.             NetworkConnectionError error = Network.Connect(IP,Port);  
  33.             Debug.Log("連接狀態"+error);  
  34.         }  
  35.     }  
  36.           
  37.     // Use this for initialization  
  38.     void Start () {  
  39.       
  40.     }  
  41.       
  42.     // Update is called once per frame  
  43.     void Update () {  
  44.       
  45.     }  
  46. }  

 

7,運行程序 File---->Build settings---->Build And Run,選擇Web Player

8,結果如下,可以通信。

 



附注: 本文大部分代碼出自《Unity 3D 游戲開發》,作者宣雨松。



 

     在上一個例子基礎上,我們構建一個聊天室程序。

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. 再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM