角色血量同步
有種情況是,變動須從伺服器廣播通知所有客戶端更新,此方式稱之為 Server Authority (伺服器權力)。
要讓血量藉由伺服器權力來進行同步,需要設定變數為 SyncVars ,這稱之為 State Synchronization (狀態同步)。
- 修改 Health 腳本,引用 Networking 命名空間和改為 NetworkBehaviour。
using UnityEngine.Networking; public class Health : NetworkBehaviour
- 附加屬性 SyncVars 給目前血量變數。
[SyncVar] public int currentHealth = maxHealth;
- 設定判斷在 TakeDamage 方法,讓血量只能在伺服器端控制。
if (!isServer) { return; }
- 測試後發現,因為UI還沒設置同步,無法很明確的測試血量是否都同步。必須在編輯器底下才能看到數值的變化。
- 現在我們要把UI也一併做同步。現在使用 SyncVar hook 來掛勾同步變數和方法,當變數被同步時,也會同時呼叫被掛勾的方法。
- 把上一章修改UI的述句,移到以下的方法內:
void OnChangeHealth (int currentHealth) { healthBar.sizeDelta = new Vector2(health, currentHealth.sizeDelta.y); }
- 值得注意的是,方法的參數型別必須和掛鉤的同步變數一致,才能成功地把值傳入到方法內。
- 增加屬性在方法宣告前方,告知要掛勾哪個變數
[SyncVar(hook = "OnChangeHealth")]
- 現在測試,互相射擊對方會發現血量UI都同步了!