【学習】当たり判定(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 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 を使うと、ぶつかった相手を種類で判別できます。
- オブジェクトを選択
- Inspector の上部 Tag で「Add Tag」から新規作成(例:Item、Enemy)
- オブジェクトに Tag を割り当て
- スクリプトで
other.CompareTag("Item")のように判定
設定の流れ(プレイヤー)
- GameObject に Rigidbody2D を追加
- Body Type を Dynamic、Gravity Scale を 0(2D 横スクロールの場合)
- Collider2D(Box または Circle)を追加
- 必要に応じて 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 で見た目を整えましょう。