You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动