В моей ситуации нужно было закидать игровое поле парами случайных неповторяющихся объектов. То есть у меня есть, условно, 100 готовых префабов, а я хочу выбрать из них 50 случайных и насыпать на сцену. Для этого используем массив случайных неповторяющихся чисел C# Unity.
В целом алгоритм действий будет следующий:
- Создать массив объектов для спавна
- Создать массив случайных индексов
- Заполнить массив индексов
- Раскидать объекты, используя случайные индексы по разным местам на сцене
Будьте осторожны – в коде есть цикл While. Если не правильно задать условие его завершения, то он будет выполняться бесконечно и повесит Unity! В моем случае важно, чтобы количество индексов не превышало количество префабов.
Давайте посмотрим как это будет выглядеть в коде с#
public class LastSpawnScript : MonoBehaviour
{
public GameObject[] enemyPrefab; // массив для префабов наших объектов
public int numberOfProps; // количество объектов, которые хотим заспавнить
private int numberOfCreatedProps = 0; // тут будет хранится количество сгенерированных случайных индексов
// блок переменных для хранения позиций спавна
private float positionX;
private float positionY;
private float positionZ;
private Vector3 newPosition;
private bool yesInPropses = false; // булька для проверки есть уже такой индекс в массиве или нет
// весь код выполняется при загрузке сцены, поэтому нужен только Старт
private void Start()
{
int[] propsIndexes = new int[numberOfProps]; // создаем массив для наших индексов
int nextIndex = UnityEngine.Random.Range(0, 60); // создаем первый случайный индекс
// цикл создания массива случайных чисел
while (numberOfCreatedProps < numberOfProps)
{
if (!yesInPropses) //если нового индекса нет в списке, то добавляем
{
propsIndexes[numberOfCreatedProps] = nextIndex;
numberOfCreatedProps++; //добавляем количество созданных индексов
}
yesInPropses = false ; // скидываем бульку
nextIndex = UnityEngine.Random.Range(0, 60); //генерим следующий индекс
for (int i = 0; i < numberOfProps; i++) //пробегаем по созданному массиву и проверяем есть там такой индекс или нет
{
if (propsIndexes[i] == nextIndex) { yesInPropses = true; } // если такой уже есть, то булька = тру
}
}
// ну а дальше пробегаем по полученному массиву и спавним объекты со случайными индексами, тут все просто
for (int i = 0; i < numberOfProps; i++)
{
int spawnIndex = propsIndexes[i];
positionX = UnityEngine.Random.Range(-39f, 39f);
positionY = UnityEngine.Random.Range(10f, 30f);
positionZ = UnityEngine.Random.Range(-44f, 65f);
newPosition = new Vector3(positionX, positionY, positionZ);
Instantiate(enemyPrefab[spawnIndex], newPosition, enemyPrefab[spawnIndex].transform.rotation);
}
}
}
После не забываем заполнить массив объектов в инспекторе. И записать необходимое количество чисел для генерации.
Посмотреть как работает можно в моей игре на Яндекс Играх:
Спасибо, что дочитали статью про массив случайных неповторяющихся чисел C# Unity)
Ваш комментарий будет первым