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

広告

これまでの学習では、

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

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

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

当たり判定(Collider)

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

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

今日学ぶこと

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

Collider2D とは

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

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

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


Rigidbody2D とは

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

プロパティ説明
Body TypeDynamic(重力の影響を受ける)、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 をオン/オフ
当たり判定の設定の流れ両方に Collider2D当たり判定の形どちらかに Rigidbody2D物理演算(衝突の検知に必要)Is Trigger を選ぶオン/オフで挙動が変わるIs Trigger オフ物理的にぶつかるOnCollisionEnter2DIs Trigger オンすり抜ける(重なる)OnTriggerEnter2DTag で相手を判別other.CompareTag(“Item")
当たり判定の設定:Collider2D と Rigidbody2D を付け、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 で見た目を整えましょう。

訪問数 8 回, 今日の訪問数 8回

広告

Unity

Posted by hidepon