3. 碰撞器基础:Box Collider、Sphere Collider、Capsule Collider、Mesh Collider
碰撞器,说白了就是给游戏对象一个「物理体积」。没有它,物体之间就穿模而过,毫无物理可言。Unity 提供了好几种碰撞器,每种都有自己擅长的场景。今天我就把这四种最常用的——Box、Sphere、Capsule 和 Mesh Collider——给你讲透。
3.1 Box Collider:最通用的方盒子
Box Collider 是我用得最多的碰撞器。它就是一个长方体,适合墙壁、地板、箱子、平台这类规则物体。
核心参数:
- Center:碰撞盒的中心偏移。默认在物体本地坐标原点。
- Size:长宽高。单位是米(Unity 默认单位)。
- Is Trigger:勾选后变成触发器,不再产生物理碰撞,只触发事件。
重要提示:Box Collider 的 Size 是相对于物体本地坐标系的。如果物体有旋转,碰撞盒也会跟着转。
我在项目中遇到过一个问题:一个门框用了 Box Collider,但门框是斜着放的。结果角色走到门框边缘时,总是被「空气墙」挡住。后来发现是 Size 没调好,碰撞盒比门框大了一圈。嗯,调小 0.1 单位就解决了。
3.2 Sphere Collider:球形的优雅
Sphere Collider 就是一个球体。它只有一个半径参数,计算效率极高。适合子弹、足球、炸弹爆炸范围、角色碰撞(尤其是俯视角游戏)。
为什么它快?
球体碰撞检测只需要算两个球心距离,再和半径之和比较。没有角度、没有旋转,纯数学运算。你想想看,CPU 做这个几乎不花时间。
我的习惯:在不需要精确碰撞的地方,尽量用 Sphere Collider 代替 Box Collider。比如角色脚下的检测区域,用球体比用盒子更平滑,不容易卡边角。
我曾经做过一个足球游戏,一开始用 Mesh Collider 做足球碰撞,结果性能惨不忍睹。换成 Sphere Collider 后,帧率直接翻倍。说白了,能用简单形状就别用复杂形状。
3.3 Capsule Collider:人形角色的标配
Capsule Collider 是一个胶囊体——圆柱两头加半球。它专门为角色碰撞而生。为什么?因为人的身体大致就是这种形状:直立时是圆柱,弯腰时两头圆润。
参数说明:
| 参数 | 作用 |
|---|---|
| Height | 胶囊总高度(含半球) |
| Radius | 圆柱半径和半球半径 |
| Direction | 胶囊朝向:X-Axis / Y-Axis / Z-Axis |
注意:Direction 决定了胶囊的「站立方向」。人形角色一般用 Y-Axis。如果你把 Direction 设成 X-Axis,角色就变成横着走了——嗯,除非你做的是横版爬行游戏。
我建议角色控制器用 Capsule Collider 而不是 Box Collider。为什么?因为盒子有棱角,角色在楼梯上走时会被卡住。胶囊体是圆的,上下楼梯顺滑得多。我曾经接手过一个项目,角色用 Box Collider 做碰撞,结果玩家在楼梯上疯狂抖动……换成胶囊体后,世界清净了。
3.4 Mesh Collider:精确但昂贵
Mesh Collider 直接使用模型的网格作为碰撞体。它能做到「完全贴合模型表面」,但代价是性能开销巨大。
什么时候用?
- 地形、岩石、雕像等不规则物体
- 需要精确碰撞的装饰物(比如栏杆、柱子)
- 静态物体(不移动、不旋转)
什么时候别用?
- 动态物体(移动的物体用 Mesh Collider 会严重拖慢物理引擎)
- 角色、子弹、可交互物品
- 大量重复物体(比如一堆碎石)
性能真相:Mesh Collider 的碰撞检测复杂度是 O(n),n 是网格顶点数。一个 1000 顶点的模型,碰撞计算量是 Box Collider 的几十倍。所以,能用基本碰撞器就别用 Mesh Collider。
我记得有一次做开放世界项目,场景里放了几百个岩石,每个都用 Mesh Collider。结果物理帧率掉到 10 FPS。后来我把所有岩石的碰撞器换成多个 Box Collider 组合(用空物体挂载),性能直接拉回 60 FPS。你想想看,一个岩石模型有 2000 个顶点,几百个就是几十万顶点在算碰撞——CPU 不炸才怪。
3.5 碰撞器的组合使用
实际项目中,很少只用一种碰撞器。我常用的策略是:
- 主体用基本碰撞器:角色用 Capsule,墙壁用 Box,子弹用 Sphere。
- 细节用 Mesh Collider:只有那些必须精确碰撞的静态物体才用。
- 复合碰撞体:一个物体挂多个碰撞器。比如一辆车,车身用 Box Collider,车轮用 Sphere Collider。
代码示例:动态添加碰撞器
// 给物体添加 Box Collider
GameObject obj = new GameObject("MyBox");
BoxCollider box = obj.AddComponent<BoxCollider>();
box.size = new Vector3(2, 1, 0.5f);
box.center = new Vector3(0, 0.5f, 0);
// 添加 Sphere Collider 作为触发器
SphereCollider sphere = obj.AddComponent<SphereCollider>();
sphere.radius = 1.5f;
sphere.isTrigger = true;
小技巧:在 Inspector 里,你可以按住 Shift 键拖动碰撞器的绿色控制点,这样能同时调整 Size 和 Center。嗯,这个快捷键很多人不知道。
3.6 避坑指南
我踩过的坑,你最好别踩:
- Mesh Collider 不能和刚体一起移动:如果你给一个移动的物体挂 Mesh Collider,物理引擎会崩溃。必须用基本碰撞器。
- 碰撞器不要重叠太多:两个碰撞器重叠时,物理引擎会不断尝试推开它们,导致抖动。尤其是 Box Collider 和 Mesh Collider 重叠,性能灾难。
- 触发器不影响物理:勾了 Is Trigger 的碰撞器,不会产生碰撞力。角色可以穿过去,但会触发 OnTriggerEnter 事件。这个很多人搞混。
- Scale 会影响碰撞器:如果你把物体的 Scale 设成 (2, 2, 2),Box Collider 的 Size 也会翻倍。但 Mesh Collider 不会——它始终使用原始网格数据。嗯,这个坑我花了一下午才找到原因。
最后说一句:碰撞器的选择,本质是「精度 vs 性能」的权衡。别追求完美贴合,够用就行。玩家不会在意一个箱子角是不是圆了一点点,但他们会注意到游戏卡顿。