Unity OnCollisionEnter2D中变量仅自增一次、Destroy运行正常问题求助
问题原因
最核心的问题是你当前声明的res是实例成员变量:
- 这个脚本挂载在每一个会和敌人碰撞的对象(比如子弹、玩家碰撞判定体等)上,每个对象实例都会持有独立的
res副本,初始值默认为0 - 碰撞触发后你调用了
Destroy(gameObject)直接销毁了当前对象,当前实例的res副本也会跟着被销毁。下一次触发碰撞的是新的同类型对象,它持有的res还是初始0,自增后只显示1,看起来就像只递增了一次。
修复方案
你可以任选以下一种方式解决:
- 把
res改为静态成员变量,所有同类型脚本实例共用同一个值:
// 变量声明处加static修饰 public static int res;
注意:静态变量的值不会随场景切换自动重置,重新开始游戏时需要手动给
res赋值为0,否则会保留上一次游戏的累计值。
- 把计数变量存到全局单例管理类中,避免和单次碰撞的实例生命周期绑定:
// 假设你有全局管理类GameManager的单例 private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.CompareTag("enemy") ) { GameManager.Instance.res++; Destroy(gameObject); Debug.Log(GameManager.Instance.res); } }
其他排查方向
如果调整变量后依然有问题,可以检查两项配置:
- 敌人对象是否在单次碰撞后就被销毁,不会触发后续碰撞
- 当前对象的Rigidbody2D是否开启了碰撞后休眠的相关配置
内容的提问来源于stack exchange,提问作者maxel
相关产品推荐
相关产品推荐

