Week04_UI_Damage - M-634/unity-game-dev-tutorial GitHub Wiki
- 弾が敵に当たると HP を削るようにする
- 敵ごとに HP を持たせ、HP0で消滅させる
- キル数をカウントして UI に表示する
- ダメージを与えたときに、数字を表示する(簡易演出)
- UnityでUIを実装するための基礎を取得する
- 必要なScriptsを作成する。
- UIの簡単な説明と設定
- TextMeshProをインポート
using UnityEngine;
public class EnemyHealth : MonoBehaviour
{
[SerializeField]
private int _maxHp = 100;
private int _currentHp;
private bool _isDead = false;
private void Start()
{
_currentHp = _maxHp;
}
public void OnDamaged(int damageAmount)
{
if(_isDead) return;
DamagePopup.Create(transform.position, damageAmount);
_currentHp -= damageAmount;
if (_currentHp <= 0)
{
_isDead = true;
EnemyKillCounter.Instance.AddKillCount();
Destroy(gameObject);
}
}
}
📄 Bullet.cs の修正
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D), typeof(BoxCollider2D))]
public class Bullet : MonoBehaviour
{
[SerializeField]
private int _damageAmount = 10;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Wall"))
{
Destroy(gameObject);
return;
}
if (collision.TryGetComponent<Enemy.EnemyHealth>(out var enemy))
{
enemy.OnDamaged(_damageAmount);
}
}
}
📄 EnemyKillCounter.cs
using UnityEngine;
using UnityEngine.UI;
public class EnemyKillCounter : MonoBehaviour
{
[SerializeField]
private TextMeshProUGUI _killCountText;
private int _killCount;
public static EnemyKillCounter Instance { get; private set; }
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
public static void Initialize()
{
Instance = null;
}
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
public void AddKillCount()
{
_killCount++;
_killCountText.text = _killCount.ToString();
}
}
✅ 設定手順
- Canvas に Text を作成 → フォント大きめ・右上表示など
- EnemyKillCounter.cs を空オブジェクトにアタッチ
- _killText に Text UI をアタッチ
📄 DamagePopup.cs
using UnityEngine;
using UnityEngine.UI;
public class DamagePopup : MonoBehaviour
{
[SerializeField]
private TextMeshProUGUI _popupText;
[SerializeField]
private float _floatSpeed = 1f;
[SerializeField]
private float _duration = 0.5f;
public static void Create(Vector3 position, int damage)
{
var resourcePrefab = Resources.Load<GameObject>("DamagePopup");
GameObject popup = Instantiate(resourcePrefab, position, Quaternion.identity);
popup.GetComponent<DamagePopup>().SetDamage(damage);
}
private void SetDamage(int damage)
{
_popupText.text = damage.ToString();
Destroy(gameObject, _duration);
}
private void Update()
{
transform.position += Vector3.up * _floatSpeed * Time.deltaTime;
}
}
✅ 設定手順
- Workspace/Resourcesを作成する。
- Popup用のPrefabを作成し、Workspace/Resourcesに格納する。
- 中に Canvas → TextMeshPro(World Space)を入れ、DamagePopup.cs をアタッチ
- Textにはデフォルトで "0" としておき、フォントサイズ・色を赤などに
✅ 動作チェックリスト(拡張)
- 弾が敵に当たると HP が減る
- 敵に HP バーをつける(任意) or 数値表示が出る
- HP が 0 になると敵が Destroy される
- キル数が UI に反映される
- 弾は敵や壁に当たると消える
- UI(ユーザーインターフェース)を表示するための仕組み
- ボタン・HPバー・スコア表示などはすべて Canvasの子オブジェクト に配置される
モード | 特徴 | 用途 |
---|---|---|
Screen Space - Overlay | 画面の最前面に表示される(標準) | スコア・HPバーなどの固定UI |
World Space | ワールド上の座標に表示されるUI | ダメージ数字・敵のHPバーなど |
UI要素 | 用途 |
---|---|
Slider | HPバーなどのバー表示に使う |
*Text | 数字・スコアなどの表示に使う |
Image | 背景・アイコンなどの表示に使う |
*今回の講義では「Textmeshpro」を使用する。
📝 課題 (バランス調整)
-
1.新しい「敵の種類」を作ろう L 新機のEnemyPrefabを作成し、HPやダメージを調整してみる
-
2.敵のHPをランダムに変化させるようにし、弱い敵(1発)〜強い敵(3発)などを混ぜて出現させてみよう
ヒント : ランダムで数値を出すやり方.
_currentHp = Random.Range(1, 4); // HP1〜3
- 3.敵がダメージを受けるたびに、一瞬白く光る処理を追加してみよう (難)
ヒント1 : SpriteRenderer コンポーネントの色(color)を変えて見る
[SerializeField] private SpriteRenderer _renderer;
_renderer.color = Color.red;//赤色になる
ヒント2 : 「一瞬白く光る」を実現させるためには...「Coroutine」というキーワードをググってみる
- 4 PlayerにHPバーを作成して、Hpが「0」になったらゲームオーバーの仕組みを作ってみよう(ノーヒント:難)