在我在Unity3d上的游戏中,我有许多场景,现在我在保存/加载游戏上工作。我可以保存游戏,但如果我想加载它,我需要加载我需要的场景,然后加载所有其他参数。
或者我应该首先加载所有参数,用DontDestroyOnLoad()
保存,然后加载我需要的场景?
public void ButtonSave()
{
PlayerPrefs.SetFloat("transform position x" + currentActiveSlot, playerTransform.position.x);
PlayerPrefs.SetInt("task 1 completed" + currentActiveSlot, isTask1Completed);
PlayerPrefs.SetInt("latestSaveSlot", latestSaveSlot);
PlayerPrefs.SetInt("act number" + currentActiveSlot, 0);
PlayerPrefs.SetInt("step number" + currentActiveSlot, 0);
PlayerPrefs.SetString("sceneName" + currentActiveSlot, SceneManager.GetActiveScene().name);
PlayerPrefs.Save();
}
public void ButtonLoad()
{
playerTransform.position = new Vector3(PlayerPrefs.GetFloat("transform position x" + currentActiveSlot),
PlayerPrefs.GetFloat("transform position y" + currentActiveSlot),
PlayerPrefs.GetFloat("transform position z" + currentActiveSlot));
isTask1Completed = PlayerPrefs.GetInt("task 1 completed" + currentActiveSlot);
//gameManager.currentActNumber = PlayerPrefs.GetInt("act number" + currentActiveSlot);
//act_2.stepNumber = PlayerPrefs.GetInt("step number" + currentActiveSlot);
//SceneManager.LoadScene(PlayerPrefs.GetString("sceneName" + currentActiveSlot));
}
答案 0 :(得分:2)
您应该先使用SceneManager.LoadScene
加载场景,然后使用PlayerPrefs
代码加载播放器设置。
public void ButtonLoad()
{
SceneManager.LoadScene(PlayerPrefs.GetString("sceneName" + currentActiveSlot));
playerTransform.position = new Vector3(PlayerPrefs.GetFloat("transform position x" + currentActiveSlot),
PlayerPrefs.GetFloat("transform position y" + currentActiveSlot),
PlayerPrefs.GetFloat("transform position z" + currentActiveSlot));
isTask1Completed = PlayerPrefs.GetInt("task 1 completed" + currentActiveSlot);
}
不经常保存变量不是一个好主意。您可以看到保存和加载场景here的正确方法。
编辑:
但是在我加载场景后的情况下,会是方法的其他部分 执行?
是/否。
调用SceneManager.LoadScene
后,该函数中的其余代码将执行,但执行将在新加载的场景中的相同场景不中完成。 因此,您将丢失刚刚加载的播放器设置。
所以,我认为这对你没用。将播放器设置代码放在Awake
或Start
功能中,以在加载场景后自动加载播放器设置。
public void ButtonLoad()
{
SceneManager.LoadScene(PlayerPrefs.GetString("sceneName" + currentActiveSlot));
}
void Awake()
{
isTask1Completed = PlayerPrefs.GetInt("task 1 completed" + currentActiveSlot);
//...other PlayerPrefs.GetInt code
}