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
相关产品推荐
相关产品推荐

