2016-12-16 3 views
1

В моей игре на Unity3d у меня много сцен, теперь я работаю над игрой save/load. Я могу сохранить игру, но если я хочу ее загрузить, мне нужно загрузить сцену, которая мне нужна, а затем загрузить все остальные параметры.Как загрузить игру, где много сцен в Unity

Или нужно сначала загрузить все параметры, сохранить его с помощью DontDestroyOnLoad(), а затем загрузить сцену, которая мне нужна?

enter image description here

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)); 
} 

ответ

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.

EDIT:

Но в моем случае после загрузки сцены, будет другая часть метода выполнить?

Да/Нет.

После 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 
} 
+0

Но в моем случае после загрузки сцены будет выполняться другая часть метода? – dima

+0

После загрузки сцены вы должны поместить свой код загрузки в функцию 'Awake' или' Start'. Поэтому переместите 'PlayerPrefs.GetInt' в функцию' Awake' или 'Start'. – Programmer

Смежные вопросы