close

使用Socket連線請看這邊

 

伺服器和客戶端間的資料傳遞請參考這篇文章

 

既然是網路,當然就要有伺服器端(Server)和客戶端(Client)了!

 P.S.此程式也可以手機(Client)連線電腦(Server)

 

 

先來寫一下伺服器端的程式:

新增一個Project,命名為Server,並新增一個C# script 且命名為ServerScript

開始撰寫程式碼


 

using UnityEngine;
using System.Collections;

public class ServerScript : MonoBehaviour
{
    private int port = 8000;//隨意,範圍為1024~65536

    private void OnGUI()
    {
        //先取得當前連線狀況

        if (Network.peerType == NetworkPeerType.Disconnected)//若當前未連線(伺服器未開啟)
        {
            //顯示Button,Button的文字為Start Server
            if (GUI.Button(new Rect(100, 100, 100, 50), "Start Server") == true)
            {
                Network.InitializeServer(10, port, !Network.HavePublicAddress());//初始化伺服器。第一個參數為連線的人數上限,第二個參數為連線的port,第三個參數為是否要使用NAT
                MasterServer.RegisterHost("AAA", "BBB", "CCC");//第一個參數為連線時要搜尋的字串,字串相同則會連線,可使用中文;第二個為遊戲名稱;第三個為遊戲註解;第二個和第三個參數對於連線之間並沒用影響。此程式碼必須寫在初始化伺服器之後,由客戶端搜尋特定的字串(像是這邊為"AAA"),來建立連線。
            }
        }
        else//伺服器初始化成功(伺服器已開啟)
        {
            //顯示連線的人數,且Button的文字改為Stop Server
            GUI.Label(new Rect(100, 150, 100, 50), "人數 = " + Network.connections.Length);

            if (GUI.Button(new Rect(100, 100, 100, 50), "Stop Server") == true)
            {
                Network.Disconnect();//中斷伺服器連線,一旦伺服器中斷則客戶端也會自動中斷
            }
        }
    }

    private void OnApplicationQuit()//當應用程式結束時
    {
        Network.Disconnect();//中斷伺服器連線,一旦伺服器中斷則客戶端也會自動中斷
    }
}


 

將此腳本拖曳到Main Camera上!

 

 

再來就是客戶端了:

新增一個Project,命名為Client,並新增一個C# script 且命名為ClientScript

開始撰寫程式碼


 

using UnityEngine;
using System.Collections;

public class ClientScript : MonoBehaviour
{

    void Awake()
    {
        MasterServer.ClearHostList();//先清除原先的連線列表
        MasterServer.RequestHostList("AAA");//搜尋名稱為"AAA"的Server
    }


    private void OnGUI()
    {
        //先檢查當前連線狀態

        if (Network.peerType == NetworkPeerType.Disconnected)//若是未連線
        {
            if (GUI.Button(new Rect(100, 100, 100, 50), "Start"))
            {
                HostData[] data = MasterServer.PollHostList();//取得符合搜尋條件的伺服器列表,並將其儲存到HostData[]內
                if (data.Length > 0)//若是有搜尋到,則進行連線
                {
                    Network.Connect(data[0].ip, data[0].port);//開始連線。第一個參數為伺服器端的IP位址,第二個參數為伺服器端的Port  (由於只有一台客戶端測試,所以直接使用data[0])
                }

            }
        }
        else//若是已連線
        {
            if (GUI.Button(new Rect(100, 100, 100, 50), "Stop Client"))
            {
                Network.Disconnect();//中斷客戶端連線
            }
        }
    }

    private void OnApplicationQuit()//當應用程式結束時
    {

        Network.Disconnect();//中斷客戶端連線
    }
}


 

將腳本拖曳到Main Camera上,完畢!

 

 

 

此時伺服器端和客戶端都已經完成了,再來就是測試是否能夠成功連線!

有四種方法:

1.雙開Unity,一個當Server,另一個當Client。

2.將Server和Client各輸出成執行檔,且在同台電腦內執行。

3.將Server或Client其中一個輸出成執行檔,另一個使用Unity執行。

4.找區網內的兩台電腦(或1電腦1手機,但手機必須使用區域網路WIFI)測試。

 

先開啟伺服器端連線

 

再來開啟客戶端連線,若是連線成功則Button的文字從Start變成了Stop Client

 

此時再回去看伺服器端,可以發現人數增加了!

連線成功!

 

若要設定連線密碼的話...則在伺服器端加入這段程式(必須在初始化伺服器之前完成)

Network.incomingPassword = "ABC";

例如...我加在Start()內

 

而客戶端則需要在Network.Connect()內輸入密碼:(192.168.0.104為我目前電腦區網的IP)

第三個參數就是密碼了!

 

若是密碼錯誤,則伺服器端會收到這個錯誤訊息

 

而客戶端則會收到這個錯誤訊息,說明密碼錯誤。

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(6) 人氣()