設定角色血量

在以下的步驟,會製作子彈打到角色後,會扣除角色的血量。而每個角色的血量會同步到整個連線。

子彈碰撞

  1. 建立 Mono Behaviour 腳本,命名為 Bullet
  2. 修改程式碼為如下

     using UnityEngine;
     using System.Collections;
    
     public class Bullet : MonoBehaviour {
    
         void OnCollisionEnter()
         {
             Destroy(gameObject);
         }
     }
    
  3. Bullet 腳本掛載到 Bullet Prefab。
  4. 測試,現在子彈碰到角色會自動消滅。且因為子彈 Prefab 是被 Network Manager 控管,所以所有連線的客戶端都會被同步到。

角色血量

  1. 建立 Mono Behaviour 腳本,命名為 Health
  2. 建立一個常數,代表血量的最大值
    public const int maxHealth = 100;
    
  3. 建立一個變數,代表目前角色的血量,初始預設為最大值
    public int currentHealth = maxHealth;
    
  4. 建立一個方法,實作扣血的機制
    public void TakeDamage(int amount)
    {
     currentHealth -= amount;
     if (currentHealth <= 0)
     {
         currentHealth = 0;
         Debug.Log("Dead!");
     }
    }
    
  5. 儲存腳本。
  6. 修改 Bullet 腳本。
  7. 修改 OnCollisionEnter 方法,讓它可以帶入參數。
    void OnCollisionEnter(Collision collision)
    
  8. 新增述句,讓子彈碰到角色時可以被扣血。
    var hit = collision.gameObject;
    var health = hit.GetComponent<Health>();
    if (health != null)
    {
     health.TakeDamage(10);
    }
    
  9. 儲存腳本。但是現在只有數據,接下來要製作顯示UI。

血量UI

  1. 在場景中新增 UIImage
  2. 新增後,Unity 會自動幫你產生 Canvas 和 EventSystem 物件。
  3. Canvas 更名為 Healthbar Canvas
  4. Image 更名為 Background ,並設定:
    1. 設定 RectTransform Component 的寬為 100。
    2. 同上,高為 10。
    3. 設定 Image Component 的圖像來源為內建的 InputFieldBackground。
    4. 設定 Image Component 的顏色為紅色。
  5. 複製 Background 物件,命名為 Foreground ,並設定為 Background 的子物件。
  6. 設定 Foreground 物件:
    1. 設定 Image Component 的顏色為綠色。
    2. 打開 RectTransform Component 的錨點設定( Anchor Presets Window )視窗,設定中心點和位置分別為中間和靠左。
  7. 把 Healthbar Canvas 的 Render Mode 轉成 World Space
    1. 此舉是將UI化為3D物件,讓UI可以跟著角色跑。
  8. 將 Healthbar Canvas (含底下的子物件) 作為角色Prefab的子物件。
  9. 設定 Healthbar Canvas 的 RectTransform Component :
    1. 比例設定為 (0.01, 0.01, 0.01)。
    2. 位置設定為 (0.0, 1.5, 0.0)。

血量UI綁定腳本

  1. 修改 Heath 腳本。
  2. 使用UI命名空間,且新增一變數用來控制UI。
    using UnityEngine.UI;
    public RectTransform healthBar;
    
  3. 新增述句,此機制是用來控制UI的血量條的長度。
    healthBar.sizeDelta = new Vector2(
     currentHealth, 
    healthBar.sizeDelta.y);
    
  4. 設定角色Prefab,把剛剛做好的UI指定給 healthBar
  5. 最後,我們需要讓血量條永遠面對攝影機。
  6. 選擇 Healthbar Canvas 物件。
  7. 新增腳本,命名為 Billboard
  8. 在腳本內的 Update 方法新增以下此述句:
    transform.LookAt(Camera.main.transform);
    
  9. 移除腳本內沒用到的程式碼。
  10. 測試,在客戶端發現子彈打到角色會扣血,但是沒有在所有已連線的客戶端中同步。

results matching ""

    No results matching ""