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:
- using UnityEngine;
- using System.Collections;
- public class server : MonoBehaviour {
- int Port = 10000;
- //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);
- Debug.Log("錯誤日志"+error);
- }
- }
- 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);
- }
- //當用戶點擊按鈕的時候為true
- if (GUILayout.Button("斷開服務器")){
- Network.Disconnect();
- }
- }
- /* 系統提供的方法,該方法只執行一次 */
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- }
3,把這個代碼拖拽到攝像機上。
4,運行程序 File---->Build settings---->Build And Run,選擇Web Player
5,服務器端建立完畢,保持服務器端的運行狀態。
6,這里可以再新建立個項目寫客戶端。嫌麻煩也可以像我這樣,先把攝像機上的服務器腳本刪掉,再把下面的客戶端腳本拖拽上去。
客戶端代碼如下:
- using UnityEngine;
- using System.Collections;
- public class client : MonoBehaviour {
- //要連接的服務器地址
- string IP = "127.0.0.1";
- //要連接的端口
- int Port = 10000;
- void OnGUI(){
- //端類型的狀態
- switch(Network.peerType){
- //禁止客戶端連接運行, 服務器未初始化
- case NetworkPeerType.Disconnected:
- StartConnect();
- break;
- //運行於服務器端
- case NetworkPeerType.Server:
- break;
- //運行於客戶端
- case NetworkPeerType.Client:
- break;
- //正在嘗試連接到服務器
- case NetworkPeerType.Connecting:
- break;
- }
- }
- void StartConnect(){
- if (GUILayout.Button("連接服務器")){
- NetworkConnectionError error = Network.Connect(IP,Port);
- Debug.Log("連接狀態"+error);
- }
- }
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- }
7,運行程序 File---->Build settings---->Build And Run,選擇Web Player
8,結果如下,可以通信。

附注: 本文大部分代碼出自《Unity 3D 游戲開發》,作者宣雨松。
在上一個例子基礎上,我們構建一個聊天室程序。
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:
- 再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
