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

Unity3D OnCollisionEnter触发异常:射击1次无法销毁Cube需2次触发

Unity碰撞回调偶发不触发问题解决方案

首先确认OnCollisionEnter触发的必要条件

Unity中该回调正常触发必须同时满足以下要求,任意一项不满足都会出现碰撞漏检:

  • 碰撞双方都挂载Collider组件,且均未勾选Is Trigger属性
  • 碰撞双方中至少有一方挂载了非运动学(Is Kinematic为false)的Rigidbody组件
  • 双方所属层级在项目Physics设置中没有被屏蔽碰撞关系

「需射击两次才销毁Cube」的常见排查方案

  1. 高速子弹穿模漏检
    子弹飞行速度过快时,默认的离散碰撞检测模式会出现帧间隔内子弹直接穿过Cube的情况,第一次射击未触发碰撞回调,第二次射击刚好落在检测帧范围内才触发。
    解决方案:选中子弹的Rigidbody组件,将Collision Detection属性修改为Continuous或Continuous Dynamic,即可解决高速物体穿模漏检问题。
  2. 刚体属性配置错误
    如果Cube仅挂载Collider未挂载Rigidbody,属于静态碰撞体,仅会和带非运动学刚体的物体触发碰撞回调。若你的子弹勾选了Rigidbody的Is Kinematic选项,运动学刚体碰静态Cube不会触发OnCollisionEnter。
    解决方案:给Cube挂载Rigidbody组件,根据需求勾选Is Kinematic即可;或者取消子弹Rigidbody的Is Kinematic勾选。
  3. 对象名称匹配误差
    若场景中Cube的名称不是完全匹配"Cube"(比如带空格、大小写不同、有Cube(1)这类编号后缀),第一次碰撞命中时条件判断不通过,第二次才命中名称完全匹配的对象。
    解决方案:改用Tag做匹配判断,给Cube设置自定义Tag如Destroyable,将碰撞条件改为if (collision.gameObject.CompareTag("Destroyable")),匹配精度更高也更易维护。
  4. 碰撞对象识别错误
    你现有代码仅打印了子弹自身名称,无法确认碰撞到的对象是什么,可能第一次射击触发了和其他物体的碰撞,没有命中Cube的判断逻辑。
    解决方案:在OnCollisionEnter第一行添加调试代码Debug.Log("碰撞对象:" + collision.gameObject.name);,运行时查看控制台输出,就能快速确认第一次射击是否触发碰撞、碰撞到的对象是什么。
  5. 子弹自碰撞干扰
    如果子弹挂载了多个碰撞体或者子物体带碰撞体,第一次回调可能是子弹自身碰撞体触发,未命中Cube判断条件。
    解决方案:给子弹单独设置一个层级,在项目Physics设置中取消该层级的自碰撞规则,或者碰撞判断前先通过层级过滤无效碰撞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:03