【问题标题】:Coin count display display different amount - Unity 2D game硬币计数显示显示不同数量 - Unity 2D游戏
【发布时间】:2019-07-31 05:31:16
【问题描述】:

我正在使用 unity 创建一个 2D 汽车游戏。基本思路是在玩家收集硬币时添加硬币计数并在游戏结束菜单中显示收集到的硬币。在我的 CoinCount 脚本中,在 OnTriggerEnter2D 中,我将硬币值添加到当前收集的硬币中。但是当游戏结束时,它有时会显示正确的答案,有时它会为收集的值添加 2 个或更多值。

//CoinCount script
void OnTriggerEnter2D(Collider2D colInfo)
{
    int inc = 0;
    if (colInfo.gameObject.CompareTag("Coin"))
    {
        inc = 5;
        coinCount += inc;
        print("coinCount" + coinCount);
        AudioManager.instance.PlaySound("Coin");
    }

    currentBalance += inc;
    PlayerPrefs.SetInt("CoinCount", currentBalance);
    PlayerPrefs.Save();
}

我尝试维护一个公共类来管理硬币,但它会给出相同的结果。例如,如果我收集了 5 个价值为 5 的硬币,它应该显示 25 作为总硬币数。有时是 30 和 35。

  public class GameScoreManager : MonoBehaviour
    {
        public static int value;
        public Text currentScoreText;

        // Start is called before the first frame update
        void Start()
        {
            value = 0;
        }

        // Update is called once per frame
        void Update()
        {
            currentScoreText.text = "$" + value.ToString();
            print("Game coin count" + value);
        }
    }

这是我创建 GameScoreManager 类后的 CoinCount 脚本。

void OnTriggerEnter2D(Collider2D colInfo)
    {
        if (colInfo.gameObject.CompareTag("Coin"))
        {
            GameScoreManager.value += scoreValue;
        }
    }

我为每个硬币附加了这个脚本,以便在击中玩家后自行销毁它

public class DestroyCoin : MonoBehaviour
{
    public GameObject effect;
    //This script destroy the coin
    void OnTriggerEnter2D(Collider2D colInfo)
    {
        if (colInfo.CompareTag("Player"))
        {
            Instantiate(effect, transform.position, transform.rotation);
            Destroy(gameObject);

        }
    }
}

非常感谢您的帮助

【问题讨论】:

  • 一般情况下:您不应该使用PlayerPrefs 来保存玩家进度。您的第一个代码 sn-p 与第二个代码有何关系?是这两种不同的方法还是两者都用?
  • 我编辑了这个问题。我尝试了两种方法并给出了相同的结果。
  • 你确定OnTriggerEnter2D 只被调用一次吗?硬币是否可能正在移动或旋转,有时您会因为该运动而输入硬币,退出并再次进入?
  • 看起来你应该设置断点和debug你的代码,以便查看GameScoreManager.value += scoreValue;行被调用的位置和时间
  • 作为一般规则:不要在代码中的不同位置销毁您的硬币,而不是将其价值添加到玩家的分数中。这只是一种不好的做法,并为错误的发生而尖叫! (即使你认为它在技术上应该有效)即使它确实有效,你仍然应该对这样做感到非常内疚,因为它只是丑陋的 AF。

标签: c# unity3d mobile 2d


【解决方案1】:

我会通过将硬币价值的增加与玩家的分数直接关联到硬币的销毁来解决这样的问题。

您可能认为在同一个游戏帧中,您的硬币会发生碰撞事件以自毁,而您的玩家会收到将硬币值添加到他的分数的事件。

如果您是一位大师,并且您知道统一引擎的内部机制是如何工作的,请成为我的客人,并利用这些知识编写仍然有效的草率代码。但是对于像我这样的普通人来说,好的做法可以避免这类问题......(例如,如果硬币的破坏不会导致玩家不再碰撞以增加分数怎么办?)

使用相同的碰撞事件为玩家的分数增加一个值并永久销毁硬币,确保此类事件不再发生。甚至在那一刻将硬币的价值设置为 0,只是为了双重安全。

【讨论】:

    【解决方案2】:

    我设法通过识别 colider 来解决问题。检查它是否在开始时附加,然后在第一次命中后禁用碰撞。

    void OnTriggerEnter2D(Collider2D colInfo)
        {
    
            int inc = 0;
    
            //if (colInfo.CompareTag("Coin"))
            if (colInfo.gameObject.CompareTag("Coin") && colInfo.gameObject.GetComponent<CircleCollider2D>().enabled)
            {
                colInfo.gameObject.GetComponent<CircleCollider2D>().enabled = false;
                Destroy(colInfo.gameObject);
    
                inc = 5;
                coinCount += inc;
    
                print("coinCount" + coinCount);
                // AudioManager.instance.PlaySound("Coin");
                currentBalance += inc;
            }
    
            PlayerPrefs.SetInt("CoinCount", currentBalance);
            PlayerPrefs.Save();
        }
    

    感谢并从中学到了很多

    【讨论】:

    • 这基本上不是我的建议吗? (将 inc 添加到 coinCount 时,销毁硬币(在您的情况下禁用对撞机并销毁游戏对象))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多