フリーキーズ | 独学プログラミング

Unity入門!当たり判定の基本 ColliderとTriggerの使い分けを初心者向けに解説

リンドくん

リンドくん

先生、Unityで当たり判定を作りたいんですけど、ColliderとTriggerって何が違うんですか?

たなべ

たなべ

この2つの使い分けがゲーム開発では超重要なんだ。
簡単に言うと、Colliderは「ぶつかって止まる」判定で、Triggerは「すり抜ける」判定なんだよ。

リンドくん

リンドくん

えっ、すり抜けるのに判定があるってどういうことですか?

たなべ

たなべ

例えば、アイテムを拾うときって、プレイヤーがアイテムにぶつかって止まったら変だよね?
すり抜けながら「触れた」ことだけを検知したいときにTriggerを使うんだ。詳しく説明していくよ!

ゲーム開発において当たり判定は、プレイヤーと敵の衝突、アイテムの取得、ゴール判定など、あらゆる場面で必要となる基本中の基本です。

Unityでは「Collider」というコンポーネントを使って当たり判定を実現しますが、その中でも通常のColliderとTriggerの違いを理解することが、思い通りのゲームを作る上でとても重要になります。

この記事では、Unity初心者の方に向けて、ColliderとTriggerの基本概念から実際のコードの書き方まで、わかりやすく解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

Colliderとは何か?物理的な当たり判定の基本

Colliderの役割

Collider(コライダー) とは、Unityのゲームオブジェクトに「当たり判定の形」を与えるコンポーネントです。

Colliderを設定することで、そのオブジェクトは他のオブジェクトと物理的に衝突できるようになります。壁にぶつかって止まる、床の上に立つ、といった挙動はすべてColliderによって実現されています。

主なColliderの種類

Unityには様々な形状のColliderが用意されています。

  • Box Collider - 箱型の当たり判定。壁や床、箱などに最適
  • Sphere Collider - 球型の当たり判定。ボールやキャラクターの頭部などに使用
  • Capsule Collider - カプセル型の当たり判定。人型キャラクターによく使われる
  • Mesh Collider - 3Dモデルの形状に沿った当たり判定。複雑な形状に対応

初心者の方は、まずBox ColliderとSphere Colliderから使い始めるのがおすすめです。

Colliderの追加方法

  1. ヒエラルキーでオブジェクトを選択
  2. インスペクターで「Add Component」をクリック
  3. 「Physics」→「Box Collider」などを選択

これだけで、そのオブジェクトに当たり判定が追加されます。

いろいろなCollider

いろいろなCollider

Triggerとは何か?すり抜ける当たり判定

Triggerの役割

Trigger(トリガー) は、Colliderの特殊なモードです。

通常のColliderが「物理的にぶつかって止まる」のに対し、Triggerはオブジェクトをすり抜けながら「触れた」ことだけを検知します。

これが非常に便利なのは、以下のような場面です。

  • アイテムの取得判定(プレイヤーがアイテムに触れたら取得)
  • ゴールエリアの判定(プレイヤーがゴールに入ったらクリア)
  • 敵の索敵範囲(プレイヤーが範囲に入ったら追跡開始)

TriggerをONにする方法

Triggerを使うには、Colliderコンポーネントの「Is Trigger」チェックボックスをONにするだけです。

  1. 対象のオブジェクトを選択
  2. インスペクターでColliderコンポーネントを確認
  3. 「Is Trigger」にチェックを入れる

たったこれだけで、そのColliderはTriggerモードになります。

Is Triggerの位置(Unity 6.2)

Is Triggerの位置(Unity 6.2)

ColliderとTriggerの使い分け方

リンドくん

リンドくん

なるほど!でも、実際にどう使い分ければいいんですか?

たなべ

たなべ

ポイントは「物理的に止まってほしいかどうか」で判断することだよ。
壁や床は止まってほしいからCollider、アイテムや判定エリアはすり抜けてほしいからTriggerって感じだね。

使い分けの基準

用途ColliderTrigger
壁・床・障害物×
アイテム取得×
ダメージエリア×
ゴール判定×
キャラクター同士の衝突×
索敵範囲×

基本的な考え方として、物理的な相互作用が必要ならCollider検知だけが必要ならTriggerと覚えておくと良いでしょう。

注意点 Rigidbodyが必要

ColliderやTriggerの判定を正しく動作させるためには、少なくとも片方のオブジェクトにRigidbodyコンポーネントが必要です。

Rigidbodyは物理演算を行うためのコンポーネントで、これがないと衝突イベントが発生しません。動くキャラクターには基本的にRigidbodyを付けておきましょう。

サンプルコード Colliderの衝突を検知する

通常のCollider同士が衝突したときの処理を書いてみましょう。

using UnityEngine;

public class CollisionExample : MonoBehaviour
{
    // 衝突した瞬間に呼ばれる
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("衝突しました: " + collision.gameObject.name);
        
        // 衝突した相手が「Enemy」タグなら
        if (collision.gameObject.CompareTag("Enemy"))
        {
            Debug.Log("敵と衝突!ダメージを受けた!");
        }
    }
    
    // 衝突している間、毎フレーム呼ばれる
    void OnCollisionStay(Collision collision)
    {
        Debug.Log("衝突中: " + collision.gameObject.name);
    }
    
    // 衝突が終わった瞬間に呼ばれる
    void OnCollisionExit(Collision collision)
    {
        Debug.Log("離れました: " + collision.gameObject.name);
    }
}

