从最后一个场景开始游戏Unity 3D

时间:2018-12-31 18:11:17

标签: c# unity3d

关闭游戏并重新打开游戏后,我想加载最后一个场景,以便玩家可以从达到的水平继续。正如您在下面的代码中所见,我已经尝试使用PlayerPrefs,但是游戏在启动时崩溃。

GameManager脚本:

    bool GameHasEnded = false;
    public float RestartDelay = 2f;
    public float NextLevelDelay = 5f;

    int level_index;

    private void Start()
    {

        level_index = PlayerPrefs.GetInt("Last_Level");
        SceneManager.LoadScene(level_index);


    }

    public void CompleteLevel()
    {
        Invoke("NextLevel", NextLevelDelay);
        level_index = level_index++;
        PlayerPrefs.SetInt("Last_Level", level_index);
    }

    public void EndGame()
    {
        if (GameHasEnded == false)
        {
            GameHasEnded = true;
            Invoke("Restart", RestartDelay);
        }
    }

    void NextLevel()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex +1);
    }

    void Restart()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().path);
    }
}

所有场景都与GameManager链接,它们都具有加载下一个场景的相同代码:

FindObjectOfType<GameManager>().CompleteLevel();

1 个答案:

答案 0 :(得分:0)

您需要为defaultValue指定一个GetInt,以便它第一次启动时可以选择合适的场景开始。

此外,您需要跟踪场景开始时是否已经加载,并且仅在尚未发生时才执行此加载。 GameManager似乎应该做成一个 singleton ,但是由于不是这样,您可以将这个loaded标志设为静态,因此这在所有GameManager中是很常见的实例。

总的来说,看起来像这样:

public readonly int defaultLastLevel = 1; // Set as appropriate
private static bool loaded = false;

void Start()
{
    if (!loaded) {
        loaded = true;
        level_index = PlayerPrefs.GetInt("Last_Level", defaultLastLevel);
        SceneManager.LoadScene(level_index);
    }
}

此外,您的CompleteLevel具有一些非常奇怪的代码,您可以在其中进行后递增并在同一行中进行分配:

level_index = level_index++;

这很难读,实际上doesn't do what you want it to do。您可以改为使用level_index = SceneManager.GetActiveScene().buildIndex + 1;

此外,您需要使用SavePlayerPrefs进行的PlayerPrefs.Save();更改

总而言之,这使您的CompleteLevel看起来像这样:

public void CompleteLevel()
{
    Invoke("NextLevel", NextLevelDelay);
    level_index = SceneManager.GetActiveScene().buildIndex + 1; // use this instead
    PlayerPrefs.SetInt("Last_Level", level_index);
    PlayerPrefs.Save();
}