Unity Term Book
物理

Collider

Collider 是包在 GameObject 周围的隐形形状,定义 Unity Physics 的碰撞边界,而不必用 Mesh 的精确几何去计算每一次接触。Box、Sphere、Capsule、Mesh 等形状服务于落地检测、射击命中与关卡交互,是物理模拟、触发区域与玩法脚本依赖的基础设施组件之一。

想象一下...

Collider 就像物体周围的保护泡。角色有成千上万个三角面,游戏不可能逐面检测碰撞——太慢了。Unity 改用简单形状(盒子、球体、胶囊)包住角色。那个泡就是 Collider。你看不见它,但每一次碰撞都通过它“感知”。

概念详解

Collider 是定义 GameObject 在 Unity Physics 中物理形状的组件。 它与 Mesh Renderer 完全分离——物体可以只有 Collider 没有外观(隐藏区域),或只有外观没有 Collider(装饰)。 Unity 主要的四种 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 = 多个基本体 Collider,代替 MeshCollider
  • isTrigger=true → 检测但不产生接触力
  • Layer Collision Matrix 控制谁撞谁

⚠️ 常见错误

  • ❌ 移动刚体上用 Convex=false 的 MeshCollider

    非凸 MeshCollider 无法与 Dynamic Rigidbody 配对——Unity 报错

    ✅ 启用 Convex,或改用 Compound Collider

  • ❌ Collider 远小于可见 Mesh

    玩家看见子弹擦过却仍受伤——手感不公

    ✅ 打开 Gizmos,让 Collider 大小贴合 Mesh