[英]Start Game from the Last Scene Unity 3D
關閉游戲並重新打開后,我想加載最后一個場景,以便玩家可以從達到的水平繼續。 正如您在下面的代碼中所見,我已經嘗試使用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();
您需要為GetInt
指定一個defaultValue
,以便它第一次啟動時可以選擇適當的場景開始。
另外,您需要跟蹤場景開始時是否已經加載,並且僅在尚未發生時才執行此加載。 GameManager
似乎應該將它做成一個單例,但是由於不是這樣,您可以將這個loaded
標志GameManager
靜態,因此這在所有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++;
這是很難讀懂的,實際上並沒有做你想做的事情 。 您可以執行level_index = SceneManager.GetActiveScene().buildIndex + 1;
代替。
另外,還需要使用PlayerPrefs.Save();
Save
對PlayerPrefs
PlayerPrefs.Save();
更改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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.