UNET連線遊戲(六){你快掛囉,HUD_UI續}

本篇使用的是5.3版後有UNET的UNITY
目標:基本連線遊戲機制+敵方玩家血條(UI)

1.延續前篇(UNET連線遊戲(五){死神之眼我看的見你的名子,HUD_UI})
現在我們必須要讓敵方UI與他自己的HP兩產生互動,但在這邊其實我方也是相對的;意思是其實不管是誰的血量都應該要告知SERVER後同步給所有玩家,所以接下來我們要大刀闊斧的修正程式內容。

首先是玩家自己的UI實際上也應該要像敵方UI一般生成帶入,只是型態有所不同,因此這裡我們要做的事情是把之前做好的我方HPBAR(綠色一大條的)也掛上先前的UIReset.cs還有NetowrkIdentity的套件
unet-hit-035

隨後將PLAYER_ID放到HP階層下當成子物件,拖曳到Resources資料夾製作成預製物,並刪除場景上的HP
unet-hit-036

2.既然這些UI也都屬於SERVER管理生成,就如同子彈一般要將其加入NetworkManager的清單內
unet-hit-037

3.接下來就是改寫UIReset.cs的內容如下

由於兩種UI的不同樣貌所以在第8行加上宣告offsetXY用來調整大小,順便在19、30的位置利用有沒有這個調整參數辨別是自己的UI還是敵方的UI做出不同的處理。

4.並且刪除PlayerID.cs中20~23的程式碼(理由是這個UI現在一開始並不存在於場景中,更改名稱的動作交給UIReset.cs裡面34行的位置來處理)

5.血條產生的最後一步是玩家人物身上的EnemyHP.cs改寫

這裡主要是SpawnHpBar ()方法執行時判斷玩家是自己或是敵方,然後從Resources資料夾產生對應的HPBAR,並且執行UI相關的參數、狀態設定。

到這裡我們應該可以看到執行時的畫面跟原先未改變前相同,只是還未同步數值

6.喝口水繼續,重頭戲這裡開始
DamageScript.cs必須改變做法,因此原本的OnCollisionEnter用來檢測是否被子彈擊中的功能砍掉,之後改由子彈負責檢測是否擊中玩家,因此在其中執行的兩個相關功能[Command]、[ClientRpc]下的CmdHitPlayer以及RpcResolveHit也可以跟著刪除。

7.並且新增一個對玩家造成傷害的功能TakeDamage統一執行傷害,還有新的[ClientRpc]功能RpcRebirth用來重置玩家位置,但最重要的部分還是HP變數的同步,這裡需要在變數前加上[SyncVar]修飾標籤,把變數轉為伺服器同步的數據,同時建立一個方法HpBar(int h)依據HP數值來刷新血條的狀態並且在[SyncVar]裡hook這個方法,詳細程式碼如下:

8.最後是AmmoController.cs加入OnCollisionEnter檢測碰撞物的標籤是否為"PLAYER",這部份我們之前有替玩家設置過;然後執行玩家身上的TakeDamage (1),造成損傷1點並且摧毀子彈DestroyAmmo ();

9.完成這一大串的程式修改後我們的人物血條就可以如期運作啦
unet-hit-039

下期預告:UNET連線遊戲(七){原來這就是掛掉的感覺}

Leave a Reply