Как создавать случайные объекты без дубликатов в Юнити

Программирование на Юнити.

Как создавать случайные объекты без дубликатов в Юнити

Сообщение Alex777 15 дек 2020, 12:35

В моем бесконечном раннере Random.Range периодически генерирует блоки дороги дублируя их подряд. Пример (номера блоков): 1,2,5,4,4,4,4. Подскажите пожалуйста как можно это исправить.

Синтаксис:
Используется csharp
public class RoadSpawner : MonoBehaviour  //СЛУЧАЙНАЯ ГЕНЕРАЦИЯ БЛОКОВ ДОРОГИ
{
    //ПЕРЕМЕННЫЕ:
 
    public GameObject[] RoadBlockPrefabs;  //массив где хранятся префабы дороги
    public GameObject StartBlock;  //первый/стартовый блок
 
    public int BlocksCount = 4; //количество одновременно отображаемых блоков в игре
    public float BlockLength = 0f;  //длинна 1го блока
    public int SafeZone = 45;  //фора по позиции, чтобы блоки не удалялись слишком рано
 
    float blockZPos = 0f;  //позиция по оси Z стартового блока
 
    public Transform PlayerTransf;  //перемещение Игрока
    List<GameObject> CurrentBlocks = new List<GameObject>();  //список в который добавляем блоки
 
 
 //____________________________________________________________________________________________________
 
 
    void Start()
    {
        blockZPos = StartBlock.transform.position.z;  //присваеваем позицию по Z стартовому блоку
 
        CurrentBlocks.Add(StartBlock);  //стартовый блок удаляется после его прохождение
 
        //Цикл спавна блоков:
        for (int i = 0; i < BlocksCount; i++)
        {
            SpawnBlock();
        }
    }
 
 
    void Update()
    {
        CheckForSpawn();  //ПОСТОЯННАЯ ГЕНЕРАЦИЯ БЛОКОВ
    }
 
 
    void CheckForSpawn()  //ПОСТОЯННАЯ ГЕНЕРАЦИЯ БЛОКОВ
    {
        if(PlayerTransf.position.z - SafeZone > (blockZPos - BlocksCount * BlockLength))
        {
            SpawnBlock();
            DestroyBlock();
        }
    }
 
 
    void SpawnBlock()  //СЛУЧАЙНЫМ ОБРАЗОМ ГЕНЕРИРУЕМ БЛОКИ ДОРОГИ ИЗ СПИСКА ПРЕФАБОВ
    {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        blockZPos += BlockLength;
        block.transform.position = new Vector3(0, 0, blockZPos);
        CurrentBlocks.Add(block);
    }
 
 
    void DestroyBlock()  //УДАЛЕНИЕ БЛОКОВ
    {
        Destroy(CurrentBlocks[0]);
        CurrentBlocks.RemoveAt(0);
    }
}
Alex777
UNец
 
Сообщения: 6
Зарегистрирован: 15 дек 2020, 12:30

Re: Как создавать случайные объекты без дубликатов в Юнити

Сообщение Alkos26Rus 15 дек 2020, 12:58

Синтаксис:
Используется csharp
public int OldBlock;

    void SpawnBlock()  //СЛУЧАЙНЫМ ОБРАЗОМ ГЕНЕРИРУЕМ БЛОКИ ДОРОГИ ИЗ СПИСКА ПРЕФАБОВ
    {
        //генерируем случайный номер блока
        int random_block = Random.Range(0, RoadBlockPrefabs.Length);
        //если новый номер совпал со старым генерируем случайный номер блока до тех пор пока он будет оличаться от старого
        while (random_block == OldBlock){
        random_block = Random.Range(0, RoadBlockPrefabs.Length);
        }
        //назначаем старый номер блока
        OldBlock = random_block;


        GameObject block = Instantiate(random_block, transform);
        blockZPos += BlockLength;
        block.transform.position = new Vector3(0, 0, blockZPos);
        CurrentBlocks.Add(block);
       
    }
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как создавать случайные объекты без дубликатов в Юнити

Сообщение Alex777 15 дек 2020, 14:33

Получилось!) Большое спасибо!)

Небольшая поправка мб кому-то пригодится:

GameObject block = Instantiate(RoadBlockPrefabs[random_block], transform);
Alex777
UNец
 
Сообщения: 6
Зарегистрирован: 15 дек 2020, 12:30


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14