第4章:物理引擎的「幽灵墙」——碰撞体设置不当,角色穿模或卡死
做场景搭建最让人抓狂的事是什么?
我个人觉得,不是模型太丑,也不是贴图太糊。而是——角色走着走着,突然穿墙了。或者更惨,卡在墙角里动弹不得。
嗯,这就是我们今天要聊的「幽灵墙」问题。说白了,就是碰撞体设置没做好,物理引擎跟你开了个玩笑。
4.1 什么是「幽灵墙」?
先说说我自己的经历。几年前做一个小型开放世界项目,角色在野外跑得好好的,一到城门口就「嗖」一下穿进城墙里。测试组笑称这是「穿模遁地术」。
为什么会这样?
物理引擎处理碰撞,靠的是碰撞体(Collider)。碰撞体就像一层看不见的「皮肤」,包裹在模型外面。如果这层皮肤没包好,或者包错了地方,引擎就会误判——该撞的地方没撞,不该撞的地方反而卡住了。
核心概念:幽灵墙 = 碰撞体与实际模型不匹配导致的物理异常现象。表现为角色穿模、卡死、抖动等。
4.2 最常见的三种「幽灵墙」场景
我在项目中遇到过三种典型情况,你八成也碰到过:
| 类型 | 表现 | 原因 |
|---|---|---|
| 穿模型 | 角色直接穿过墙壁/地面 | 碰撞体缺失或尺寸过小 |
| 卡死型 | 角色卡在墙角或门框里 | 碰撞体重叠或形状不匹配 |
| 抖动型 | 角色在某个位置不停抖动 | 碰撞体与刚体参数冲突 |
4.3 避坑指南:我曾经踩过的坑
坑一:用Box Collider包圆所有物体
我曾经图省事,给所有物体都挂上Box Collider。结果一个圆柱形石柱,角色走到侧面直接「吸」进去了。为什么?Box Collider是方的,圆柱是圆的,四个角全是空的。
我的建议:根据物体形状选碰撞体。圆柱用Capsule Collider,复杂地形用Mesh Collider。别偷懒,偷懒的代价是后期改到哭。
坑二:碰撞体尺寸调得「刚刚好」
你想想看,模型边缘和碰撞体边缘完全贴合,是不是很完美?错!物理引擎计算有精度误差,稍微一抖动,角色就「挤」出去了。
警告:碰撞体一定要比模型稍微大一圈(约1-2%)。别小看这点余量,它能救你命。
坑三:多层碰撞体叠在一起
有一次做室内场景,地板、地毯、装饰线脚各挂了一个碰撞体。角色走上去,物理引擎不知道该听谁的,直接卡在原地疯狂抖动。嗯,这就是典型的「碰撞体打架」。
4.4 核心逻辑:碰撞体设置的正确流程
下面这张图是我自己总结的,每次做场景都会过一遍:
说白了,就三步:看形状 → 选类型 → 调余量。别跳步骤,跳一步后面全是坑。
4.5 实战代码:Unity中的碰撞体设置
拿Unity举例,这是我最常用的设置方式:
// 给角色添加碰撞体
void SetupPlayerCollider()
{
// 我习惯用Capsule Collider做人形角色
CapsuleCollider collider = gameObject.AddComponent<CapsuleCollider>();
// 高度略高于模型,半径略宽
collider.height = 1.8f; // 模型高1.75,留0.05余量
collider.radius = 0.35f; // 模型宽0.3,留0.05余量
// 中心点稍微下移,让脚底贴地
collider.center = new Vector3(0, 0.9f, 0);
Debug.Log("碰撞体设置完成,记得跑一遍测试!");
}
小技巧:设置完碰撞体后,打开物理调试视图(Physics Debugger),用线框模式看一遍。绿色线框是正常,红色就是有问题。我每次必做这步,省了无数回头改bug的时间。
4.6 常见问题速查表
| 问题现象 | 可能原因 | 快速解决 |
|---|---|---|
| 角色穿墙 | 碰撞体缺失或太小 | 添加/放大碰撞体 |
| 角色卡住 | 碰撞体重叠 | 检查并移除多余碰撞体 |
| 角色抖动 | 刚体参数冲突 | 检查Mass和Drag值 |
| 角色浮空 | 碰撞体中心偏移 | 调整Center Y值 |
4.7 最后说两句
幽灵墙这个问题,说大不大,说小不小。但一旦出现,玩家体验直接归零。你想想看,一个精心搭建的场景,结果角色穿模了,前面所有努力都白费。
我个人习惯是:每搭建完一个区域,立刻跑一遍物理测试。别等到全场景做完再测,那时候改起来成本太高了。
嗯,今天就聊到这儿。记住一句话:碰撞体不是「有就行」,而是「对才行」。
核心总结:选对类型 → 留足余量 → 及时测试。三步走,幽灵墙不再有。