【学習】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 で、ぶつかった相手を種類で判別できます。
- オブジェクトを選択 → Inspector の Tag で「Add Tag」から新規作成(例:Item、Enemy)
- オブジェクトに Tag を割り当て
- スクリプトで
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 は ゲームの核 です。当たり判定なしにゲームは成立しません。