Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 18.03.2020
Сообщений: 6

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

15.12.2020, 12:26. Показов 1061. Ответов 2

Студворк — интернет-сервис помощи студентам
В моем бесконечном раннере Random.Range периодически генерирует блоки дороги дублируя их подряд. Пример (номера блоков): 1,2,5,4,4,4,4. Подскажите пожалуйста как можно это исправить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2020, 12:26
Ответы с готовыми решениями:

Как правильно создавать объекты ?
Как правильно создавать объекты и как они расходуют память, что является правильным подходом? public class MyClass extends Activity { ...

Как правильно создавать объекты ?
Как правильно создавать объекты и как они расходуют память, что является правильным подходом? вариант 1: public class...

Как динамически создавать объекты?
Добрый день! Есть задача нарисовать картинку, на которой будут двигаться объектики, все это происходит на JPanel при помощи класса...

2
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,073
15.12.2020, 15:57
Можно попробовать создать HashSet и в него пихать случаиные префабы, он поидее дубликат не пропустит, и если префаб добавилса в него то создавать объект, а если нет то поновой вызывать функцию.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
HashSet<GameObject> hsObj = new HashSet<GameObject>();
void SpawnBlock()  //СЛУЧАЙНЫМ ОБРАЗОМ ГЕНЕРИРУЕМ БЛОКИ ДОРОГИ ИЗ СПИСКА ПРЕФАБОВ
    {
        GameObject dinamicObj = RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)];
        if(hsObj.Add(dinamicObj)){
        GameObject block = Instantiate(dinamicObj, transform);
        blockZPos += BlockLength;
        block.transform.position = new Vector3(0, 0, blockZPos);
        CurrentBlocks.Add(block);
        }else{
        SpawnBlock();
        }
    }
     void DestroyBlock()  //УДАЛЕНИЕ БЛОКОВ
    {
        //тут придетса чистить HeshSet
        hsObj.RemoveAt(0);
        Destroy(CurrentBlocks[0]);
        CurrentBlocks.RemoveAt(0);
    }
Добавлено через 14 минут
А нет так не прокатит, сори

Добавлено через 2 минуты
если их id пихать в хешсет то сработает
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
15.12.2020, 16:13
Ricard0, проверять на предыдущий. если такой же то заново рандом кинуть
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.12.2020, 16:13
Помогаю со студенческими работами здесь

Как правильно создавать объекты на форме?
Задача следующей программы рисовать гибкий график функции на поле класса PictureBox. Для этого я создал класс, в котором объявляется объект...

Как динамически создавать объекты класса ?
Всем привет! У меня есть файл app.config в котором хранится информация о точках. У каждой точки 3 св-ва: name, defaultValue и match....

Как генерировать случайные геометрические объекты с заданной извилистостью?
Я хочу генерировать случайные геометрические объекты в двумерном пространстве с заданной извилистостью. Извилистость определяется по...

DirectX: Как динамически создавать простые 3d объекты
Добрый день! Помогите, пожалуйста! Как создать приложение на Visual C# с использованием DirectX? Должен быть реализован следующий...

Как создавать в цикле разные объекты одной структуры?
Допустим есть структура которая представляет из себя ячейку которая хранит данные по координатам X Y Z и некоторые свойства этой ячейки. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru