Unity Term Book
物理

Collider

Collider は GameObject を包む見えない形状で、Mesh の精密幾何を使わずに物理の衝突境界を定義します。Box・Sphere・Capsule・Mesh の選び方、Trigger、複合 Collider を学び、当たり判定を正しく設計できます。図解とシミュレーターで形状差を比べられます。

想像してみてください...

Collider は物体を包む保護の泡のようなものです。何千ポリゴンもあるキャラクターの 三角形すべてを毎回検査するのは遅すぎます。Unity は代わりに単純な形状 (箱・球・カプセル)で包みます。その泡が Collider です。見えませんが、すべての衝突はそれを通して「感じ」ます。

概念の詳細

Collider は GameObject の物理形状を Unity Physics で定義するコンポーネントです。 Mesh Renderer とは完全に独立——見た目なしの Collider(隠しゾーン)も、Collider なしの見た目(装飾)も可能です。 主な 3D タイプは BoxColliderSphereColliderCapsuleColliderMeshCollider です。

性能(速い順): Sphere → Box → Capsule → Mesh。MeshCollider は Mesh を正確にコピーしますが重い—— ピクセル精度の地形や静的小物が必要なときだけ。移動キャラには通常 CapsuleCollider: 立位の体に合い、階段も滑らかに扱えます。

Collider は Trigger モード( isTrigger = true)で、物理応答なしの重なり検知ができます。Trigger でないときは実接触力を生みます。 同一物体や子に複数 Collider を付けるのが Compound Collider — MeshCollider なしで複雑な形を近似する定番です。

Unity 6 以降、Physics Shapes 2DPhysics Material を Collider に直接付け、 表面ごとの摩擦・弾みを制御できます。

Collider の種類

BoxCollider

直方体。速い。壁、床、箱に使う。

SphereCollider

球体。最速。弾、果物、丸い岩に使う。

CapsuleCollider

カプセル。直立キャラに最適。

MeshCollider

Mesh に正確に一致。最遅。静的物のみ。

Compound Collider

同じオブジェクト(または子)に複数の単純 Collider(Box + Sphere…)を組み合わせて複雑な形を近似 — MeshCollider より速く、単一形状より正確。

ハンズオン手順

1

適切な Collider タイプを選ぶ

Add Component → Physics → 物体の形に合わせて Box/Sphere/Capsule/MeshCollider を選びます。

2

Inspector でサイズを調整

"Edit Collider"(鉛筆アイコン)で Scene ビューをドラッグするか、Inspector で Center、Size、Radius を変更します。

3

Gizmo の色を確認

Collider は待機時に緑、重なり中は赤で描画されます。Scene ビューで Gizmos をオンにしてください。

4

Physics Material を追加(任意)

Create → Physics Material → Collider の Material スロットに割り当て、摩擦と弾みを調整します。

5

Layer で Collision Matrix を設定

Project Settings → Physics → Layer Collision Matrix:どの層が衝突するかを制御し、不要な計算を省きます。

インタラクティブシミュレーター

Collider タイプを選び形状を落として、地面や互いとの弾み方を観察しましょう。

SHAPE:
形状を選んで「ドロップ」を押す

コード例

基本

実行時にスクリプトで Collider を読み取り・調整する。

using UnityEngine;

public class ColliderExample : MonoBehaviour
{
  void Start()
  {
      // Get the Collider on this object
      Collider col = GetComponent<Collider>();

      // Inspect the Collider's world bounds
      Debug.Log("Size: " + col.bounds.size);
      Debug.Log("Center: " + col.bounds.center);

      // Enable / disable the Collider
      col.enabled = false; // Temporarily ignore collisions
      col.enabled = true;

      // Resize a BoxCollider specifically
      BoxCollider box = GetComponent<BoxCollider>();
      if (box != null)
          box.size = new Vector3(2f, 1f, 2f);
  }
}

コード例

上級

OverlapBox で箱内の物体を検出——Rigidbody 不要。

using UnityEngine;

// Find every body inside a box without a physical collision
public class AreaDetector : MonoBehaviour
{
  public Vector3 detectionSize = new Vector3(5f, 5f, 5f);
  public LayerMask targetLayer;

  void Update()
  {
      // OverlapBox: all Colliders in the box, no Rigidbody needed
      Collider[] hits = Physics.OverlapBox(
          transform.position,
          detectionSize / 2f,
          transform.rotation,
          targetLayer
      );

      foreach (Collider hit in hits)
      {
          Debug.Log("Detected: " + hit.name);
      }
  }

  // Draw the detection volume in the Scene view
  void OnDrawGizmosSelected()
  {
      Gizmos.color = new Color(0.2f, 1f, 0.2f, 0.3f);
      Gizmos.DrawCube(transform.position, detectionSize);
      Gizmos.color = new Color(0.2f, 1f, 0.2f, 1f);
      Gizmos.DrawWireCube(transform.position, detectionSize);
  }
}

📌 要点

  • Sphere が最速;Mesh が最も正確で最遅
  • 人型キャラの定番は CapsuleCollider
  • Compound = MeshCollider の代わりに複数の primitive
  • isTrigger=true → 接触力なしで検知
  • Layer Collision Matrix が誰と誰が当たるかを制御

⚠️ よくあるミス

  • ❌ 移動体に Convex=false の MeshCollider

    非凸 MeshCollider は Dynamic Rigidbody と組めない——Unity がエラー

    ✅ Convex を有効にするか、Compound Collider を使う

  • ❌ 見た目のメッシュよりずっと小さい Collider

    弾が外れたように見えても当たる——不公平に感じる

    ✅ Gizmos をオンにして Collider サイズをメッシュに合わせる