Unity отображает 10 наивысших баллов

#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. эй, не могли бы вы попробовать еще раз, я внес исправление в код.