[Unity3D ARPG網絡游戲編程實踐]1——初識unity網絡編程


[Unity3D ARPG網絡游戲編程實踐]

想殺人了,百度了半天也不知道本地服務怎么寫,結果資源里的服務器竟然可以用了~~~~(>_<)~~~~
使用了兩種方法
1 這個方法特別郁悶,自己寫服務器,自己寫客戶端可以通訊。可是這個服務器用在 [Unity3D ARPG網絡游戲編程實踐] 中就不能鏈接成功,還好資源里帶有啟動本地服務的程序,不會原因,不懂服務器鏈接的原理
宣雨松版服務器客戶端通訊代碼

服務器端
using UnityEngine;
using System.Collections;

public class localServer : MonoBehaviour {

    int port = 10110;
    void OnGUI()
    {
        switch (Network.peerType)
        {
            case NetworkPeerType.Client://成功連接至客戶端
                break;
            case NetworkPeerType.Connecting://正在嘗試連接
                break;
            case NetworkPeerType.Disconnected://未啟動狀態,在此開始網絡連接
                StartServer();
                break;
            case NetworkPeerType.Server://成功連接服務器
                OnServer();
                break;
            
        }
    }

    void StartServer()
    {
        if (GUILayout.Button("創建本地服務器"))
        {
            //創建本地服務器允許10台主機連接,第三個參數:是否支持nat方式的連接
            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();
        }
    }
}



客戶端代碼

using UnityEngine;
using System.Collections;

public class clientServer : MonoBehaviour {

    //要連接的服務器地址  
    //string IP = "192.168.110.231";
    string IP = "127.0.0.1";
    //要連接的端口  
    int Port = 10110;

    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);
        }
    }  
}

  

2 [Unity3D ARPG網絡游戲編程實踐] 視頻資源
只有客戶端代碼(注意,networkSript1類沒有繼承自MonoBehaviour,不能直接添加給照相機,可以在照相機組件視窗中add newscript添加腳本)

using UnityEngine;
using System.Collections;
using System.Net.Sockets;

public class networkSript1{
    private static networkScript instance;
    private static Socket socket;

    private static string IP = "127.0.0.1";
    private static int port = 10100;

    public static networkScript getInstance()
    {
        if (instance == null)
        {
            instance = new networkScript();
            init();
        }
        return instance;
    }

    public static void init()
    {
        try
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(IP, port);
            Debug.Log("服務器連接成功");
        }
        catch
        {

            Debug.Log("服務器連接失敗");
        }
    }
}

  

具體操作:
1 刪除攝像機,使用NGUI添加小部件
2 創建資源並給場景添加button
3 給攝像機添加網絡連接腳本:networkSript1類沒有繼承自MonoBehaviour,不能直接添加給照相機,可以在照相機組件視窗中add newscript添加腳本
3.1 socket對象(inter網連接類型,流方式傳輸,tcp協議)
3.2 函數Connect(ip,port)
4 在button的回調函數中添加連接代碼

 

 

 

總結
Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, SocketError, AsyncCallback, Object)
開始從連接的 Socket 中異步接收數據。

public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
out SocketError errorCode,
AsyncCallback callback,
Object state
)
參數
buffer
類型:System.Byte[]
Byte 類型的數組,它是存儲接收到的數據的位置。
offset
類型:System.Int32
buffer 中存儲所接收數據的位置。
size
類型:System.Int32
要接收的字節數。
socketFlags
類型:System.Net.Sockets.SocketFlags
SocketFlags 值的按位組合。
errorCode
類型:System.Net.Sockets.SocketError
一個 SocketError 對象,它存儲套接字錯誤。
callback
類型:System.AsyncCallback
一個 AsyncCallback 委托,它引用操作完成時要調用的方法。
state
類型:System.Object
一個用戶定義對象,其中包含接收操作的相關信息。 當操作完成時,此對象會被傳遞給 EndReceive 委托。

返回值
類型:System.IAsyncResult
引用異步讀的 IAsyncResult。

 


免責聲明!

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



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