【问题标题】:Assigning bool value in method doesn´t work在方法中分配布尔值不起作用
【发布时间】:2019-03-04 11:33:37
【问题描述】:

我制作了一个小型街机风格的游戏,其中一个布尔变量跟踪游戏是否结束(gameOver)。

private bool gameOver;

当障碍物击中玩家时,会执行以下方法:

public void OnCollisionEnter2D(Collision2D other)
{
    //GameOver
    gameOver = true;
}

只有当 gameOver 的值等于 false 时,下一个方法才应该增加分数。

private void OnTriggerEnter2D(Collider2D other)
{
    if (!gameOver)
    {
        if (int.Parse(scoreText.text) == 0)
        {
            scoreText.text = "1";
        }
        else if (int.Parse(scoreText.text) > 0)
        {
            int oldNumber = int.Parse(scoreText.text);
            int newNumber = oldNumber + 1;
            scoreText.text = newNumber.ToString();
        }
    }
    Destroy(gameObject);
}

但当游戏真正“输”时,分数会持续增加。 我在不同的时间记录了 gameOver 的值,似乎在 OnCollisionEnter2D 方法中将 gameOver 的值设置为 true,但是在登录 OnTriggerEnter2D 方法时,它显示为 false。我尝试使用 out-Keyword 在单独的方法中分配值,但这也不起作用。谁能帮我?提前致谢。

【问题讨论】:

  • 先触发哪个方法?是 OnCollisionEnter2D 还是 OnTriggerEnter2D?
  • 您的事件似乎以相反的顺序触发,首先是Enter2D,然后是Collision
  • 您是否尝试将其设为静态?当一个新游戏发生并且它被设置为默认值时,您可能正在创建该类的一个新实例。
  • @Reniuz/HimBromBeere,根据manual,先调用OnTriggerXXX再调用OnCollisionXXX
  • @jdweng 在 Unity 中使用 static 不是最好的主意,通常意味着您不知道如何正确使用 Unity。我们这里没有足够的信息,但正确的方法是让某个类持续只要 static 字段本来可以持续,这可能会持续到游戏结束

标签: c# unity3d methods boolean


【解决方案1】:

您没有在全局状态下更改 gameOver bool,只有一个障碍物知道您输了。最简单的解决方案:

private static bool gameOver;

另一个解决方案是如果你正在使用 gameOver 则将它存储在 GameManager 单例中

您也可以将此状态存储在一个静态类中:

public static class GameStates
{
    public static bool IsGameOver = false;
    public static int Score = 0;
    //other global states
}

并且毫无问题地使用它:

if (!GameStates.IsGameOver)
{
    //do something
}

如果你不想使用静态(这不是统一的最佳解决方案) - 使用单例(不要为小游戏制作复杂的架构)

【讨论】:

  • 谢谢你成功了!我认为这听起来像是一个愚蠢的问题,但我该如何制作单例呢?
  • @TitanTomato 单例只是一种设计模式,您可以确保只存在给定类的一个实例。 如何这是一个实现细节。
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2015-11-26
  • 2013-07-22
  • 2013-08-12
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多