#arrays #unity3d #save #game-development
#массивы #unity3d #Сохранить #разработка игры
Вопрос:
Я пытаюсь сделать что-то вроде табло, но для одного игрока. Я хочу сохранить свои 10 лучших результатов на доске и отобразить их в MainMenu. Пока я знаю, как сохранить и отобразить только один результат. Код выглядит следующим образом:
[SerializeField] private int score;
void Update()
{
if (score > PlayerPrefs.GetInt("highestScore"))
{
PlayerPrefs.SetInt("highestScore", score);
}
}
И я показываю следующее в моей сцене MainMenu
void Start()
{
highScore.text = PlayerPrefs.GetInt("highestScore").ToString();
}
Возможно ли, если вы поможете мне сохранить мои последние 10 лучших результатов и отобразить их? Я не смог найти ни одного руководства о том, как это сделать. Я предполагаю, что я должен использовать массив целых чисел и перебирать этот массив, а затем сохранять его в PlayerPrefs, но я понятия не имею, как это сделать. Надеюсь, вы сможете мне помочь и заранее благодарю вас!!
Ответ №1:
Вы могли бы использовать ArrayPrefs2 для хранения в виде массива (http://wiki.unity3d.com/index.php/ArrayPrefs2 ), затем обновите с помощью:
static void UpdateHighScores(int newScore)
{
var highScores = PlayerPrefsX.GetIntArray("highScores");
if (newScore > highScores[0]) {
highScores[0] = newScore;
Array.Sort(highScores);
PlayerPrefsX.SetIntArray("highScores", highScores);
}
}
После инициализации ключа PlayerPrefs "highScores"
в другом месте с:
PlayerPrefsX.SetIntArray("highScores", new Array[10]);
Обратите внимание, что при этом сначала создается массив с наименьшим результатом, а последним в массиве — с истинным наивысшим результатом.
Комментарии:
1. Также я бы прокомментировал ответ Хамзы Аббаса, но у меня пока нет репутации. Они забыли добавить
break;
в конце инструкции if.2. Эй, спасибо, что указали на эту ошибку, я не пытался запустить код, вместо этого написал его, предполагая, как это будет работать, спасибо, чувак.
3. произошла еще одна ошибка, условие forloop проверяло, что X меньше I, поэтому, если I = 3 и X начинается с 5 (X < I = 5 < 3), оно всегда возвращало false , я также отредактировал условие for-цикла.
4. Нет проблем. Я думаю, вам тоже нужно измениться,
"highScore_"x-1
чтобы быть"highScore_" (x-1)
. Хотя, если OP запустил ваш код, они, должно быть, уже заметили это.5. lmao, отредактировал ответ, есть ли что-то еще, чего мне не хватает? XD
Ответ №2:
Вы определенно можете сохранить больше ключей, PlayerPrefs принимает параметры, один из которых является ключом, а второй — значением, которое вы можете настроить следующим образом
PlayerPrefs.SetInt("highScore_1", value);
PlayerPrefs.SetInt("highScore_2", value);
PlayerPrefs.SetInt("highScore_3", value);
PlayerPrefs.SetInt("highScore_4", value);
PlayerPrefs.SetInt("highScore_5", value);
Итак, когда кто-то набирает больше одного из предыдущих наивысших баллов, вы будете делать следующее
int newScore = 50;
for(int i=1; i <= 5; i ){
if(newScore > PlayerPrefs.GetInt("highScore_" i)){
for(int x = 5; x > i; x--){
int value = PlayerPrefs.GetInt("highScore_" (x-1));
PlayerPrefs.setInt("highScore_" x, value);
}
break;
}
}
Дайте мне знать, если это сработает.
Комментарии:
1. Привет, спасибо за ответ! К сожалению, похоже, что это не работает, или я делаю что-то не так, пытаясь это реализовать. Он возвращает наивысший балл для всех 5 текстовых полей, когда я настраиваю PlayerPrefs, как вы упомянули выше.
2. эй, не могли бы вы попробовать еще раз, я внес исправление в код.