こんにちは!夜の街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("ゲームオーバー");
}
}この処理の流れ
このコードでは、次の流れでダメージ処理を行っています↓
- プレイヤーが敵にぶつかる
OnCollisionEnter2D()が呼ばれる- 相手が Enemy タグなら
_TakeDamage(1)を実行する - HPを1減らす
- 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 タグを設定しておきます。
手順は以下です↓
- 敵オブジェクトを選択する
- Inspector 上部の Tag を開く
Enemyがなければ Add Tag で追加する- 敵オブジェクトに
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をつける
などを追加していくのがおすすめです👾

コメント