1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity実践】Collider と Trigger を体感しよう! #1

1
Last updated at Posted at 2026-06-15

はじめに

こんにちは、オカダです!

ゲームを作っていると、

  • プレイヤーが壁にぶつかる
  • アイテムを拾う
  • 敵に攻撃が当たる
  • ゴール地点に入ったらクリアになる
  • 穴に落ちたらミスになる

といった、物体同士の「当たり判定」が必ず必要になります。

この当たり判定の土台になるのが Collider(コライダー)Trigger(トリガー) です。

今回の記事では、Unity 6.3 を前提に、Collider と Trigger の基本を初心者向けに整理します。単なる用語説明だけではなく、実際にゲームを作るときにどう使い分けるのか、どこでミスしやすいのか、どう調整すると遊びやすくなるのかまで扱います。

なお、この記事では「物体をどう動かすか」「力をどう加えるか」といった内容は深掘りしません。それは次回以降で扱います。今回は、まず 当たり判定の形とセンサーの考え方 を理解することに集中しましょう。

また、これは私が所属している徳島大学ゲームクリエイトプロジェクトの勉強会で使用するものです。興味がありましたら、公式Unityroom公式Xなども見に行ってください!

この記事の目標

この記事を読み終えるころには、次のことができるようになることを目指します。

  • Collider と Trigger の違いを説明できる
  • Unity 上で Collider の形を確認・調整できる
  • Trigger を「通り抜けられるセンサー」として使える
  • OnCollisionEnterOnTriggerEnter の違いが分かる
  • ゴール判定・落下判定・攻撃判定の基本的な作り方が分かる
  • Physics Material で摩擦・跳ね返りを設定できる
  • Raycast の基本的な考え方が分かる
  • 当たり判定が反応しないとき、基本的な確認ができる

0. まずは例えでイメージしよう

最初に、Collider と Trigger のイメージをつかみましょう。

Collider は「ぶつかる壁や床」 です。

例えば、部屋の壁に手を当てると、手はそれ以上進めません。同じように、ゲーム内のキャラクターも Collider を持つ壁に当たると止まります。

一方、Trigger は「自動ドアのセンサー」 です。

自動ドアは、人が前に立ったことを検知して開きます。しかし、センサーそのものにぶつかって跳ね返るわけではありません。Trigger はこのように、「範囲に入ったことを知らせるセンサー」の役割を持ちます。

衝突とトリガー.png

また、大事なのは、Trigger が完全に別の特殊な部品ではないということです。

Trigger は、Collider の プロパティ Is Trigger をオンにした状態 を指します。

1. Collider とは?

Collider は、ゲームオブジェクトに当たり判定を持たせるためのコンポーネントです。

ただし、ここで重要なのは、見た目と当たり判定は別物 だということです。

Unity の Cube を作ると、画面に見える四角いモデルがあります。しかし、それとは別に Box Collider という当たり判定も付いています。

要素 役割
Mesh / Model 画面に見える形
Collider 当たり判定として使われる形

見た目があるからといって、必ず当たり判定があるわけではありません。逆に、見た目がなくても Collider だけ置けば、見えない壁や見えない判定エリアを作れます。

例えば、見た目は複雑な木のモデルでも、当たり判定は単純な箱やカプセルで済ませることがあります。プレイヤーは、枝の細かいすき間まで正確に判定されることを望んでいるわけではありません。むしろ「だいたい木としてぶつかる」ほうが遊びやすいこともあります。

つまり、Collider は見た目を正確に再現するためだけのものではなく、ゲームとして気持ちよく遊べる判定を作るためのものでもあります。

2. いろんな Collider

Collider にはいろいろな種類があります。

最初から全部を覚える必要はありません。まずは、3D なら Box ColliderSphere ColliderCapsule Collider の3つを押さえれば十分です。

コンポーネント名 イメージ 主な使い道
Box Collider 四角い箱 床、壁、箱、足場、ゴール範囲
Sphere Collider ボール、アイテム取得範囲、爆風範囲
Capsule Collider カプセル 人型キャラクター、縦長の敵
Mesh Collider 見た目に近い形 複雑な地形や特殊な形状
Terrain Collider 地形 Terrain を使った広い地面
Wheel Collider 車輪 車やタイヤの表現

※ 2D の場合は、名前に 2D が付きます。

3D 2D
Box Collider Box Collider 2D
Sphere Collider Circle Collider 2D
Capsule Collider Capsule Collider 2D
Mesh Collider Polygon Collider 2D など

