Collider
Collider 是包在 GameObject 周围的隐形形状,定义 Unity Physics 的碰撞边界,而不必用 Mesh 的精确几何去计算每一次接触。Box、Sphere、Capsule、Mesh 等形状服务于落地检测、射击命中与关卡交互,是物理模拟、触发区域与玩法脚本依赖的基础设施组件之一。
想象一下...
Collider 就像物体周围的保护泡。角色有成千上万个三角面,游戏不可能逐面检测碰撞——太慢了。Unity 改用简单形状(盒子、球体、胶囊)包住角色。那个泡就是 Collider。你看不见它,但每一次碰撞都通过它“感知”。
概念详解
Collider 是定义 GameObject 在 Unity Physics 中物理形状的组件。
它与 Mesh Renderer 完全分离——物体可以只有 Collider 没有外观(隐藏区域),或只有外观没有 Collider(装饰)。
Unity 主要的四种 3D 类型是 BoxCollider、SphereCollider、
CapsuleCollider 和 MeshCollider。
性能从快到慢:
Sphere → Box → Capsule → Mesh。MeshCollider 精确复制
Mesh,但很贵——只在需要像素级地形或静态道具时使用。移动角色通常选
CapsuleCollider:贴合站立人体,上下楼梯也更顺。
Collider 可切到 Trigger 模式(
isTrigger = true)以检测重叠且不产生物理反力。非 Trigger 时则产生真实接触力。
同一物体或其子物体上挂多个 Collider 就是
Compound Collider——用简单形状近似复杂外形、又不靠 MeshCollider 的常用做法。
从 Unity 6 起,Physics Shapes 2D 与 Physics Material 可直接挂在 Collider 上, 以便按表面控制摩擦和弹性。
Collider 类型
BoxCollider
矩形盒。快,用于墙、地面、箱子。
SphereCollider
球体。最快,用于子弹、水果、圆石。
CapsuleCollider
胶囊体。适合直立角色。
MeshCollider
精确贴合 Mesh。最慢,仅用于静态物体。
Compound Collider
在同一物体或其子物体上组合多个简单 Collider(Box + Sphere…)来近似复杂形状 — 比 MeshCollider 更快,比单个形状更准确。
动手步骤
选对 Collider 类型
Add Component → Physics → 按物体形状选 Box/Sphere/Capsule/MeshCollider。
在 Inspector 中调整大小
点 "Edit Collider"(铅笔图标)在 Scene 视图拖拽,或在 Inspector 改 Center、Size、Radius。
看 Gizmo 颜色
空闲时 Collider 画成绿色,重叠时为红色。在 Scene 视图打开 Gizmos 才能看到。
添加 Physics Material(可选)
Create → Physics Material → 赋给 Collider 的 Material 槽,调节摩擦和弹跳。
用 Layer 配置 Collision Matrix
Project Settings → Physics → Layer Collision Matrix:控制哪些层互相碰撞,跳过不需要的计算。
交互模拟器
选择 Collider 类型并投放形状,观察它们与地面及彼此如何弹开。
代码示例
基础在运行时用脚本读取并调整 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