ポイント解説

  • OnCollisionEnter - 衝突した瞬間に1回だけ呼ばれる
  • OnCollisionStay - 衝突している間、毎フレーム呼ばれる
  • OnCollisionExit - 離れた瞬間に1回だけ呼ばれる
  • collision.gameObject - 衝突した相手のオブジェクトを取得できる

サンプルコード Triggerの接触を検知する

次に、Triggerモードでの接触検知のコードです。

using UnityEngine;

public class TriggerExample : MonoBehaviour
{
    // Triggerに入った瞬間に呼ばれる
    void OnTriggerEnter(Collider other)
    {
        Debug.Log("Trigger内に入りました: " + other.gameObject.name);
        
        // 入ってきたのが「Player」タグなら
        if (other.CompareTag("Player"))
        {
            Debug.Log("プレイヤーがアイテムを取得!");
            // このアイテムを消す
            Destroy(gameObject);
        }
    }
    
    // Trigger内にいる間、毎フレーム呼ばれる
    void OnTriggerStay(Collider other)
    {
        Debug.Log("Trigger内に滞在中: " + other.gameObject.name);
    }
    
    // Triggerから出た瞬間に呼ばれる
    void OnTriggerExit(Collider other)
    {
        Debug.Log("Triggerから出ました: " + other.gameObject.name);
    }
}

ColliderとTriggerのコードの違い

項目ColliderTrigger
メソッド名OnCollision〇〇OnTrigger〇〇
引数の型CollisionCollider

この違いを間違えると動作しないので、注意が必要です。

アイテム取得システムを作ってみよう

リンドくん

リンドくん

実際にゲームで使えるサンプルを見てみたいです!

たなべ

たなべ

じゃあ、よくあるアイテム取得の仕組みを作ってみようか。
プレイヤーがコインに触れたらスコアが増えて、コインが消えるっていうシンプルなものだよ。

コイン側のスクリプト

using UnityEngine;

public class Coin : MonoBehaviour
{
    public int scoreValue = 100;  // このコインの得点
    
    void OnTriggerEnter(Collider other)
    {
        // プレイヤーが触れたら
        if (other.CompareTag("Player"))
        {
            // スコアを加算(GameManagerがあると仮定)
            GameManager.Instance.AddScore(scoreValue);
            
            // 取得エフェクトを再生(あれば)
            // Instantiate(collectEffect, transform.position, Quaternion.identity);
            
            // コインを消す
            Destroy(gameObject);
        }
    }
}

セットアップ手順

  1. コインオブジェクトの設定

    • Sphere Colliderを追加
    • 「Is Trigger」をONにする
    • 上記のCoinスクリプトをアタッチ
  2. プレイヤーオブジェクトの設定

    • Collider(Capsule Colliderなど)を追加
    • Rigidbodyを追加
    • タグを「Player」に設定

これで、プレイヤーがコインに触れるとスコアが加算され、コインが消えるシステムの完成です。

よくあるトラブルと解決法

問題1 当たり判定が反応しない

原因と解決法

  • 少なくとも片方にRigidbodyがあるか確認
  • Colliderの「Is Trigger」設定が正しいか確認
  • メソッド名が正しいか確認(OnCollisionとOnTriggerの違い)
  • タグの設定が正しいか確認

問題2 すり抜けてしまう

原因と解決法

  • 移動速度が速すぎる場合は、RigidbodyのCollision Detectionを「Continuous」に変更
  • Colliderのサイズが小さすぎないか確認

問題3 判定が複数回呼ばれる

原因と解決法

  • Destroyする前にフラグを立てて重複呼び出しを防ぐ
  • 複数のColliderがある場合は意図した構成か確認

まとめ

リンドくん

リンドくん

ColliderとTriggerの違い、よくわかりました!
止めるか止めないかで考えればいいんですね。

たなべ

たなべ

その通り!最初は迷うかもしれないけど、実際にゲームを作りながら試していけば自然と身につくよ。
まずは簡単なアイテム取得から始めてみてね!

今回は、Unityの当たり判定の基本であるColliderとTriggerの違いと使い分けについて解説しました。

ポイントをおさらいしましょう。

  • Collider - 物理的にぶつかって止まる判定。壁、床、障害物に使用
  • Trigger - すり抜けながら接触を検知する判定。アイテム取得、ゴール判定に使用
  • コードの違い - ColliderはOnCollision〇〇、TriggerはOnTrigger〇〇メソッドを使用
  • Rigidbody必須 - 判定を動作させるには少なくとも片方にRigidbodyが必要

当たり判定はゲーム開発の基礎中の基礎です。この概念をしっかり理解しておくことで、キャラクターの移動、アイテムの取得、敵との戦闘など、あらゆるゲームシステムを作れるようになります。

最初は「壁」と「アイテム」のような簡単な例から始めて、徐々に複雑な判定システムに挑戦していきましょう。実際に手を動かしてみることが、理解を深める一番の近道です。

ぜひ今回学んだ内容を使って、自分だけのゲームを作ってみてください!

この記事をシェア

関連するコンテンツ