1. 程式人生 > >unity官方內建網路unet的例項教程(六)

unity官方內建網路unet的例項教程(六)

客戶端需要從服務取得資料來同步玩家的生命值和血條狀態,這稱為:Server Authority(伺服器許可權)為了實現本例的生命值同步我們需要引入同步變數[SyncVar] 。

開啟Health指令碼,引入UnityEngine.Networking名稱空間,將繼承關係改為:NetworkBehaviour,將currentHealth作為[SyncVar],具體指令碼如下:


儲存指令碼。回到Unity儲存,重新生成遊戲,進行測試,發現還同步還是有問題。現在是讓SyncVar hook出場了,它可以將SyncVar與方法繫結,當SyncVar變化時,繫結的這些方法會在服務端和客戶端進行同步。開啟Health指令碼,建立void OnChangeHealth (int currentHealth)函式,具體程式碼如下:


health

現在當currentHealth的值發生變化時,OnChangeHealth (int currentHealth)方法將會在所有服務端和客戶端進行更新。

儲存指令碼,回到Unity,重新生成並運行遊戲進行測試。終於實現了生命值和血條的同步。下面進行這項改進:當玩家當前的生命值為為0的時候,玩家將被傳送回到起始位置。這也將引入[ClientRpc],該屬性是狀態同步的方式之一。它在服務端上被呼叫,在客戶端上執行,與Commands相反。

要將使用ClientRpc的方法呼叫,需要將“Rpc”新增為方法名的字首。當在伺服器上呼叫該方法時,此方法將在客戶端上執行。它的引數將自動作為ClientRpc呼叫的一部分傳遞給客戶端。

在Health指令碼中建立一個newRespawn函式,並在玩家的當前生命值達到0時呼叫,最終指令碼時這樣的:


在我們的教程裡,客戶端控制本地Player 的位置。這是因為Player享有對客戶端的本地許可權。伺服器傳送給所有的客戶端將Client Player作為ClientRpc呼叫並移動到開始位置。因為Player具有NetworkTransform元件,所有客戶端都會同步此位置。

儲存指令碼,回到Unity,儲存,重新生成,進行測試,當一個角色的生命值為0時,這個角色在0,0,0點重生了,而且是滿血。