Нажмите "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 не будет опубликован. Обязательные поля помечены *