【Unity入門⑩】敵を踏んだら倒す処理を作ろう!

Unity入門

こんにちは!怪獣です🦖
前回は「HPが0になったらゲームオーバーの演出させる」処理を実装しました。
今回は2Dアクションゲームらしく、上から踏んだら敵を倒す処理を追加します!💥


この記事でやること

  • プレイヤーが上から敵を踏むと倒す
  • 横や下からぶつかるとダメージを受ける
  • 反動で小さくジャンプする

処理の流れ

  1. 敵との当たり判定を取得する
  2. プレイヤーと敵の高さを比べる
  3. プレイヤーが上にいたら「踏んだ」と判定して敵を消す
  4. 横や下から当たった場合はダメージを受ける

Player.cs に踏みつけ処理を追加する

以下のコードを Player.cs に追加します。(コピペOK!)


    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Enemy"))
        {
            _HitEnemy(collision.gameObject);
        }
    }
    // 敵に触れたときの処理
    private void _HitEnemy(GameObject enemy)
    {
        // プレイヤーと敵の高さを取得
        float halfScaleY = transform.localScale.y / 2.0f;
        float enemyHalfScaleY = enemy.transform.lossyScale.y / 2.0f;

        // プレイヤーの「足元の高さ」
        float playerBottom = transform.position.y - (halfScaleY - 0.1f);
        // 敵の「頭の高さ」
        float enemyTop = enemy.transform.position.y + (enemyHalfScaleY - 0.1f);

        // ① プレイヤーが敵の上からぶつかった場合(踏んだとき)
        if (playerBottom >= enemyTop)
        {
            // 敵を削除
            Destroy(enemy);

            // 上方向にジャンプして反動表現
            _rigid.velocity = new Vector2(_rigid.velocity.x, 0f); // 一度落下速度をリセット
            _rigid.AddForce(Vector2.up * _jumpSpeed * 0.7f, ForceMode2D.Impulse);

            // (オプション)ジャンプ音などの効果音を鳴らす
            // Instantiate(_jumpSE);

            Debug.Log("敵を踏んで倒した!");
        }
        // ② 横や下からぶつかった場合(ダメージを受ける)
        else
        {
            Debug.Log("敵にぶつかってダメージ!");

            _TakeDamage(1); // HPを減らす
        }
    }g.Log("敵を踏んで倒した!");
    }
    // ② 横や下からぶつかった場合(ダメージを受ける)
    else
    {
        Debug.Log("敵にぶつかってダメージ!");
        _TakeDamage(1); // HPを減らす処理
    }
}

処理の解説

OnCollisionEnter2D

敵にぶつかった瞬間に呼ばれるUnityのイベント関数です。
CompareTag("Enemy") で、ぶつかった相手が「敵」かどうかを判定します。


プレイヤーと敵の高さを取得

float halfScaleY = transform.localScale.y / 2.0f;
float enemyHalfScaleY = enemy.transform.lossyScale.y / 2.0f;

プレイヤーと敵の高さの半分を求めています。
localScale はオブジェクトの大きさを表すため、
これを2で割ると「中心から端までの距離」がわかります。


上から踏んだかどうかを判定

float playerBottom = transform.position.y - (halfScaleY - 0.1f);
float enemyTop = enemy.transform.position.y + (enemyHalfScaleY - 0.1f);

if (playerBottom >= enemyTop)
  • プレイヤーの「足元」と敵の「頭の位置」を比較
  • プレイヤーが敵の頭より高い位置から当たった場合のみ「踏んだ」と判定します

0.1f は“ゆとり”です。
完全に同じ高さだと判定が曖昧になるため、少し余裕を持たせています。


踏んだ場合の処理

Destroy(enemy);
_rigid.velocity = new Vector2(_rigid.velocity.x, 0f);
_rigid.AddForce(Vector2.up * _jumpSpeed * 0.7f, ForceMode2D.Impulse);
  1. Destroy(enemy) … 敵を消す
  2. _rigid.velocity = ... … 一度落下速度をリセット
  3. _rigid.AddForce() … 反動で小ジャンプ

これで「踏んだ感」が出ます!


横や下から当たった場合

_TakeDamage(1);

踏めていなければダメージを受けます。
HPバーが減るなど、前回の記事で作った処理が呼ばれます💡


敵オブジェクトの設定

  1. Tag"Enemy" に設定
  2. Collider2D を追加(IsTrigger は OFF)
  3. Rigidbody2D は Kinematic でも可
  4. プレイヤーにも Rigidbody2D と Collider2D が必要

動作確認

ゲームを再生し、プレイヤーを左右に歩かせる

上から踏むと小ジャンプをし、敵を倒すことが出来ました!


よくあるつまずきポイント💡

症状原因対策
横からでも倒せる敵やプレイヤーのScaleが一致していないScaleを1,1,1に戻す
踏んでも反応しないTagが「Enemy」になっていないInspectorで設定
踏んでも跳ねない_jumpSpeed * 0.7f の係数が小さい倍率を上げる(0.9fなど)
当たり判定がズレるColliderのサイズが大きすぎる頭側を少し小さく調整

まとめ✅

処理内容
OnCollisionEnter2D敵との接触を検知
_HitEnemy()踏んだかぶつかったかを判定
Destroy(enemy)踏んだら敵を消す
_TakeDamage(1)横から当たったらHPを減らす
_jumpSpeed * 0.7f踏んだ反動の強さを調整

次回予告🦖

次回は、ジャンプをしたとき、敵に触れてダメージを食らった場合の効果音を追加して、
より2Dゲームのアクション性を上げていこうと思います!

コメント

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