Нажмите "Enter" для перехода к содержанию

Массив случайных неповторяющихся чисел C# Unity

В моей ситуации нужно было закидать игровое поле парами случайных неповторяющихся объектов. То есть у меня есть, условно, 100 готовых префабов, а я хочу выбрать из них 50 случайных и насыпать на сцену. Для этого используем массив случайных неповторяющихся чисел C# Unity.

В целом алгоритм действий будет следующий:

  1. Создать массив объектов для спавна
  2. Создать массив случайных индексов
  3. Заполнить массив индексов
  4. Раскидать объекты, используя случайные индексы по разным местам на сцене

Будьте осторожны – в коде есть цикл 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)




Ваш комментарий будет первым

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *