【Unity2D】敵に触れたらダメージを受ける仕組みの作り方|(コード全文・解説付き)

敵と遭遇している画像 Unity2D実装解説(テクニック)

こんにちは!夜の街2dアクションゲームを制作中の怪獣です🦖

Unity2Dでアクションゲームを作っていると、

  • 敵に触れたらHPを減らしたい
  • ダメージ処理を入れたい

と思うことがありますよね。

この記事では、敵に触れたらプレイヤーがダメージを受ける仕組みの作り方を、初心者向けにわかりやすく解説します!

今回は OnCollisionEnter2D() を使って、
敵との接触を判定 → HPを減らす → (必要なら)ゲームオーバーにつなげる
という流れを作っていきます。

今回の仕組みを一度作れば、
「HPが0になったときにゲームオーバーの演出をさせる」
ゲームオーバー後、リトライさせる」
といった実装も容易に出来るようになります!


この記事でできること

  • 敵に触れた瞬間にダメージを受ける
  • プレイヤーのHPを減らせる
  • HPが0になったときの処理につなげられる
  • 敵との接触判定の基本がわかる

事前準備

この処理を正しく動かすには、事前に以下がついていることを前提としています。

Player側に必要なもの

  • Rigidbody2D
  • Collider2D
  • Playerスクリプト

Enemy側に必要なもの

  • Collider2D
  • 必要に応じて Rigidbody2D

① 完成コード

using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private int _maxHP = 5;
    private int _currentHP;

    private void Start()
    {
        _currentHP = _maxHP;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            _TakeDamage(1);
        }
    }

    private void _TakeDamage(int damage)
    {
        _currentHP -= damage;
        _currentHP = Mathf.Clamp(_currentHP, 0, _maxHP);

        Debug.Log("現在のHP: " + _currentHP);

        if (_currentHP <= 0)
        {
            _GameOver();
        }
    }

    private void _GameOver()
    {
        Debug.Log("ゲームオーバー");
    }
}

この処理の流れ

このコードでは、次の流れでダメージ処理を行っています↓

  1. プレイヤーが敵にぶつかる
  2. OnCollisionEnter2D() が呼ばれる
  3. 相手が Enemy タグなら _TakeDamage(1) を実行する
  4. HPを1減らす
  5. HPが0ならゲームオーバー処理へ進む

② コードを1行ずつ解説

HPを管理する変数

[SerializeField] private int _maxHP = 5;
private int _currentHP;

_maxHP は最大HPです。
_currentHP は現在のHPです。

SerializeField を付けているので、Inspector から数値を調整することもできます。


StartでHPを初期化する

private void Start()
{
    _currentHP = _maxHP;
}

ゲーム開始時に、現在HPを最大HPと同じ値にしています。
これを入れておくことで、最初から満タンの状態でスタートできます。


敵に触れたか判定する

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        _TakeDamage(1);
    }
}

OnCollisionEnter2D() は、2Dの当たり判定がぶつかった瞬間に呼ばれるメソッドです。

collision.gameObject.CompareTag("Enemy") で、
ぶつかった相手が Enemy タグかどうかを確認しています。

もし相手が敵なら、_TakeDamage(1) を呼び出して、1ダメージ与えます


ダメージを受ける処理

private void _TakeDamage(int damage)
{
    _currentHP -= damage;
    _currentHP = Mathf.Clamp(_currentHP, 0, _maxHP);

    Debug.Log("現在のHP: " + _currentHP);

    if (_currentHP <= 0)
    {
        _GameOver();
    }
}

このメソッドでは、プレイヤーがダメージを受けたときの処理をまとめています。

_currentHP -= damage;
 現在のHPから、受けたダメージ分だけ引いています。

Mathf.Clamp(_currentHP, 0, _maxHP);
 HPが 0 未満になったり、最大値を超えたりしないように制限しています。

たとえばHPが1のときに2ダメージ受けても、-1にはならず 0 で止まります。

if (_currentHP <= 0)
 HPが0以下になったら、ゲームオーバー処理へ進みます。


ゲームオーバー処理

private void _GameOver()
{
    Debug.Log("ゲームオーバー");
}

ここでは仮で Debug.Log を出しているだけですが、実際にはここに

  • ゲームオーバーUIを表示する
  • プレイヤー操作を止める
  • リトライ画面を出す

といった処理をつなげられます!


③ Enemyタグの設定方法

Enemyタグを作成する

敵オブジェクトには Enemy タグを設定しておきます。

手順は以下です↓

  1. 敵オブジェクトを選択する
  2. Inspector 上部の Tag を開く
  3. Enemy がなければ Add Tag で追加する
  4. 敵オブジェクトに Enemy タグを設定する
Enemyのタグ設定の画面

タグ判定では、以下のような書き方もあります。

if (collision.gameObject.tag == "Enemy")

ただし、Unityでは CompareTag() の方が一般的です。

理由は、

  • 意図がわかりやすい
  • タグ比較として書き方が明確
  • ミスに気づきやすい

からです。

そのため、初心者のうちは CompareTag() を使う形で覚えておくのがおすすめです✨


❌よくあるエラー

ダメージ判定が上手くいかない場合は、以下辺りを確認してみてください。

敵に触れてもダメージを受けない場合

  • 敵オブジェクトに Enemy タグが付いているか
  • Player と Enemy の両方に Collider2D があるか
  • 少なくともどちらかに Rigidbody2D が付いているか
  • OnCollisionEnter2D() のスペルミスがないか

HPが減らない場合

  • _TakeDamage(1) が呼ばれているか
  • Console に 現在のHP が表示されるか
  • _currentHP を別の処理で上書きしていないか

まとめ

今回は、OnCollisionEnter2D() を使って
敵に触れたらダメージを受ける処理 を実装する方法を解説しました!

今回のポイントは以下の通りです↓

  • 敵との接触判定は OnCollisionEnter2D() で行う
  • CompareTag("Enemy") で相手が敵か確認する
  • _TakeDamage() にダメージ処理をまとめる
  • HPが0になったらゲームオーバー処理につなげられる

この処理は、2Dアクションゲームの基本となる部分です。
まずはシンプルな形で実装して、あとから

  • 敵に触れた後、無敵時間を設ける
  • 点滅演出をさせる
  • ダメージを受けた後のSEをつける

などを追加していくのがおすすめです👾

コメント

タイトルとURLをコピーしました