资讯动态

从圆到碰撞:游戏物理的入门真相

发布时间:2026/10/17 1:42:58 来源:尧图企业网站定制
一、碰撞检测要回答什么问题游戏里每一帧都要问一句“这两个东西碰到了没有”比如子弹打中敌人没有玩家踩到地面没有角色撞到墙没有玩家走进宝箱的范围没有碰到之后要做什么扣血、停下、弹开、播放音效那是碰撞响应是另一件事。碰撞检测只负责回答碰到了吗二、最简单的两种方法游戏里大部分物体其实都可以用圆或者方框来近似。1. 圆和圆看距离两个圆圆心之间的距离 ≤ 两个半径加起来就碰到了。没碰到 碰到了 ( A ) ( B ) ( A )( B ) ←── 距离 ──→ 距离 ≤ 半径和例子A 圆心 (0, 0)半径 1B 圆心 (3, 0)半径 1距离 3半径和 23 2 →没碰到boolHit(Vector2a,floatra,Vector2b,floatrb){returnVector2.Distance(a,b)rarb;}适合子弹、球、角色的大致范围。2. 方框和方框看左右、看上下两个不旋转的方框叫AABB要同时满足左右方向有重叠上下方向有重叠只要有一个方向分开了就没碰到。左右重叠上下也重叠 → 碰到 左右重叠但上下分开 → 没碰到 ┌────┐ ┌────┐ │ A ┌┼───┐ │ A │ └────┼┘ B │ └────┘ └────┘ ┌────┐ │ B │ └────┘boolHit(Recta,Rectb){bool左右重叠a.xMinb.xMaxa.xMaxb.xMin;bool上下重叠a.yMinb.yMaxa.yMaxb.yMin;return左右重叠上下重叠;}适合平台跳跃游戏、俯视角游戏里的墙、地块、箱子。很多 2D 小游戏只用这两种方法就够了。三、东西多了怎么办先粗筛再细查假如场景里有 1000 个物体两两检测就是约 50 万次太慢。所以真实的游戏都分两步阶段做什么比喻粗检测快速排除明显离得很远的物体先看是不是在同一个房间细检测对靠得近的物体精确判断碰没碰到再看是不是真的撞上了粗检测常用的方法把地图划成格子只检测同一个格子里的物体。┌────┬────┬────┐ │ ● │ │ │ │ ● │ │ ● │ 只有左上格子里的两个点需要互相检测 ├────┼────┼────┤ │ │ ● │ │ └────┴────┴────┘四、形状复杂了怎么办如果物体是旋转的方框、三角形、多边形圆和 AABB 的方法就不够用了。这时候才需要更高级的方法方法一句话SAT分离轴找一个方向如果在这个方向上两个形状分开了就没碰到GJK前面讲的那个用 Support 函数能处理任意凸形状前面卡住的地方其实属于**“进阶内容”**。不先掌握圆和方框直接看 GJK 当然会很难。五、游戏里常见的碰撞问题问题现象常见解决办法穿墙子弹太快一帧就跳过了墙检测移动路线而不是只看位置射线检测卡墙 / 抖动角色贴着墙一直抖碰撞后把角色推出来一点太慢物体多了掉帧先粗检测用格子划分六、如果你用 UnityUnity 已经帮你做好了大部分工作你只需要给物体加ColliderBoxCollider2D、CircleCollider2D 等至少一方加Rigidbody2D写回调函数voidOnCollisionEnter2D(Collision2Dother){Debug.Log(撞到了other.gameObject.name);}GJK、SAT 这些引擎内部已经实现了平时做游戏不需要自己写。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