3D版Flappy Bird移动端游戏:刚体与非刚体碰撞穿模问题求助
移动端3D Flappy Bird玩家穿地面问题解决
问题现象
制作移动端3D版Flappy Bird类游戏时,玩家对象出现穿模穿过地面的问题。已尝试将Rigidbody碰撞模式从Discrete改为Continuous Dynamic,问题未解决。该问题在Unity 2021 LTS版本就存在,升级后仍未修复,且即使地面不移动时也会出现。
相关截图
- 穿模现象:

- 玩家Rigidbody设置:

核心代码
- 玩家跳跃逻辑:
rigidBody.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
- 地面移动逻辑:
transform.Translate(Vector3.left * GameManager.Instance.platformSpeed * Time.deltaTime);
排查与解决思路
1. 校验碰撞体配置
确保玩家和地面的碰撞体完全覆盖模型:
- 玩家使用CapsuleCollider/BoxCollider时,调整尺寸和位置,避免碰撞体偏移或过小;
- 地面碰撞体设置足够厚度,防止因碰撞体过薄导致穿模。
2. 优化Rigidbody参数
- 开启Interpolate:将玩家Rigidbody的Interpolate设置为
Interpolate或Extrapolate,平滑运动轨迹减少穿模; - 匹配碰撞检测模式:若玩家用Continuous Dynamic,给地面Rigidbody(如果有)设置为Continuous,确保双方都启用连续碰撞检测;
- 调低Sleep Threshold:将该值设为0.001左右,避免玩家落地过早进入休眠状态导致碰撞失效。
3. 改用物理引擎驱动地面移动
地面用transform.Translate属于直接修改位置,会绕过物理碰撞逻辑,建议给地面添加Rigidbody并设置为Kinematic,通过速度控制移动:
rigidbody.velocity = Vector3.left * GameManager.Instance.platformSpeed;
4. 调整物理时间步长
在Edit > Project Settings > Time中:
- 调小Fixed Timestep(比如从0.02改为0.01),提升物理检测频率;
- 适当调高Maximum Allowed Timestep,避免卡顿导致的碰撞丢失。
5. 添加穿透修正逻辑
在玩家脚本中,每帧检测是否穿透地面并手动修正:
private void FixedUpdate() { if (Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 1f)) { if (hit.collider.CompareTag("Ground")) { transform.position = new Vector3(transform.position.x, hit.point.y + GetComponent<Collider>().bounds.extents.y, transform.position.z); rigidbody.velocity = Vector3.zero; } } }
6. 检查Layer碰撞矩阵
在Edit > Project Settings > Physics中,确认玩家和地面所在Layer的碰撞交互是勾选状态,避免Layer设置错误导致碰撞失效。
内容的提问来源于stack exchange,提问作者Obscure021
相关产品推荐
相关产品推荐

