Сохранить информацию при переходе от сцены к сцене

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

То есть этот цикл for работает только в одной сцене выбора уровня, поскольку он не может найти информацию в другой сцене (GameObject.Find (j + "star" + stars)). Как я могу использовать эту функцию для другой сцены?

for(int j = 1; j < LockLevel.levels; j++){
      print("Ashxatec");
      stars = PlayerPrefs.GetInt("level"+worldIndex.ToString() +":" +j.ToString()+"stars");
      levelIndex = (j+1);

      GameObject.Find(j+"star"+stars).GetComponent<Image>().enabled = true ;

      world1_allstars += stars;
      PlayerPrefs.SetInt("world1astxer",world1_allstars);



      if((PlayerPrefs.GetInt("level"+worldIndex.ToString() +":" +levelIndex.ToString()))==1){    
         GameObject.Find("LockedLevel"+levelIndex).SetActive(false);

      }


   }

Ответы (1 шт):

Автор решения: P3TU5H0K

(Это не совсем ответ, я хотел задать сначала пояснительные вопросы в комментариях, но не смог из-за "репутации")

Я сам не слишком хорошо разбираюсь в Unity, поэтому только что почитал и сам подумал над возможными решениями. Пробовал ли ты сделать "глобальные переменные? Ну, вернее создавать статичные переменные или константы в которых ты и будешь хранить данные о количестве звёзд, не брав информацию из другой сцены.

Или же можно попробовать сохранить их в памяти и ссылаться в каждой сцене к сохранённым данным.

Так как сам вопрос состоит именно в сохранении информации, я распишу только второй предложенный мною способ, но на всякий случай оставлю ссылки на все ресурсы где я сам искал информацию.

Сохранение в данном случае будет не напрямую в файл, а в реестр. в Unity оно реализуется с помощью инструмента PlayerPrefs.

ВАЖНО: прошу сразу простить меня за примеры кода, так как они могут быть не совсем правильными, или просто не лучшим из возможных вариациях написания (я редко пишу на с#). Так что то что я пишу скорее для примера и идейного представления того, что возможно следует сделать.

Его самый просто и базовый вызов выглядит так:

PlayerPrefs.Set<Int or Float or String>("Некоторый ключ", TEST);

PlayerPrefs.Save();

PlayerPrefs.Get<Int or Float or String>("Некоторый ключ");

"Некоторый ключ" - ключ под которым мы сохраняем данные в реестре.
TEST - переменная которую мы сохраняем, может быть Int, Float или String.
PlayerPrefs.Save<Тип данных>(); - служит для фактического сохранения.

Пример:

String key = "Stars_level#1"
stars = 3

PlayerPrefs.SetInt(key, stars);

PlayerPrefs.Save();


key_now = "Stars_level#1"
stars_now = PlayerPrefs.GetInt(key_now);

Таким образом можно реализовать несколько вызываемых функций для сохранения и загрузки данных реестра:

static void Save(String key, Int a){
  PlayerPrefs.SetInt(key, a);
  PlayerPrefs.Save();
}

static Int Load(String key){
  return PlayerPrefs.GetInt(key);
}

Так же можно попробовать хранить значения всех звёзд для всех уровней сразу в одной переменной. Необязательно конечно и не всегда удобно, но всё таки.
Так как звёзд всего 3 (насколько я понял, ну или по крайней мере меньше 10), то можно хранить каждое значение звезды в разрядах одного числа. Например: Stars = 230012,
тогда 2 - звезда для 1 уровня,
1 - звезда для 2 уровня,
0 - звезда для 3 уровня,
и т. д. А реализовать это можно максимально просто найдя остаток от деления переменной на 10 в степени числа, равного номеру уровня.

Не уверен, что такой ответ поможет, но вдруг...

Ресурсы которыми я пользовался:
https://unity3dschool.ru/sohranenie-i-zagruzka-dannyh-v-unity-igre.html
https://qna.habr.com/q/414188

→ Ссылка