You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中OnCollisionEnter2D未触发,如何使其正常工作?

问题解决:鸟与云碰撞不触发碰撞检测的原因及修复方案

核心问题分析

你的代码存在两个关键问题导致碰撞检测失效:Unity消息函数大小写错误,以及直接修改Transform位置绕过物理引擎。


1. 修复碰撞回调函数的大小写错误

Unity的物理消息函数严格区分大小写,你鸟脚本中的onCollisionEnter2D首字母小写,Unity无法识别该函数,因此碰撞发生时不会执行销毁逻辑。

修改后的鸟脚本碰撞部分代码:

private void OnCollisionEnter2D(Collision2D collision) 
{
    if (collision.gameObject.tag == "cloud")
    {
        Destroy(gameObject);
    }
}

2. 改用Rigidbody2D控制移动(而非直接修改Transform)

直接使用transform.Translate修改物体位置会绕过Unity物理引擎的碰撞逻辑,导致碰撞回调无法正常触发。对于带Rigidbody2D的物体,必须通过刚体属性控制移动。

修改鸟的移动代码:

public float jumpForce = 5f;      
public float gravity = -9.81f;
public GameObject gus;
public Transform rotation_checker;
public Transform chekced;

private Rigidbody2D rb;
float velocity;

void Start()
{
    rb = GetComponent<Rigidbody2D>();
    // 关闭内置重力,因为你自定义了重力逻辑
    rb.gravityScale = 0;
}

void Update()
{
    gameObject.transform.eulerAngles = new Vector2(0, 0);
    velocity += gravity * Time.deltaTime;
    
    if (Input.GetKeyDown(KeyCode.W))
    {
        velocity = jumpForce;
    }
    
    rotation_checker.position = chekced.position;
    // 通过刚体velocity控制垂直移动
    rb.velocity = new Vector2(0, velocity);
}

private void OnTriggerExit2D(Collider2D collider) 
{
    Debug.Log(collider.gameObject);
    if(collider.gameObject.name == "skybluscene")
    {
        Destroy(gameObject);
    }
}

private void OnCollisionEnter2D(Collision2D collision) 
{
    if (collision.gameObject.tag == "cloud")
    {
        Destroy(gameObject);
    }
}

修改云的移动代码:

private Rigidbody2D rb;
float x = -4f;

void Start()
{
    rb = GetComponent<Rigidbody2D>();
    // 关闭云的内置重力
    rb.gravityScale = 0;
}

void Update()
{
    // 通过刚体velocity控制水平移动
    rb.velocity = new Vector2(x, rb.velocity.y);
}

void OnTriggerExit2D(Collider2D collider) 
{
    if (collider.gameObject.tag == "scene")
    {
        Destroy(gameObject);
    }
}

3. 最后检查Collider2D设置

确保鸟和云的Collider2D组件:

  • 未勾选Is Trigger:因为你使用的是OnCollisionEnter2D碰撞回调,若勾选Is Trigger则需要改用OnTriggerEnter2D。
  • Collider形状与大小匹配物体可视范围,避免碰撞区域偏移。
  • Rigidbody2D的Body Type保持为Dynamic。

内容的提问来源于stack exchange,提问作者Kortay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:05:31