Сохранить информацию при переходе от сцены к сцене
у меня есть такая проблема: когда игрок выигрывает уровень и выходит на сцену выбора уровня, количество звездочек корректно обновляется, но если уходит другая сцена, она не обновляется. Обновляется только при повторном входе в сцену выбора уровня.
То есть этот цикл 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 шт):
(Это не совсем ответ, я хотел задать сначала пояснительные вопросы в комментариях, но не смог из-за "репутации")
Я сам не слишком хорошо разбираюсь в 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