Unity中collisionCount无法递增始终为1的问题求助
问题:碰撞计数无法递增,始终显示为1
我希望累计collisionCount,当碰撞达到3次时调出按钮,但当前collisionCount无法正常递增,始终显示为1,预期它能依次递增为1、2、3,请求修复方法。
现有代码:
public class ItemPickUp : MonoBehaviour { GameObject player; private StartMng mng; int collisionCount = 0; // Start is called before the first frame update void Start() { this.player = GameObject.Find("player"); mng = FindAnyObjectByType<StartMng>(); } // Update is called once per frame void Update() { } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject == player) { collisionCount++; Debug.Log($"충돌 횟수: {collisionCount}"); Destroy(gameObject); mng.ActivePanel(collisionCount); if (collisionCount == 3) { mng.StartBtnClick(); } } } }
问题原因
每个ItemPickUp实例都有独立的collisionCount变量,且碰撞后你立即调用Destroy(gameObject)销毁了当前物品对象:
- 第一个物品碰撞后,计数变为1,随后自身被销毁
- 第二个物品是全新实例,计数从0开始递增到1,同样被销毁
- 第三个物品重复上述逻辑,永远无法达到3次计数
解决方案
方案1:将计数移至全局管理类(推荐)
利用已有的StartMng作为全局管理器,把碰撞计数放在这个类中,确保所有物品共享同一个计数:
- 修改
StartMng类,添加全局计数变量:
public class StartMng : MonoBehaviour { public int totalCollisionCount = 0; // 保留原有方法 public void ActivePanel(int count) { // 你的面板激活逻辑 } public void StartBtnClick() { // 你的按钮触发逻辑 } }
- 修改
ItemPickUp类,使用全局计数:
public class ItemPickUp : MonoBehaviour { GameObject player; private StartMng mng; void Start() { this.player = GameObject.Find("player"); mng = FindAnyObjectByType<StartMng>(); } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject == player) { mng.totalCollisionCount++; int currentCount = mng.totalCollisionCount; Debug.Log($"충돌 횟수: {currentCount}"); Destroy(gameObject); mng.ActivePanel(currentCount); if (currentCount == 3) { mng.StartBtnClick(); } } } }
方案2:使用静态变量共享计数(适合简单场景)
如果不想修改StartMng,可以将collisionCount改为静态变量,让所有ItemPickUp实例共享该值:
public class ItemPickUp : MonoBehaviour { GameObject player; private StartMng mng; static int collisionCount = 0; void Start() { this.player = GameObject.Find("player"); mng = FindAnyObjectByType<StartMng>(); } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject == player) { collisionCount++; Debug.Log($"충돌 횟수: {collisionCount}"); Destroy(gameObject); mng.ActivePanel(collisionCount); if (collisionCount == 3) { mng.StartBtnClick(); // 如需重置计数,可在此添加 collisionCount = 0; } } } }
内容的提问来源于stack exchange,提问作者jin ichi
相关产品推荐
相关产品推荐

