遠端動作

此網路系統中有很多方式,經由網路中來執行動作。這些類型的動作有時候被稱為遠端方法呼叫( RPC )。在此系統中有兩種RPC,分別為,客戶端呼叫、在伺服器中執行的命令( Command ) 和伺服器端呼叫、在客戶端中執行的客戶端RPC( ClientRpc )。

下面的這張流程圖表示了遠端動作執行的方向:

命令

命令是從客戶端中的玩家物件中送到伺服器端的玩家物件。為了安全,命令只能從你的玩家物件中送出,所以你不可控制其他玩家的物件。要讓函式轉換成命令,就增加 [Command] 屬性,並且函式名稱增加"Cmd"前綴。當此函式在客戶端中被呼叫時,將只會在伺服器端中執行。任何的參數將會自動地被傳遞到伺服器。

命令函式必須要有"Cmd"前綴。當程式碼被解析時這是個提示,表示此函式是特別的且不會像一般的函式那樣在本地執行。

class Player : NetworkBehaviour
{

    public GameObject bulletPrefab;

    [Command]
    void CmdDoFire(float lifeTime)
    {
        GameObject bullet = (GameObject)Instantiate(
            bulletPrefab, 
            transform.position + transform.right,
            Quaternion.identity);

        var bullet2D = bullet.GetComponent<Rigidbody2D>();
        bullet2D.velocity = transform.right * bulletSpeed;
        Destroy(bullet, lifeTime);

        NetworkServer.Spawn(bullet);
    }

    void Update()
    {
        if (!isLocalPlayer)
            return;

        if (Input.GetKeyDown(KeyCode.Space))
        {
            CmdDoFire(3.0f);
        }

    }
}

在客戶端中,以每個幀傳送命令時要特別注意!這會造成大量的網路流量。

預設情況下,命令會在第0通道,也就是預設通道中被送出。所以預設的命令會被可靠地送至伺服器。這可以藉由自訂 [Command] 屬性的Channel參數來改變。參數必須為整數,代表通道的號碼。

第一通道預設設定為非可靠的通道,所以要使用它的話,設定命令屬性的參數為1,就像這樣:

[Command(channel=1)]

在 Unity 5.2 開始,在具有客戶端權力的非玩家物件上可送出命令。這些物件必須藉由 NetworkServer.SpawnWithClientAuthority 產生,或是使用 NetworkIdentity.AssignClientAuthority 來設定權力。

從這些物件送出的命令會在伺服器端上的物件實體中被執行,而非在和客戶端關聯的角色物件。

客戶端RPC呼叫

客戶端RPC呼叫,是從伺服器端中的物件中傳送到所有客戶端的物件。它可以從任何掛有 NetworkIdentity組件、且被產生出來的伺服器物件中被傳送。自從伺服器擁有權力後,之後這些可傳送這些呼叫的伺服器物件就沒有任何安全議題。要讓函式轉換成客戶端RPC呼叫,就增加 [ClientRPC] 屬性,並且函式名稱增加"Rpc"前綴。當此函式在伺服器端中被呼叫時,將只會在客戶端中執行。任何的參數將會自動地被傳遞到客戶端。

客戶端RPC呼叫函式必須要有"Rpc"前綴。當程式碼被解析時這是個提示,表示此函式是特別的且不會像一般的函式那樣在本地執行。

class Player : NetworkBehaviour
{

    [SyncVar]
    int health;

    [ClientRpc]
    void RpcDamage(int amount)
    {
        Debug.Log("Took damage:" + amount);
    }

    public void TakeDamage(int amount)
    {
        if (!isServer)
            return;

        health -= amount;
        RpcDamage(amount);
    }
}

當此遊戲在是莊家、且有一個本地客戶物件的狀況下執行時,客戶端RPC呼叫將會在本地客戶物件被觸發,即使是和伺服器端相同的執行過程。所以對客戶端RPC呼叫來說,本地客戶和遠端客戶的行為是一樣的。

遠端動作的參數

這些被命令和客戶端RPC所呼叫的參數會被序列化並經由網路傳送。這些參數可以是:

  • 基本型別 (byte, int, float, string, UInt64, 等等)
  • 基本型別的陣列
  • 包含允許型別的結構
  • Unity 內建的數學型別 (Vector3, Quaternion, 等等)
  • NetworkIdentity
  • NetworkInstanceId
  • NetworkHash128
  • 掛有 NetworkIdentity 組件的遊戲物件

遠端動作的參數不可以是遊戲物件底下的組件,像是腳本實體和型變 ( Transform )。它們也不可以是經由網路、無法被序列化的其他型別。

results matching ""

    No results matching ""