Unity制作Flappy Bird克隆版:玩家与墙体碰撞失效问题求助
解决Flappy Bird克隆版的碰撞检测问题
先给你揪出脚本里的致命问题,再讲组件设置的关键注意事项:
1. 脚本核心错误修正
你的Obstacle脚本犯了两个2D碰撞的基础错误,直接改这几点:
- 2D游戏必须用**
OnCollisionEnter2D**(带2D后缀的回调函数),OnCollisionEnter是给3D物体用的,根本不会触发2D碰撞逻辑 - 标签判断完全搞反了:你现在检测碰撞体标签为
Obstacle,但实际应该检测玩家的标签(比如给玩家设Player标签),因为墙体是障碍物,碰撞的对象是玩家 - 补充:墙体应该向左移动,所以速度要加负号,不然墙会往右跑碰不到玩家
修正后的完整脚本:
using UnityEngine; public class Obstacle : MonoBehaviour { public Rigidbody2D rb; public float Speed = 10f; void Update() { // 用velocity更规范,linearVelocity是旧API,建议替换 rb.velocity = new Vector2(-Speed, rb.velocity.y); } // 2D版本的碰撞回调函数 void OnCollisionEnter2D(Collision2D collisionInfo) { // 检测碰撞对象是玩家(确保玩家对象标签设为Player) if(collisionInfo.collider.tag == "Player") { FindObjectOfType<GameManager>().EndGame(); // 可以先加Debug.Log测试:Debug.Log("碰撞触发!"); } } }
2. 组件设置必查项
从你描述的组件情况,必须确认这几点:
- 玩家对象:要有
Rigidbody2D(设为Dynamic,开启重力)+Collider2D(比如CircleCollider2D,不要勾选Is Trigger),并且标签设为Player - 墙体对象:要有
Collider2D(比如BoxCollider2D,不要勾选Is Trigger),Rigidbody2D设为Kinematic(运动学刚体,不受重力影响,不用调质量,代码控制移动更稳定),标签设为Obstacle - 不用给墙体设大质量,用Kinematic刚体完全能解决下落问题,还不会干扰碰撞检测
3. 快速排查步骤
如果还是没触发碰撞,按这个顺序查:
- 运行游戏时,选中墙体/玩家,看Scene视图里的碰撞体轮廓是否正确(有没有偏移或没覆盖模型)
- 打开Unity的
Window > Analysis > Physics 2D Debugger,实时查看碰撞体的触发状态 - 先在碰撞判断里加
Debug.Log("碰撞触发了"),看控制台有没有输出,排查是碰撞没触发还是EndGame()方法的问题
内容的提问来源于stack exchange,提问作者Mulankunas




