学習記事一覧 · Unity基礎

【学習】当たり判定(Collider)(Collider2D、Rigidbody2D)

これまでの学習では、

  • キー入力でオブジェクトを動かした
  • 毎フレームの処理を Update で書いた

という形でプレイヤーを動かしてきました。

しかし、オブジェクト同士が「ぶつかった」ことを検知する仕組みを学んでいません。

当たり判定(Collider)

という仕組みが必要です。

今回は Collider2DRigidbody2D を使って、当たり判定の基本を学びます。

今日学ぶこと

  • Collider2D … 当たり判定の形を定義する
  • Rigidbody2D … 物理演算(重力・衝突)を適用する
  • OnTriggerEnter2D … 重なった瞬間に呼ばれる
  • OnCollisionEnter2D … ぶつかった瞬間に呼ばれる

Collider2D とは

Collider2D は、オブジェクトの「当たり判定の形」を定義するコンポーネントです。

種類 用途
Box Collider 2D 四角形。多く使う
Circle Collider 2D 円形。キャラや弾に適している
Polygon Collider 2D 多角形。複雑な形に使う

オブジェクトに Collider2D を追加すると、他の Collider2D との衝突を検知できます。


Rigidbody2D とは

Rigidbody2D は、物理演算を適用するコンポーネントです。

プロパティ 説明
Body Type Dynamic(重力の影響を受ける)、Kinematic(スクリプトで動かす)、Static(動かない)
Gravity Scale 重力の強さ。0 で重力なし
Constraints 回転や移動を固定する
  • Dynamic … 重力や衝突の影響を受ける。キャラや落下物に使う
  • Kinematic … スクリプトで動かす。当たり判定はあるが物理の影響を受けない
  • Static … 動かない壁や床に使う

Is Trigger の違い

Collider2D の Is Trigger で、挙動が変わります。

Is Trigger 動作
オフ 物理的にぶつかる。OnCollisionEnter2D が呼ばれる
オン すり抜ける。重なったときに OnTriggerEnter2D が呼ばれる
  • オフ … 壁にぶつかって止まる、敵に当たってダメージなど
  • オン … アイテム取得、ゴール判定、弾が当たった判定など

OnTriggerEnter2D(重なった瞬間)

OnTriggerEnter2D は、Is Trigger がオンの Collider 同士が重なった瞬間に呼ばれます。

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Item"))
    {
        Debug.Log("アイテムを取得!");
        Destroy(other.gameObject);
    }
}

other には、ぶつかった相手の Collider2D が渡されます。other.gameObject で GameObject を取得できます。


OnCollisionEnter2D(ぶつかった瞬間)

OnCollisionEnter2D は、Is Trigger がオフの Collider 同士がぶつかった瞬間に呼ばれます。

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        Debug.Log("敵に当たった!");
    }
}

Tag でオブジェクトを識別する

Tag を使うと、ぶつかった相手を種類で判別できます。

  1. オブジェクトを選択
  2. Inspector の上部 Tag で「Add Tag」から新規作成(例:Item、Enemy)
  3. オブジェクトに Tag を割り当て
  4. スクリプトで other.CompareTag("Item") のように判定

設定の流れ(プレイヤー)

  1. GameObject に Rigidbody2D を追加
  2. Body Type を Dynamic、Gravity Scale を 0(2D 横スクロールの場合)
  3. Collider2D(Box または Circle)を追加
  4. 必要に応じて Is Trigger をオン/オフ

完成コード例

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Coin"))
        {
            Debug.Log("コイン取得!");
            Destroy(other.gameObject);
        }
    }
}

重要ポイント

Collider2D で当たり判定の形、Rigidbody2D で物理演算を設定します。

  • Collider2D … 当たり判定の形(Box、Circle など)
  • Rigidbody2D … 物理演算。Dynamic / Kinematic / Static
  • Is Trigger オン … すり抜ける。OnTriggerEnter2D で検知
  • Is Trigger オフ … ぶつかる。OnCollisionEnter2D で検知
  • Tag … 相手を種類で判別する

発展アイデア

当たり判定が分かったら、次のステップです。

  • Sprite とアニメーション … キャラに画像を表示する
  • プレハブと生成 … 敵や弾を Instantiate で生成する
  • 落ち物キャッチゲーム … 当たり判定を活用したミニゲーム

当たり判定は ゲームの核 です。次は Sprite で見た目を整えましょう。