いろんなコライダー.png

2.1 Box Collider

Box Collider は、画像の最も左側のブロックの形をしている四角い箱型の当たり判定です。

最も基本的で、軽く、扱いやすい Collider です。床、壁、ブロック、足場、箱、ゴール範囲など、かなり多くの場面で使えます。

例えば、ゴール地点を作るときも、見た目は旗や扉で表現し、判定範囲は大きめの Box Collider にすることがあります。

2.2 Sphere Collider

Sphere Collider は、画像左から2番目のブロックの形をしている球形の当たり判定です。

ボールや丸いアイテムに向いています。また、アイテムの取得範囲、爆発範囲、回復エリアなど、「中心から一定距離以内」を判定したい場面にも便利です。

球形なので、どの方向から近づいても距離感が分かりやすいのが利点です。

2.3 Capsule Collider

Capsule Collider は、画像真ん中のブロックの形をしているカプセル型の当たり判定です。

人型キャラクターや縦長の敵に向いています。箱型だと角が引っかかりやすいですが、カプセル型は上下が丸いため、壁や段差に引っかかりにくいです。

キャラクターに使う Collider としてはかなり定番です。

2.4 Mesh Collider は便利だが使いすぎ注意

Mesh Collider は、見た目のメッシュに近い形で当たり判定を作れます。つまり、ブロックの見た目に近い形に当たり判定を作ってくれます。

一見すると便利ですが、複雑な形状ほど処理が重くなりやすいです。そのため、何でも Mesh Collider にするのはおすすめしません。

実際の制作では、複雑な見た目のオブジェクトでも、当たり判定は Box / Sphere / Capsule を組み合わせて近似することが多いです。

例えば、ローポリの木なら次のように分けられます。

部位 使う Collider の例
Capsule Collider
葉っぱ全体 Sphere Collider
根元 Box Collider

見た目に完全一致させるより、軽くて遊びやすい判定を作るほうが重要です。

Mesh Colliderが推奨される場合はダンジョンの地形やレースゲームのサーキットなどの動かない複雑なオブジェクトや鍵や弾丸などを通る必要がある穴が空いた壁などです。

3. Collider を触ってみよう

まずは Unity 上で Collider を確認してみましょう。

3.1 Cube の Collider を見る

  1. Hierarchy で右クリック
  2. 3D Object > Cube を作成
  3. Cube を選択
  4. Inspector で Box Collider を確認

Cube には最初から Box Collider が付いています。

BoxCollider.png

Scene ビューで Cube を選択すると、緑色のワイヤーフレームが表示されます。これが Collider の範囲です。

3.2 Collider をオフにしてみる

Box Collider のコンポーネントのチェックを外すと、Collider が無効になります。

見た目の Cube は残りますが、当たり判定としては存在しない状態になります。

このように、Unity では「見た目」と「当たり判定」を別々に扱えます。

4. Collider のサイズと位置を調整する

Collider は、見た目と完全に一致している必要はありません。

むしろゲームでは、見た目よりも少し大きい・少し小さい当たり判定 を意図的に使うことがあります。

対象 調整例 理由
プレイヤー 見た目より少し小さくする 理不尽に引っかかる感覚を減らす
アイテム 見た目より少し大きくする アイテムを取りやすくする
敵の攻撃 見た目より少し小さくする プレイヤーが納得しやすい
ゴール判定 見た目より少し大きくする 到達したのに反応しない問題を防ぐ

Box Collider には主に次の項目があります。

項目 意味
Is Trigger Trigger として使うかどうか
Material 摩擦や跳ね返りの設定
Center 中心位置
Size 大きさ

Sphere Collider では、主に CenterRadius を調整します。

項目 意味
Center 球の中心位置
Radius 半径

Inspector で数値を入力してもよいですが、Scene ビューで Edit Collider を使うと、緑色の枠を直接動かせます。基本的に Scene ビューで見ながら調整するほうが分かりやすくておすすめです。

5. Physics Material で手触りを変える

Collider には Physics Material を設定できます。

これは、表面の摩擦や跳ね返りを調整するための素材です。

例えば、氷の床のように滑りやすくしたり、ボールをよく跳ねるようにしたりできます。

作成手順は次の通りです。

  1. Project ウィンドウで右クリック
  2. Create > Physics Material を選択
  3. 作成した Material の値を調整
  4. Collider の Material 欄に割り当てる

代表的な項目は次の通りです。

