【问题标题】:Start Game from the Last Scene Unity 3D从最后一个场景开始游戏 Unity 3D
【发布时间】:2018-12-31 18:11:17
【问题描述】:

关闭游戏并重新打开后,我想加载最后一个场景,这样玩家就可以从他达到的关卡继续。正如您在下面的代码中看到的那样,我尝试使用 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();

【问题讨论】:

  • 崩溃时是否会在日志中打印任何错误?

标签: c# unity3d


【解决方案1】:

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

此外,您需要在场景开始时跟踪是否已经加载,并且仅在尚未加载时才执行此加载。 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;。

另外,您需要将 Save 更改为 PlayerPrefs 和 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();
}

【讨论】:

  • 这对我不起作用,游戏开始但没有任何效果
  • @Taik 请比“没有任何工作”更具描述性。是否加载了错误的场景?它是否重新格式化了您的硬盘驱动器?我们无法知道。
  • 第一个场景已加载但已暂停,因此我无法播放或执行任何操作
  • @Taik 现在听起来像是一个完全独立的问题。 在您尝试使用PlayerPrefs 之前,您的代码是否与LoadScene 一起工作?
  • Start 方法上没有任何内容时,它工作得很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多