При разработке игр рандомизация часто используется для создания динамичного и непредсказуемого опыта. Однако существуют сценарии, в которых вы хотите гарантировать, что случайные значения, генерируемые функцией в Unity, уникальны и не повторяются. В этой статье мы рассмотрим несколько методов и приемов кодирования, которые помогут вам сохранить уникальность случайности вашей игры.
Метод 1: использование HashSet
Один из способов предотвращения дублирования значений — использование HashSet. Вот пример фрагмента кода:
HashSet<int> uniqueValues = new HashSet<int>();
int GetUniqueRandomValue()
{
int value = Random.Range(1, 100);
while (uniqueValues.Contains(value))
{
value = Random.Range(1, 100);
}
uniqueValues.Add(value);
return value;
}
Объяснение: Структура данных HashSet гарантирует сохранение только уникальных значений. Мы генерируем случайное значение и проверяем, существует ли оно уже в HashSet. Если это так, мы регенерируем значение, пока оно не станет уникальным. Получив уникальное значение, мы добавляем его в HashSet, чтобы отслеживать ранее сгенерированные значения.
Метод 2: перетасовка массива
Другой подход — создать массив уникальных значений и перетасовать его. Вот пример:
int[] uniqueValues = Enumerable.Range(1, 100).ToArray();
int currentIndex = uniqueValues.Length - 1;
void ShuffleArray()
{
while (currentIndex > 0)
{
int randomIndex = Random.Range(0, currentIndex);
int temp = uniqueValues[currentIndex];
uniqueValues[currentIndex] = uniqueValues[randomIndex];
uniqueValues[randomIndex] = temp;
currentIndex--;
}
}
int GetUniqueRandomValue()
{
if (currentIndex < 0)
{
ShuffleArray();
currentIndex = uniqueValues.Length - 1;
}
int value = uniqueValues[currentIndex];
currentIndex--;
return value;
}
Объяснение: В этом методе мы создаем массив, содержащий уникальные значения, с помощью функции Enumerable.Range. Затем мы перемешиваем массив, используя алгоритм Фишера-Йейтса. Каждый раз, когда нам нужно новое случайное значение, мы извлекаем его из массива и уменьшаем текущий индекс. Когда мы исчерпали все значения, мы снова перемешиваем массив, чтобы создать новый набор уникальных значений.
Метод 3: отслеживание сгенерированных значений
Если у вас ограниченный диапазон значений и вы хотите обеспечить уникальность, вы можете отслеживать уже сгенерированные значения. Вот пример:
List<int> generatedValues = new List<int>();
int minValue = 1;
int maxValue = 100;
int GetUniqueRandomValue()
{
int value = Random.Range(minValue, maxValue + 1);
while (generatedValues.Contains(value))
{
value = Random.Range(minValue, maxValue + 1);
}
generatedValues.Add(value);
return value;
}
Объяснение: В этом методе мы храним список сгенерированных значений. Мы генерируем случайное значение в нужном диапазоне и проверяем, существует ли оно уже в списке. Если это так, мы регенерируем значение, пока оно не станет уникальным. Как только мы получим уникальное значение, мы добавим его в список.
Реализуя эти методы, вы можете гарантировать, что значения, генерируемые случайными функциями в Unity, всегда будут уникальными. Независимо от того, решите ли вы использовать HashSet, перетасовать массив или отслеживать сгенерированные значения, эти методы помогут вам сохранить уникальность и повысить случайность в ваших играх.
Помните, что создание уникального и непредсказуемого опыта имеет решающее значение для увлекательного игрового процесса, и эти методы программирования помогут вам в достижении этой цели.