Unity – передача данных между сценами

Как передать значение оценки из одной сцены в другую?

Я пробовал следующее:

Сцена первая:

void Start () { score = 0; updateScoreView (); StartCoroutine (DelayLoadlevel(20)); } public void updateScoreView(){ score_text.text = "The Score: "+ score; } public void AddNewScore(int NewscoreValue){ score = score + NewscoreValue; updateScoreView (); } IEnumerator DelayLoadlevel(float seconds){ yield return new WaitForSeconds(10); secondsLeft = seconds; loadingStart = true; do { yield return new WaitForSeconds(1); } while(--secondsLeft >0); // here I should store my last score before move to level two PlayerPrefs.SetInt ("player_score", score); Application.LoadLevel (2); } 

Сцена вторая:

 public Text score_text; private int old_score; // Use this for initialization void Start () { old_score = PlayerPrefs.GetInt ("player_score"); score_text.text = "new score" + old_score.ToString (); } 

но ничего не отображается на экране, и нет ошибки.

Это правильный способ передачи данных?

Я использую бесплатную версию Unity 5, разрабатываю игру для Gear VR (это означает, что игра будет работать на устройствах Android).

Любое предложение?

    Помимо playPrefs другой грязный способ – сохранить объект во время загрузки уровня, вызвав DontDestroyOnLoad на нем.

     DontDestroyOnLoad (transform.gameObject); 

    Любой скрипт, прикрепленный к игровому объекту, выживет, а также переменные в скрипте. Функция DontDestroyOnLoad обычно используется для сохранения целого GameObject, включая прикрепленные к нему компоненты, и любые дочерние объекты, которые он имеет в иерархии.

    Вы можете создать пустой GameObject и поместить только скрипт, содержащий переменные, которые вы хотите сохранить на нем.

    Есть 3 способа сделать это, но решение этого зависит от типа данных, которые вы хотите передать между сценами. Компоненты / скрипты и GameObjects уничтожаются при загрузке новой сцены и даже при маркировке как static .

    1. Используйте ключевое слово static .

    Используйте этот метод, если переменная для перехода к следующей сцене не является компонентом, не наследует от MonoBehaviour и не является GameObject, а затем MonoBehaviour переменную.

    Встроенные примитивные типы данных, такие как int , bool , string , float , double . Все эти переменные могут быть сделаны static переменной.

    Пример встроенных примитивных типов данных, которые могут быть помечены как статические :

     static int counter = 0; static bool enableAudio = 0; static float timer = 100; 

    Они должны работать без проблем.


    Пример объектов, которые могут быть помечены как статические :

     public class MyTestScriptNoMonoBehaviour { } 

    тогда

     static MyTestScriptNoMonoBehaviour testScriptNoMono; void Start() { testScriptNoMono = new MyTestScriptNoMonoBehaviour(); } 

    Обратите внимание, что class не наследуется от MonoBehaviour . Это должно сработать.


    Пример объектов, которые не могут быть помечены как статические :

    Все, что наследуется от Object , Component или GameObject , не будет работать.

    1A. Все, что наследуется от MonoBehaviour

     public class MyTestScript : MonoBehaviour { } 

    тогда

     static MyTestScript testScript; void Start() { testScript = gameObject.AddComponent(); } 

    Это не сработает, потому что оно наследуется от MonoBehaviour .

    1B. Весь GameObject :

     static GameObject obj; void Start() { obj = new GameObject("My Object"); } 

    Это не сработает, потому что это GameObject и GameObject наследуются от Object .

    Unity всегда будет уничтожать свой Object даже если они объявлены с ключевым словом static .

    См. № 2 для обходного пути.


    2.Используйте функцию DontDestroyOnLoad .

    Вам нужно использовать это только в том случае, если данные для сохранения или перехода к следующему сценарию наследуются от Object , Component или являются GameObject . Это решает проблему, описанную в пунктах 1А и .

    Вы можете использовать его, чтобы этот GameObject не уничтожался при разгрузке сцены:

     void Awake() { DontDestroyOnLoad(transform.gameObject); } 

    Вы даже можете использовать его со static задачей для решения ключевых слов из 1A и 1B :

     public class MyTestScript : MonoBehaviour { } 

    тогда

     static MyTestScript testScript; void Awake() { DontDestroyOnLoad(transform.gameObject); } void Start() { testScript = gameObject.AddComponent(); } 

    testScript переменная testScript будет сохранена при загрузке новой сцены.

    3. Сохраните местное хранилище, затем загрузите его во время следующей сцены.

    Этот метод следует использовать, когда это игровые данные, которые необходимо сохранить, когда игра закрыта и снова открыта. Пример этого – высокий балл игрока, настройки игры, такие как громкость музыки, местоположения объектов, данные профиля джойстика и т. Д.

    Thare – два способа сохранить это:

    3A. Используйте API PlayerPrefs .

    Используйте, если у вас осталось всего несколько переменных. Скажем, оценка игрока:

     int playerScore = 80; 

    И мы хотим сохранить playerScore:

    Сохранить оценку в функции OnDisable

     void OnDisable() { PlayerPrefs.SetInt("score", playerScore); } 

    Загрузите его в функцию OnEnable

     void OnEnable() { playerScore = PlayerPrefs.GetInt("score"); } 

    3B. Сериализовать данные в форме json, xml или binaray, а затем сохранить с помощью одного из файлов API C #, таких как File.WriteAllBytes и File.ReadAllBytes для сохранения и загрузки файлов.

    Используйте этот метод, если для сохранения много переменных.

    General, вам нужно создать class, который не наследуется от MonoBehaviour . Этот class, который вы должны использовать для хранения ваших игровых данных, чтобы их можно было легко сериализовать или де-сериализовать.

    Пример данных для сохранения:

     [Serializable] public class PlayerInfo { public List ID = new List(); public List Amounts = new List(); public int life = 0; public float highScore = 0; } 

    Возьмите class DataSaver который является оберткой File.WriteAllBytes и File.ReadAllBytes что упрощает сохранение данных с этого поста.

    Создать новый экземпляр:

     PlayerInfo saveData = new PlayerInfo(); saveData.life = 99; saveData.highScore = 40; 

    Сохраните данные из PlayerInfo в файл с именем «игроки»:

     DataSaver.saveData(saveData, "players"); 

    Загружайте данные из файла с именем «игроки»:

     PlayerInfo loadedData = DataSaver.loadData("players"); 
    Давайте будем гением компьютера.