項目 意味
Dynamic Friction 動いているときの摩擦
Static Friction 止まっているときの摩擦
Bounciness 跳ね返りやすさ
Friction Combine 摩擦をどう合成するか
Bounce Combine 跳ね返りをどう合成するか

例えば、よく跳ねるボールを作りたいなら、次のような値から試すと分かりやすいです。

項目 値の例
Dynamic Friction 0
Static Friction 0
Bounciness 0.8
Bounce Combine Maximum

ただし、Physics Material はゲームの手触りに大きく影響します。正解の数値を暗記するより、実際に再生して触りながら調整するのが大事です。
:::note warn
実はColliderだけでは衝突や反発は**実装できません!**実装するために必要なRigidBodyというものは次回の記事で紹介するので
今回は「こういう機能があるんだな~」くらいにしておきましょう。
:::

6. Trigger とは?

Trigger は、Collider の Is Trigger をオンにしたものです。

普通の Collider は「ぶつかる壁」のように使います。一方、Trigger は「通り抜けられるセンサー」として使います。

属性 普通の Collider Trigger
ぶつかる する しない
通り抜け 基本できない できる
主な用途 壁、床、障害物 アイテム取得、ゴール、範囲検知、落下判定
設定 Is Trigger オフ Is Trigger オン

例えば、コインを拾う処理では、コインに Trigger を設定します。

プレイヤーがコインの範囲に入ったら「取得した」と判定し、スコアを増やしてコインを消す、という流れです。

Trigger は、次のような場面でよく使います。

  • ゴール判定
  • アイテム取得
  • 敵の出現エリア
  • 落下判定
  • 攻撃範囲
  • 回復エリア
  • カメラ切り替えエリア

7. Trigger のイベントメソッド

Trigger には、主に3つのイベントメソッドがあります。

メソッド 呼ばれるタイミング 使い道
OnTriggerEnter 入った瞬間 アイテム取得、ゴール判定
OnTriggerStay 中にいる間 毒沼、回復エリア
OnTriggerExit 出た瞬間 効果解除、表示を消す

コード例は次の通りです。

using UnityEngine;

public class TriggerLogger : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"{other.gameObject.name} が入りました");
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log($"{other.gameObject.name} が中にいます");
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log($"{other.gameObject.name} が出ました");
    }
}

コードの読み方について補足します。

  • private void は「このクラス内だけで使えるメソッド(処理のまとまり)」を定義しています。void は「呼び出し元に値を返さない」という意味です。
  • Collider other は引数(受け取る値)で、「Trigger に入ってきた相手の Collider を other という名前で受け取る」という意味です。
  • other.gameObject.name は「other の GameObject の名前」を意味します。ドット(.)でつなぐことで、関連する情報を取り出せます。
  • $"{other.gameObject.name} が入りました"$"..." は「文字列補間」という書き方で、{} の中に書いた変数の値を文字列の中に埋め込めます。文字列の先頭に $ を付けることで使えます。

例えば、Player だけに反応したい場合は、Tag を使って判定できます。

private void OnTriggerEnter(Collider other)
{
    if (!other.CompareTag("Player"))
    {
        return;
    }

    Debug.Log("Player が入りました");
}

other.CompareTag("Player") は「触れてきた相手の Tag が "Player" かどうか確認する」という意味です。先頭の ! は「〜でない」を意味するため、!other.CompareTag("Player") は「Tag が "Player" でない場合」という条件になります。Tag が違う場合は return で処理を抜けるので、Player 以外のオブジェクトには反応しません。

Tag は、Unity の Inspector でオブジェクトを選択したときに上部に表示される Tag ドロップダウンから設定できます。デフォルトで PlayerEnemyMainCamera などが用意されており、自分で追加することもできます。Tag の詳しい使い方はセクション10で解説します。

8. 衝突イベントと Trigger イベントの違い

Unity には、衝突用のイベントと Trigger 用のイベントがあります。

イベントメソッド 呼ばれるタイミング 受け取る型 主な用途
OnCollisionEnter() 触れた瞬間 Collision 壁にぶつかる、床に着く
OnCollisionStay() 触れている間 Collision 接触中の処理
OnCollisionExit() 離れた瞬間 Collision 離れたときの処理
OnTriggerEnter() Trigger に入った瞬間 Collider アイテム取得、ゴール
OnTriggerStay() Trigger 内にいる間 Collider 毒沼、回復エリア
OnTriggerExit() Trigger から出た瞬間 Collider 効果解除

