关闭游戏并重新打开游戏后,我想加载最后一个场景,以便玩家可以从达到的水平继续。正如您在下面的代码中所见,我已经尝试使用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();
答案 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;
。
此外,您需要使用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();
}