角色血量同步

有種情況是,變動須從伺服器廣播通知所有客戶端更新,此方式稱之為 Server Authority (伺服器權力)。

要讓血量藉由伺服器權力來進行同步,需要設定變數為 SyncVars ,這稱之為 State Synchronization (狀態同步)。

  1. 修改 Health 腳本,引用 Networking 命名空間和改為 NetworkBehaviour。
    using UnityEngine.Networking;
    public class Health : NetworkBehaviour
    
  2. 附加屬性 SyncVars 給目前血量變數。
    [SyncVar]
    public int currentHealth = maxHealth;
    
  3. 設定判斷在 TakeDamage 方法,讓血量只能在伺服器端控制。
    if (!isServer)
    {
     return;
    }
    
  4. 測試後發現,因為UI還沒設置同步,無法很明確的測試血量是否都同步。必須在編輯器底下才能看到數值的變化。
  5. 現在我們要把UI也一併做同步。現在使用 SyncVar hook 來掛勾同步變數和方法,當變數被同步時,也會同時呼叫被掛勾的方法。
  6. 把上一章修改UI的述句,移到以下的方法內:
    void OnChangeHealth (int currentHealth)
    {
     healthBar.sizeDelta = new Vector2(health, currentHealth.sizeDelta.y);
    }
    
    1. 值得注意的是,方法的參數型別必須和掛鉤的同步變數一致,才能成功地把值傳入到方法內。
  7. 增加屬性在方法宣告前方,告知要掛勾哪個變數
    [SyncVar(hook = "OnChangeHealth")]
    
  8. 現在測試,互相射擊對方會發現血量UI都同步了!

results matching ""

    No results matching ""