大事なのは、引数の型が違うことです。

private void OnCollisionEnter(Collision collision)
{
    Debug.Log($"{collision.gameObject.name} と接触しました");
}
private void OnTriggerEnter(Collider other)
{
    Debug.Log($"{other.gameObject.name} が入りました");
}

初心者がよくやるミスは、次のような書き方です。

// 間違い:Trigger なのに Collision を受け取っている
private void OnTriggerEnter(Collision collision)
{
}

// 間違い:Collision なのに Collider を受け取っている
private void OnCollisionEnter(Collider other)
{
}

メソッド名、大文字小文字、引数の型が違うと呼ばれません。

9. よく使う Trigger の例

9.1 ゴール判定

ゴール地点に Box Collider を置き、Is Trigger をオンにします。

using UnityEngine;

public class GoalTrigger : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (!other.CompareTag("Player"))
        {
            return;
        }

        Debug.Log("ステージクリア!");
    }
}

ゴール判定は、見た目より少し大きめにすることが多いです。

プレイヤーが「明らかにゴールに入った」と感じているのに反応しないと、ストレスになるからです。

9.2 落下判定

ステージの下に大きな Trigger を置くと、プレイヤーが落ちたことを検知できます。

using UnityEngine;

public class FallDetector : MonoBehaviour
{
    [SerializeField] private Transform respawnPoint;

    private void OnTriggerEnter(Collider other)
    {
        if (!other.CompareTag("Player"))
        {
            return;
        }

        other.transform.position = respawnPoint.position;
        Debug.Log("プレイヤーが落下したためリスポーンしました");
    }
}

other.transform.position = respawnPoint.position; は「触れてきた相手(プレイヤー)の位置を、リスポーン地点の位置に変更する」という意味です。これでプレイヤーが落下した瞬間にリスポーン地点へ瞬間移動します。

[SerializeField] は、Inspector からオブジェクトをアタッチするための属性です。詳しくは後の回で解説します。

FallDetector は、地面よりずっと下に大きな Box Collider を置いて作ります。

見た目は不要なので、空の GameObject に Collider だけ付ける形でも構いません。

9.3 攻撃判定

剣やパンチなど、攻撃の当たり判定にも Trigger を使います。

攻撃オブジェクトに Box ColliderIs Trigger オン)を付けて、敵に当たったかどうかを検知するのが基本的な方法です。

using UnityEngine;

public class AttackHitbox : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (!other.CompareTag("Enemy"))
        {
            return;
        }

        Debug.Log($"{other.gameObject.name} に攻撃が当たった!");
    }
}

攻撃判定では、「攻撃中だけ Trigger を有効にする」という使い方がよくあります。攻撃アニメーションの開始時に Collider を有効化し、終了時に無効化すると、攻撃中だけ判定が働くようにできます。

10. Tag と Layer

当たり判定を作るとき、TagLayer の違いも重要です。

TagLayer は、どちらも GameObject を分類するための仕組みです。
ただし、得意な使い道が違います。

Tag は、オブジェクトに付ける「名札」のようなものです。
スクリプトで「これは Player か?」「これは Enemy か?」のように、種類や役割を判定したいときによく使います。

一方、Layer は、Unity の内部処理で使う「グループ分け」のようなものです。
物理判定の組み合わせ、Raycast の対象、Camera に映す対象などを制御するときによく使います。もちろん、Layer もスクリプトから判定できます。

項目 ざっくり言うと 主な用途
Tag オブジェクトの役割を表す名札 スクリプトで Player、Enemy、Coin などを判定する
Layer オブジェクトの所属グループ 物理判定、Raycast、Camera 表示、スクリプト判定の対象を制御する

10.1 Layer Collision Matrix

Edit > Project Settings > Physics を開くと、Layer Collision Matrix を設定できます。

これは、「どの Layer 同士を反応させるか」を決める表です。

例えば、次のようなレイヤーを作ったとします。

  • Player
  • Enemy
  • PlayerAttack
  • EnemyAttack
  • Item
  • Ground

このとき、すべてがすべてと反応する必要はありません。

組み合わせ例 反応させる? 理由
Player × Ground する プレイヤーは地面や壁とぶつかるため
PlayerAttack × Enemy する 攻撃を当てるため
PlayerAttack × Player しない 自分の攻撃で自分に当たらないようにする
Item × Item しない 不要な処理を減らす

Layer Collision Matrix を整理すると、不要な判定を減らせます。

