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

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作为全局管理器,把碰撞计数放在这个类中,确保所有物品共享同一个计数:

  1. 修改StartMng类,添加全局计数变量:
public class StartMng : MonoBehaviour
{
    public int totalCollisionCount = 0;

    // 保留原有方法
    public void ActivePanel(int count)
    {
        // 你的面板激活逻辑
    }

    public void StartBtnClick()
    {
        // 你的按钮触发逻辑
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:06:12