[ UNet ] 基礎教學 #04 – Command 命令

標籤: , , , ,

Command在UNet也是一個很重要的項目,Command的作用在於「命令Server執行」

在#03中有說到只有Server的數值改變時SyncVar才會同步更新,而Command可以讓Client去命令Server執行他所不能執行的動作,以下面的程式碼為例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Networking;
using UnityEngine.UI;

public class Unit : NetworkBehaviour {
  public float maxHP = 50;
  public Text uiText;
  [SyncVar]
  private float hp;
  
  // Use this for initialization
  void Start () {
    hp = maxHP;
  }
  
  // Update is called once per frame
  void Update () {
    if (isServer)
    {
      if (hp < maxHP)
      {
        hp += Time.deltaTime * 5;
      }else{
        hp = maxHP;
      }
    }

    uiText.text = "HP:" + ((int)hp).ToString();
  }

  void OnMouseDown(){
    CmdSetHp(0);
  }
  [Command]
  void CmdSetHp(float newHp){
    hp = newHp;
  }
}

只要在函式上方加上[Command]即可

 

Server端由於本身就是Server,呼叫時就直接處理函式;而Client則是命令Server去執行函式,這樣同一個函式就不需要特地去區分S/C的邏輯

不過要注意以下幾點:

1、函式名稱必須是「Cmd」開頭

2、可帶入的參數只有以下幾種型態

  • 基本類型(byte、int、float、string、UInt64等)
  • Unity數學類型(Vector3、Quaternion等)
  • 基本類型的陣列
  • 包含以上允許類型的Struct
  • NetworkIdentity
  • NetworkInstanceId
  • NetworkHash128
  • 包含NetworkIdentity組件的GameObject

大家可以拿#03附的範本自己修改程式碼看看

 

在實際執行後會發現Client端點擊Server的物件沒有效果,這是因為Command只能在自己擁有權限的物件上做發送。

而Client端是否擁有權限,除了一開始的Player物件以外必須由Server卵生(Spawn)物件並指定權限給Client才行,這部分會在之後做較詳細的說明。

 

下一篇將介紹ClientRpc,是相對於Command的功能

 

[ UNet ] 基礎教學 #05 – ClientRpc 遠端呼叫客戶端



相關文章

教學 #14 – Scene(場景) Scene是個很重要的環節,在中文稱為「場景」 以比較直覺的方式來說明的話,Scene可以當作遊戲中的關卡,每一個關卡都是獨立的Scene 在Unity的工具列中,File下會看到...
基礎教學 #02 – NetworkBehaviour NetworkBehaviour是在UNet中代替MonoBehaviour的基底類別。 要存取物件的網路資訊都必須透過NetworkBehaviour才能達成,因此在撰寫網路物件的新腳本時必須...
教學 #05 – 物件創造、物件銷毀 這次來講到物件創造與物件銷毀,我們繼續使用先前的小飛兵專案來教學,這次要做的功能是「按下鍵盤Z發射子彈」並且「子彈超過一定距離時銷毀」,在這次教學中會使用到先前的移動與鍵盤事件。 創造...
都是初始化,Awake、Start的差異 當我們要在 Unity 中處理初始化的部分時,大多都是寫在「Start」的函式中,但若寫在「Awake」也能有差不多的效果。 那 Start 跟 Awake 差在哪邊呢? 首先要先看一下Unit...