学習記事一覧 · Unityクラス

【学習】Collider2D クラス(当たり判定)

Unity 入門シリーズでは、

  • Collider2D で当たり判定の形を定義した
  • OnTriggerEnter2D と OnCollisionEnter2D で衝突を検知した

という形で当たり判定を学びました。

しかし、Collider2D には他にも知っておくと便利な API があります。

Collider2D クラス

の主な使い方をまとめて押さえましょう。

今回は Collider2D のよく使うメソッドと、衝突コールバックの違いを解説します。

今日学ぶこと

  • OnTriggerEnter2D … 重なった瞬間に呼ばれる(Is Trigger オン)
  • OnCollisionEnter2D … ぶつかった瞬間に呼ばれる(Is Trigger オフ)
  • Is Trigger … すり抜けるか、物理的にぶつかるか
  • other / collision … 相手の情報を取得する
  • CompareTag … オブジェクトの種類を判別する

Collider2D とは

Collider2D は、オブジェクトの「当たり判定の形」を定義するコンポーネントです。Box Collider 2D、Circle Collider 2D、Polygon Collider 2D などがあります。

衝突を検知するには、Rigidbody2D が少なくとも一方のオブジェクトに必要です。


Is Trigger の違い

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

Is Trigger 動作 呼ばれるコールバック
オン すり抜ける。重なったことを検知するだけ OnTriggerEnter2D、OnTriggerStay2D、OnTriggerExit2D
オフ 物理的にぶつかる。押し返される OnCollisionEnter2D、OnCollisionStay2D、OnCollisionExit2D
  • オン … アイテム取得、ゴール判定、弾が当たった判定
  • オフ … 壁にぶつかって止まる、敵に当たってダメージ

OnTriggerEnter2D(重なった瞬間)

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

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Item"))
    {
        Debug.Log("アイテム取得!");
        Destroy(other.gameObject);
    }
}
引数 説明
other ぶつかった相手の Collider2D
other.gameObject 相手の GameObject
other.CompareTag("Tag名") 指定した Tag かどうか判定

OnTriggerStay2D / OnTriggerExit2D

メソッド 呼ばれるタイミング
OnTriggerEnter2D 重なり始めた瞬間
OnTriggerStay2D 重なっている間、毎フレーム
OnTriggerExit2D 重なりが解けた瞬間

OnCollisionEnter2D(ぶつかった瞬間)

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

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        Debug.Log("敵に当たった!");
    }
}
引数 説明
collision 衝突情報(Collision2D)
collision.gameObject 相手の GameObject
collision.contacts 衝突点の情報

OnCollisionStay2D / OnCollisionExit2D

メソッド 呼ばれるタイミング
OnCollisionEnter2D ぶつかり始めた瞬間
OnCollisionStay2D ぶつかっている間、毎フレーム
OnCollisionExit2D 離れた瞬間

Tag で相手を判別する

CompareTag で、ぶつかった相手を種類で判別できます。

  1. オブジェクトを選択 → Inspector の Tag で「Add Tag」から新規作成(例:Item、Enemy)
  2. オブジェクトに Tag を割り当て
  3. スクリプトで other.CompareTag("Item") のように判定
if (other.CompareTag("Item"))
{
    // アイテムの処理
}
else if (other.CompareTag("Enemy"))
{
    // 敵の処理
}

完成コード例

using UnityEngine;

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

重要ポイント

Collider2D で当たり判定の形を定義し、コールバックで衝突を検知します。

  • Is Trigger オン … すり抜ける。OnTriggerEnter2D で検知
  • Is Trigger オフ … ぶつかる。OnCollisionEnter2D で検知
  • other … OnTriggerEnter2D の引数。相手の Collider2D
  • collision … OnCollisionEnter2D の引数。collision.gameObject で GameObject 取得
  • CompareTag … 相手の種類を判別

発展アイデア

  • Layer … 特定のレイヤー同士だけ衝突させる(Layer Collision Matrix)
  • bounds … Collider の範囲を取得
  • OverlapCircle … 指定範囲内の Collider を検出(Physics2D)

Collider2D は ゲームの核 です。当たり判定なしにゲームは成立しません。