#c# #unity3d
#c# #unity-game-engine
Вопрос:
В настоящее время я следую руководству по созданию игры в Unity с использованием C #. В нем они показали нам, как отображать счет в центре экрана с помощью
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public Transform player;
public Text scoreText;
// Update is called once per frame
void Update()
{
scoreText.text = player.position.z.ToString("0");
}
}
Однако я хочу пойти дальше и выяснить, как создать список рекордов в верхнем левом углу. Мой единственный опыт связан с python, поэтому я знаю, что я бы создал пустой массив размером 10, а затем каждый раз при перезапуске игры, если результат превышает любой из 10 наивысших баллов в упомянутом списке, он вставляется в соответствующую позицию (сохраняя порядок элементов), а наименьшее значение удаляется из списка (чтобы сохранить список всего из 10 элементов). Однако меня смущает синтаксис C #.
В настоящее время мой мыслительный процесс над кодом (который был бы включен в мою инструкцию restart), если бы это был python, заключается в следующем
##this is how I would write it in python I believe
array = np.zeros[10]
for i in range(0, len(array)):
if player.position.z.ToString("0") < array[-i]
continue
else:
array[-i-1] = player.position.z.ToString("0")
Где, очевидно, оператор player.position взят из c #. Мне было интересно, может ли кто-нибудь помочь мне перевести мыслительный процесс заново. Кажется, мне нужно объявить массив строк, прежде чем я смогу его использовать, но я не уверен.
Спасибо за любую помощь
Комментарии:
1. Говорить вам использовать toString() для каждого фрейма для этого — ужасная идея. Я даже не знаю, как кто-то счел это предложение хотя бы слегка уместным.
2. @Krythic О, я просто следую руководству Брэкки на YouTube, какова замена?
3. Я думаю, если вы обнаружите, что текущий результат выше, чем любой элемент массива, вам нужно будет ввести этот результат, а другие элементы массива следует сдвинуть вниз (а не заменять)
Ответ №1:
Как я понял, вам нужен массив из 10 элементов, в котором вы храните 10 лучших результатов. Таким образом, каждый новый результат, превышающий существующий топ-10, помещается в правильное положение этого топ-10.
Что-то вроде
текущий Top10 => 2, 3, 5, 7, 8, 9, 12, 15, 18, 20
newScore = 16
новый Top10 => 3, 5, 7, 8, 9, 12, 15, 16, 18, 20
Вариант 1:
string[] scoreArray = new string[10];
//Initializing the score array
for (int i = 0; i < 10; i )
{
scoreArray[i] = 0;
}
//Somewhere in your code a new score will be assigned to this variable
int newScore;
//Checking potentially higher score
boolean replaceFlag = false;
for (int i = 0; i < 10; i )
{
if(newScore > scoreArray[i])
{
replaceFlag = true;
}else{
//newScore lower than lowest stored score
if(i == 0)
{
//Stop the loop
i = 11;
}else if(replaceFlag){
//The rest of the elements in the array move one position back
for(int j = 0 ; j < i-1; j )
{
scoreArray[j] = scoreArray[j 1];
}
//Finally we insert the new score in the correct place
scoreArray[i-1] = newScore;
}
}
}
Вариант 2: Использование списка
//Create and initialize list of scores
List<int> listScores = new List<int>{ 0,0,0,0,0,0,0,0,0,0};
// If later, at some point we have the following scores 2, 3, 5, 7, 8, 9, 12, 15, 18, 20
//When you get a new score (our list will have)
listScores.Add(newScore);
//After inserting 2, 3, 5, 7, 8, 9, 12, 15, 18, 20, 16
//Ordering the list in descending order
listScores.Sort()
//Now we have 2, 3, 5, 7, 8, 9, 12, 15, 16, 18, 20,
//Drop last element of the list to keep the fixed size of 10.
listScores.RemoveAt(0)
//Now we have 3, 5, 7, 8, 9, 12, 15, 16, 18, 20
//In case you want to have the list in descending order
listScores.Sort((a, b) => -1* a.CompareTo(b));
Ответ №2:
если Score — это массив, то добавьте оценки к этой переменной массива Score, а затем отсортируйте и переверните этот массив всякий раз, когда вы захотите обновить высокий балл.
private void UpdateScore(int[] ScoreArray)
{
Array.Sort(ScoreArray);
Array.Reverse(ScoreArray);
}
Ответ №3:
Вы бы создали массив известной длины размером 10 примерно так:
string[] aStringArray = new string[10];
Также добавьте это сверху;
using System.Collections.Generic;
Комментарии:
1. Что делает комментарий к изменению размера? Кажется, что это увеличивает его с каждым циклом?
2. более типично, что вы бы использовали список<string>: не нужно изменять размер, просто добавляйте / удаляйте элементы в этот список.
3. Я не думаю, что Original poster хочет использовать array, он просто хочет сделать на c # то, что он сделал бы с array в Pyton. При смене языка лучшее предложение — предоставить правильный инструмент для выполнения работы на новом языке. Всего лишь мои 2 цента
Ответ №4:
Массив должен иметь длину, если вы хотите неизвестный размер, тогда используйте List
List<int> player = new List<int>();
player.Add(1);
Комментарии:
1. Привет, Саиф, я прочитал вопрос, но не понял, где он хотел бы использовать list (или массив известного размера).
2. в C # массив должен иметь длину, если хотите использовать неизвестную длину, используйте вместо этого список
3. Да, я это знаю. но где в требовании указано, что он хочет массив неизвестной длины?