これはパフォーマンス改善だけでなく、「なぜか味方同士で反応する」「自分の攻撃が自分に当たる」といったバグ防止にも役立ちます。

11. Raycast という選択肢

Collider や Trigger のイベントだけでなく、自分で線を飛ばして当たりを調べる方法もあります。

それが Raycast(レイキャスト) です。

Raycast は、レーザーのような線を飛ばして、何に当たったか調べる機能です。

例えば、次のような場面で使います。

  • クリックした場所のオブジェクトを調べる
  • キャラクターの正面に敵がいるか調べる
  • 銃の命中判定を取る
using UnityEngine;

public class RaycastExample : MonoBehaviour
{
    // Inspector で最大距離と対象レイヤーを設定できるようにしている
    [SerializeField] private float maxDistance = 100f;
    [SerializeField] private LayerMask hitLayers;

    private void Update()
    {
        CheckRaycastHit();
    }

    private void CheckRaycastHit()
    {
        // マウス左ボタン(0 = 左クリック)が押された瞬間
        if (Input.GetMouseButtonDown(0))
        {
            // 自分の位置から正面方向へレイを作成
            Ray ray = new Ray(transform.position, transform.forward);

            // レイを飛ばして当たったオブジェクトを hit に入れる
            // QueryTriggerInteraction.Ignore = Trigger には当たらないようにする
            if (Physics.Raycast(ray, out RaycastHit hit, maxDistance, hitLayers, QueryTriggerInteraction.Ignore))
            {
                Debug.Log($"{hit.collider.name} に当たりました");
            }
        }
    }
}

QueryTriggerInteraction.Ignore を指定すると、Trigger を無視して通常の Collider だけに当たります。

逆に Trigger も検出したい場合は、QueryTriggerInteraction.Collide を使います。

new Ray(...)out RaycastHit hit などの書き方は、今の段階では「こう書くもの」として覚えておけば大丈夫です。詳しい仕組みは後の回で学びます。

12. デバッグのコツ

当たり判定が反応しないときは、闇雲に設定を変えるより、順番に確認するのが大事です。

12.1 チェックリスト

  • 互いに Collider が付いているか
  • 少なくとも一方のオブジェクトに Rigidbody が付いているか(※ Rigidbody は次回の記事で解説します)
  • Trigger にしたい Collider の Is Trigger はオンか
  • 3D と 2D を混ぜていないか
  • イベントメソッド名は正しいか
  • 引数の型を間違えていないか
  • Tag は正しいか
  • Layer Collision Matrix で反応が無効化されていないか
  • Collider の enabled が false になっていないか
  • GameObject が非アクティブになっていないか
  • Collider のサイズが小さすぎないか

12.2 Debug.Log で確認する

まずは、相手が本当に入ってきているか確認しましょう。

private void OnTriggerEnter(Collider other)
{
    Debug.Log($"相手: {other.name}, Tag: {other.tag}, Layer: {LayerMask.LayerToName(other.gameObject.layer)}");
}

Tag や Layer の勘違いを見つけるのに便利です。

13. まとめ

今回は、Unity 6.3 を前提に Collider と Trigger の基本を学びました。

重要なポイントは次の通りです。

  • Collider は当たり判定の形である。
  • 見た目の Mesh と Collider は別物である。
  • Trigger は Collider の Is Trigger をオンにしたセンサーである。
  • Trigger はぶつかるためではなく、入った・出た・中にいることを検知するために使う。
  • OnCollisionEnterOnTriggerEnter は似ているが、用途も引数の型も違う。
  • 2D と 3D の Collider やイベントメソッドは別物である。
  • Tag と Layer は役割が違う。
  • 当たり判定は見た目に完全一致させるより、遊びやすさを優先して調整することが多い。
  • Physics Material で Collider の摩擦や跳ね返りを調整できる。
  • Raycast を使うと、線を飛ばして何に当たったかを調べられる。

Collider と Trigger は、ゲーム制作のほぼすべてのジャンルで使います。

アクション、シューティング、パズル、レース、RPG、3D探索ゲームなど、どのジャンルでも「何かに触れた」「範囲に入った」「ぶつかった」という処理は必要になります。

まずは、

  1. Collider は当たり判定の形
  2. Trigger は通り抜けられるセンサー

という2つのイメージを持っておきましょう。

次回は、今回扱った Collider / Trigger と組み合わせて使う「物体を動かすためのコンポーネント」について学びます!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?