【Unity】Colliderの使い方|種類・Is Trigger・衝突判定を解説
この記事について
この記事では、UnityのColliderの種類・設定・Is Trigger・衝突イベントについて学べます。
「ぶつかったら止まる判定」と「すり抜けて反応する判定」を、2つのCubeを使って説明していきます。
対象は3DのColliderとRigidbodyです。Unity 6の仕様を踏まえ、Rigidbodyが必要な条件や、判定が反応しないときの確認点も紹介します。
この記事で学べること
- Colliderの役割・種類とInspectorでの設定
- Is TriggerとRigidbodyの組み合わせ
- OnCollisionEnter・OnTriggerEnterの使い方
- 衝突判定が反応しないときの確認点
UnityのColliderとは?
Collider(コライダー)とはUnityでオブジェクトに「当たり判定」を持たせるためのコンポーネントです。
見た目には表示されませんが、「物理エンジンに形状を伝える役割」を持っています。
ゲームでは「キャラが地面に立つ」「弾が敵に当たる」「プレイヤーがアイテムを拾う」といった判定に使います。見た目のメッシュと、Colliderの形状が完全に同じである必要はありません。
Colliderは当たり判定の形状、Rigidbodyは重力や力による動きを担当します。Colliderを付けただけでは、重力で落ちるようにはなりません。
床や壁など動かないものは、Rigidbodyを付けずにColliderだけを使えます。重力で動かしたいものにはRigidbodyも追加しましょう。Rigidbodyの設定は以下の記事で解説しています。
Colliderの使い方と基本設定
Colliderを追加して大きさを合わせる
Colliderをオブジェクトに追加するには、以下の手順を行います。
- Hierarchy内のGameObjectを選択する
- Inspectorの「Add Component」から「Box Collider」などを追加する
- Sceneビューで当たり判定の枠を確認し、CenterやSizeなどを調整する
3D Objectから作成したCubeには、最初からBox Colliderが付いています。すでに付いている場合は追加せず、既存のものを調整してください。

