こんにちは!怪獣です🦖
前回は「HPが0になったらゲームオーバーの演出させる」処理を実装しました。
今回は2Dアクションゲームらしく、上から踏んだら敵を倒す処理を追加します!💥
この記事でやること
- プレイヤーが上から敵を踏むと倒す
- 横や下からぶつかるとダメージを受ける
- 反動で小さくジャンプする
処理の流れ
- 敵との当たり判定を取得する
- プレイヤーと敵の高さを比べる
- プレイヤーが上にいたら「踏んだ」と判定して敵を消す
- 横や下から当たった場合はダメージを受ける
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);Destroy(enemy)… 敵を消す_rigid.velocity = ...… 一度落下速度をリセット_rigid.AddForce()… 反動で小ジャンプ
これで「踏んだ感」が出ます!
横や下から当たった場合
_TakeDamage(1);踏めていなければダメージを受けます。
HPバーが減るなど、前回の記事で作った処理が呼ばれます💡
敵オブジェクトの設定
- Tag を
"Enemy"に設定 - Collider2D を追加(
IsTriggerは OFF) - Rigidbody2D は Kinematic でも可
- プレイヤーにも 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ゲームのアクション性を上げていこうと思います!



コメント