設定角色血量
在以下的步驟,會製作子彈打到角色後,會扣除角色的血量。而每個角色的血量會同步到整個連線。
子彈碰撞
- 建立 Mono Behaviour 腳本,命名為 Bullet
修改程式碼為如下
using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour { void OnCollisionEnter() { Destroy(gameObject); } }
- Bullet 腳本掛載到 Bullet Prefab。
- 測試,現在子彈碰到角色會自動消滅。且因為子彈 Prefab 是被 Network Manager 控管,所以所有連線的客戶端都會被同步到。
角色血量
- 建立 Mono Behaviour 腳本,命名為 Health
- 建立一個常數,代表血量的最大值
public const int maxHealth = 100;
- 建立一個變數,代表目前角色的血量,初始預設為最大值
public int currentHealth = maxHealth;
- 建立一個方法,實作扣血的機制
public void TakeDamage(int amount) { currentHealth -= amount; if (currentHealth <= 0) { currentHealth = 0; Debug.Log("Dead!"); } }
- 儲存腳本。
- 修改 Bullet 腳本。
- 修改 OnCollisionEnter 方法,讓它可以帶入參數。
void OnCollisionEnter(Collision collision)
- 新增述句,讓子彈碰到角色時可以被扣血。
var hit = collision.gameObject; var health = hit.GetComponent<Health>(); if (health != null) { health.TakeDamage(10); }
- 儲存腳本。但是現在只有數據,接下來要製作顯示UI。
血量UI
- 在場景中新增 UIImage。
- 新增後,Unity 會自動幫你產生 Canvas 和 EventSystem 物件。
- Canvas 更名為 Healthbar Canvas 。
- Image 更名為 Background ,並設定:
- 設定 RectTransform Component 的寬為 100。
- 同上,高為 10。
- 設定 Image Component 的圖像來源為內建的 InputFieldBackground。
- 設定 Image Component 的顏色為紅色。
- 複製 Background 物件,命名為 Foreground ,並設定為 Background 的子物件。
- 設定 Foreground 物件:
- 設定 Image Component 的顏色為綠色。
- 打開 RectTransform Component 的錨點設定( Anchor Presets Window )視窗,設定中心點和位置分別為中間和靠左。
- 把 Healthbar Canvas 的 Render Mode 轉成 World Space 。
- 此舉是將UI化為3D物件,讓UI可以跟著角色跑。
- 將 Healthbar Canvas (含底下的子物件) 作為角色Prefab的子物件。
- 設定 Healthbar Canvas 的 RectTransform Component :
- 比例設定為 (0.01, 0.01, 0.01)。
- 位置設定為 (0.0, 1.5, 0.0)。
血量UI綁定腳本
- 修改 Heath 腳本。
- 使用UI命名空間,且新增一變數用來控制UI。
using UnityEngine.UI; public RectTransform healthBar;
- 新增述句,此機制是用來控制UI的血量條的長度。
healthBar.sizeDelta = new Vector2( currentHealth, healthBar.sizeDelta.y);
- 設定角色Prefab,把剛剛做好的UI指定給 healthBar 。
- 最後,我們需要讓血量條永遠面對攝影機。
- 選擇 Healthbar Canvas 物件。
- 新增腳本,命名為 Billboard 。
- 在腳本內的 Update 方法新增以下此述句:
transform.LookAt(Camera.main.transform);
- 移除腳本內沒用到的程式碼。
- 測試,在客戶端發現子彈打到角色會扣血,但是沒有在所有已連線的客戶端中同步。