Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法中指定布尔值不需要´;行不通_C#_Unity3d_Methods_Boolean - Fatal编程技术网

C# 在方法中指定布尔值不需要´;行不通

C# 在方法中指定布尔值不需要´;行不通,c#,unity3d,methods,boolean,C#,Unity3d,Methods,Boolean,我制作了一个小型街机风格的游戏,其中bool变量跟踪游戏是否结束(gameOver) 当障碍物击中玩家时,将执行以下方法: public void OnCollisionEnter2D(Collision2D other) { //GameOver gameOver = true; } 只有当gameOver的值等于false时,下一种方法才应该增加分数 private void OnTriggerEnter2D(Collider2D other) { if (!gam

我制作了一个小型街机风格的游戏,其中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关键字分配值,但这也不起作用。有人能帮我吗?提前感谢。

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

private static bool gameOver;
另一个解决方案是在GameManager单例中存储gameOver(如果您正在使用它)

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

public static class GameStates
{
    public static bool IsGameOver = false;
    public static int Score = 0;
    //other global states
}
并且使用它时不会出现问题:

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

如果您不想使用静态(这不是unity中的最佳解决方案)-使用singleton(不要为小游戏创建复杂的体系结构)

首先触发哪个方法?是OnCollisionEnter2D还是OnTiggerEnter2D?您的事件似乎是按相反的顺序触发的,首先是
Enter2D
,然后是
Collision
。您是否尝试将其设置为静态?当一个新游戏出现并被设置为默认值时,您可能正在创建该类的一个新实例。@Reniuz/HimBromBeere,根据,首先调用OnTiggerXXX,然后OnCollisionXXX@jdweng在Unity中使用
static
不是最好的主意,通常意味着您不知道如何正确使用Unity。我们这里没有足够的信息,但正确的方法是让某个类持续时间与
静态
字段的持续时间一样长,可以一直持续到游戏结束谢谢!我认为这听起来像是一个愚蠢的问题,但是我如何创建一个单例呢?单例只是一种设计模式,通过这种模式,您可以确保给定类只存在一个实例。如何做到这一点是一个实现细节,您可以使用这个
if (!GameStates.IsGameOver)
{
    //do something
}