基本的なColliderの種類
- BoxCollider:直方体の当たり判定。箱・壁・床などに使います
- SphereCollider:球形の当たり判定。ボールなどに使います
- CapsuleCollider:円柱の両端に半球を付けたカプセル形の当たり判定。キャラクターの胴体などに使います
- MeshCollider:メッシュの形状をもとにした当たり判定。複雑な地形やオブジェクトに使います
- WheelCollider:車輪用の特殊なCollider。サスペンションやタイヤの摩擦を扱います
最初はBox・Sphere・Capsuleのような単純な形で、見た目に近い当たり判定を作ると扱いやすいです。CapsuleColliderは、上下が平らな円柱ではない点に注意してください。
MeshColliderをIs KinematicがオフのRigidbodyと組み合わせる場合は、Convexをオンにする必要があります。Convexにすると凹みを埋めた凸形状になるため、見た目と当たり判定が変わる場合があります。非ConvexのMeshColliderは、静的なもの、またはKinematicのRigidbodyで使えます。詳しくはUnity公式のMeshColliderの説明を参考にしてください。
Colliderの主なプロパティ
設定できる項目はColliderの種類によって異なります。主な項目は以下のとおりです。
- Center:オブジェクトのローカル座標で、当たり判定の中心位置を調整
- Size:BoxColliderの各軸の大きさを調整
- Radius:SphereColliderの球の半径、CapsuleColliderの丸い部分の半径を調整
- Height:CapsuleColliderの両端の丸い部分を含む全高を調整
- Direction:CapsuleColliderの長い軸の向きをX・Y・Zから選択
- Convex:MeshColliderを凸形状として使用するかを設定
- Is Trigger:通常の衝突に使うか、すり抜ける領域判定に使うかを設定
CapsuleColliderのRadius・Height・Directionについては、Unity公式のプロパティ一覧も確認できます。
Is Triggerの使い方とRigidbodyの条件
Colliderには「Is Trigger」というチェック項目があります。スクリプトから扱うときのプロパティ名はisTriggerです。
- オフ(isTrigger = false):床や壁など、物理的に接触する判定に使う
- オン(isTrigger = true):他のColliderがすり抜ける領域として使い、進入・滞在・退出を検知する
たとえば、床ならオフ、アイテム取得やゴール地点の判定ならオンにします。ただし、Is Triggerを切り替えるだけで、必ずイベントが呼ばれるわけではありません。
イベントが呼ばれる基本条件
- 共通:双方にColliderを用意する
- OnCollision系:双方のIs Triggerをオフにし、少なくとも片方にIs KinematicがオフのRigidbodyを付ける
- OnTrigger系:少なくとも片方のIs Triggerをオンにし、少なくとも片方にRigidbodyを付ける。こちらはIs Kinematicがオンでも使える
Rigidbodyが両方ともない組み合わせや、通常のCollider同士で「Kinematicと静的な壁」「Kinematic同士」の組み合わせでは、OnCollisionEnterは呼ばれません。組み合わせの詳細はUnity公式の衝突イベント一覧で確認できます。
また、Is KinematicがオンのRigidbodyは、力や衝突によって押し戻されません。Is Triggerをオフにしても、スクリプトで指定した移動が壁の前で自動的に止まるわけではないので、通常の物理移動とは分けて考えましょう。
Colliderを用いた衝突判定の実装
物理的に衝突したとき:OnCollisionEnter
物理的な衝突検出(Is Triggerがオフ)のときに使うのが「OnCollisionEnter」です。
今回は2つのCubeを用意して両方にBoxCollider、一方にRigidbodyと「Enemy」タグを付けています。
掲載動画は、2つのCubeを横方向から接触させた例です。ここでは移動用スクリプトを追加せず試せるよう、重力でCubeを落として接触させる手順を紹介します。2つのCubeは親子にせず、それぞれ独立したGameObjectにしてください。
- 動くCube:Box ColliderのIs Triggerはオフ。Rigidbodyを追加し、Is Kinematicはオフ、Use Gravityはオン。タグにEnemyを設定する
- 受け止めるCube:Box ColliderのIs Triggerはオフ。Rigidbodyは付けず、次のColliderCollisionExampleスクリプトを付ける
- 動くCubeを受け止めるCubeの少し上に置き、最初は重ならない状態から再生する。Enemyタグがなければ、InspectorのTagから「Add Tag…」で作成して割り当てる
ファイル名をColliderCollisionExample.csにして保存します。判定するのはスクリプトを付けた自分ではなく、引数で受け取った相手のタグです。
using UnityEngine;
public class ColliderCollisionExample : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
Debug.Log("敵と衝突した!");
}
}
}接触時に、相手のタグがEnemyなら「敵と衝突した!」をConsoleに表示するコードです。OnCollisionEnterの引数はCollisionで、接触点などの衝突情報も受け取れます。
以下は記事で使用している、横方向から接触させた実演動画です。実行してみると、衝突判定がうまくいってますね。
※ Tagの作成やLayerとの違いについては、以下の記事を参考にしてください。
すり抜け判定:OnTriggerEnter・Stay・Exit
すり抜け判定は「OnTriggerEnter」「OnTriggerStay」「OnTriggerExit」を使います。大きいCubeを判定エリアにして、小さいCubeを右方向へ動かしてみましょう。
- 大きいCube:Box ColliderのIs Triggerをオン。Rigidbodyは付けない。位置は(0, 0, 0)、Scaleは(3, 3, 3)にする
- 小さいCube:Box ColliderのIs Triggerはオフ。Rigidbodyを追加し、Is Kinematicをオン、Use Gravityをオフにする。位置は(-4, 0, 0)、Scaleは(1, 1, 1)にする
- 次のColliderTriggerExampleスクリプトを小さいCubeに付ける。どちらのCubeも独立したGameObjectとし、この例ではタグの設定は不要
Unity 6の入力設定について
このサンプルは、元の右矢印キー操作に合わせて旧Input ManagerのInput.GetKeyを使います。Edit → Project Settings → Player → Other Settings → Active Input Handlingで、Input Manager (Old)またはBothが有効なプロジェクトで使用してください。Input System Package (New)だけが有効な場合、そのままでは使えません。
既存のInput Systemを維持しつつ旧入力を併用する場合はBothを選びます。変更時はEditorの再起動が必要です。詳しくはUnity公式の入力設定を確認してください。
ファイル名をColliderTriggerExample.csにして保存します。前のサンプルとはクラス名を分けているので、同じプロジェクトに入れられます。
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class ColliderTriggerExample : MonoBehaviour
{
[SerializeField] private float speed = 5f;
private Rigidbody body;
private bool moveRight;
private void Awake()
{
body = GetComponent<Rigidbody>();
}
private void Update()
{
// 旧Input Managerが有効なプロジェクトで使用します。
moveRight = Input.GetKey(KeyCode.RightArrow);
}
private void FixedUpdate()
{
if (moveRight)
{
body.MovePosition(body.position + Vector3.right * speed * Time.fixedDeltaTime);
}
}
private void OnTriggerEnter(Collider other)
{
Debug.Log(other.name + " が入った!");
}
private void OnTriggerStay(Collider other)
{
Debug.Log(other.name + " が中にいる");
}
private void OnTriggerExit(Collider other)
{
Debug.Log(other.name + " が出た!");
}
}再生後にGameビューをクリックし、右矢印キーを押し続けてください。入力はUpdateで受け取り、移動はFixedUpdate内のRigidbody.MovePositionで行います。このコードは、上で設定したKinematicのRigidbodyを動かすためのものです。
- OnTriggerEnter:相手のColliderと重なり始めたとき
- OnTriggerStay:相手のColliderと重なっている間、物理更新に応じて呼ばれる
- OnTriggerExit:相手のColliderとの重なりがなくなったとき
スクリプトを小さいCubeに付けているため、otherは相手となる大きいCubeのColliderです。Stayのログは繰り返し出るので、動きを確認できたら削除・コメントアウトしておきましょう。なお、OnTriggerStayは描画フレームごとに必ず1回呼ばれるものではありません。
実行してみると、大きいCube内に入ったとき、入っている間、出たときで呼び出されていますね。以下は記事で使用しているすり抜け判定の実演動画です。
掲載動画は元の実演をそのまま残しています。本文のコードは、取り付け先や入力設定を補足し、クラス名とRigidbodyによる移動方法を整理したものです。
Colliderの衝突判定が反応しないときの確認点
コードを書いてもログが出ないときは、次の順番で確認してみてください。
- 3Dと2Dを混ぜていないか:この記事はBoxCollider・Rigidbodyを使います。BoxCollider2D・Rigidbody2Dを使う場合は、OnCollisionEnter2DやOnTriggerEnter2Dなど2D用の関数が必要です
- ColliderとGameObjectが有効か:双方のColliderが有効で、GameObject自体もアクティブか確認。Sceneビューで実際の当たり判定が重なるかも確認します
- Is TriggerとRigidbodyの組み合わせが正しいか:OnCollisionは非KinematicのRigidbodyが少なくとも片方に必要です。OnTriggerならKinematicでも使えます
- Layerで衝突を除外していないか:Edit → Project Settings → PhysicsのLayer Collision Matrixで、双方のLayerが接触できる設定か確認。Collider側のLayer Overridesを変更している場合は、その除外設定も見直します
- スクリプトの取り付け先と引数は合っているか:Collision例は受け止めるCube、Trigger例は小さいCubeに付けます。引数の型はOnCollisionEnterがCollision、OnTriggerEnterがColliderです
- タグの条件で除外されていないか:Enemyタグは名前だけ作るのではなく、相手のGameObjectに割り当てます。今回のTrigger例にタグ条件はありません
Layerの設定方法はUnity公式のLayerベースの衝突判定も参考になります。まずは速度を落とし、単純なBoxCollider同士で確認すると、設定の問題を切り分けやすいです。
Raycastを用いたオブジェクト・距離判定
Colliderを用いたオブジェクトは前項までのような接触判定だけでなく、Rayと呼ばれる見えない線を飛ばして調べることもできます。
Physics.Raycastは「前方に何があるか」「地面までどのくらい離れているか」を調べたいときに便利です。Colliderを対象にした問い合わせなので、Raycastの検出対象にRigidbodyは必須ではありません。具体的なコードや、当たらないときの確認点は以下の記事で解説しています。
まとめ
Colliderは、オブジェクトの当たり判定やイベントのきっかけを作るためのコンポーネントです。まずは形状を合わせ、Is TriggerとRigidbodyの設定を組み合わせて使ってみましょう。
- BoxCollider・SphereCollider・CapsuleColliderなど、用途に合う形状を選ぶ
- 物理的な接触はOnCollision、すり抜ける領域判定はOnTriggerを使う
- OnCollisionには少なくとも片方に非KinematicのRigidbody、OnTriggerには少なくとも片方にRigidbodyが必要
- 反応しないときは、3D/2D、Is Trigger、Rigidbody、Layer、取り付け先を確認する



サイトアイコン-2-150x150.png)