2D 物理与碰撞:先决定是否真的需要模拟
如果两个相同物品拖到同一个格子就合成,你可以直接按格子数据判断,不一定需要物理。如果小球要受重力滚落、碰撞后反弹,物理引擎就能提供有用的模拟。
三种需求,三种思路
| 需求 | 优先方案 | 原因 |
|---|---|---|
| 棋盘相邻、格子重合、合成条件 | 数据规则与坐标判断 | 结果可控,容易复现 |
| 进入区域触发机关 | 碰撞/触发检测 | 需要知道接触,但不一定需要物理响应 |
| 重力、速度、反弹、摩擦 | 刚体物理模拟 | 需要连续运动与接触响应 |
RigidBody2D 描述物理运动方式,Collider2D 描述形状与接触。2D 和 3D 物理是不同系统,不能把 3D 的 Collider 混进 2D 示例。
最小实验:球落到地面
- 按官方配置启用合适的 2D 物理后端与全局设置。
- 建一个 Ground,添加静态 RigidBody2D 和 BoxCollider2D,形状覆盖地面。
- 建一个 Ball,添加动态 RigidBody2D 和 CircleCollider2D,放在地面上方。
- 调整碰撞分组与矩阵,确保两者允许接触。
- 预览观察落下与停止;打开调试绘制,确认碰撞形状与图像一致。
这只是物理实验,不包含完整接触监听脚本。若要接触事件,按所选后端和组件配置开启监听,使用对应 2D 接触事件;不要根据画面重叠就推断回调一定发生。
常见故障
碰撞体没有随 Sprite 尺寸符合预期、分组矩阵关闭、身体类型选择错误,都会造成“看起来撞了,实际上没撞”。高速小物体还可能穿透,需要检查步长、连续检测等后端能力,而不是盲目把帧率调得更高。
不要同时让物理模拟控制动态刚体,又每帧强行 setPosition 控制同一对象。先确定运动权归物理还是脚本,再选速度、力或位置操作。
验收与 AI 需求
做一个 2D 落球实验,明确物理后端、刚体类型、碰撞体与分组。
球受重力落下停在地面,不做计分与网络。
提供编辑器配置、调试绘制方式,以及穿透和无回调的排查顺序。
不要用 3D API,也不要每帧直接覆盖动态刚体位置。
物理模拟的结果也不能天然作为跨设备严格一致的联网裁决依据。实时联机的确定性与同步问题另见进阶边界。