Как сделать рандомную генерацию в unity

Обновлено: 05.07.2024

Мне кажется, что удобнее всего для плавной постройки уровня будет использование ProGrids, чем Ctrl. А так видео полезное. Спасибо.

Я: мам, можно мы купим Айзека
Мама: у нас есть Айзек дома
Айзек дома:

Дружище, во первых ты крут, спасибо.
А второе ты бы мог сделать видео по созданию главного и всё что с ним связано, тип вот меню, тыкаешь на условный Play и начинается игра, потом так же с настройками и открывается новая сцена. Заранее спасибо

на ютубе полно гайдов(ХОРОШИХ ПРИЧЕМ)

Макстер, офигенное видео Как всегда) Я бы хотела увидеть как делать скины, да и вообще новых персонажей за которых можно будет играть. Надеюсь заметишь и поможешь осуществить=)

Ура, круто! Это самый ожидаемый урок на твоем канале для меня. Ещё не успела его посмотреть, но сразу поставила лайк

Очень полезный урок, Спасибо Большое ^_^

Сделай главное меню и паузу
Это наверно единственное чего нету для полноценной игры
Го в топ

Большое спасибо, тутор очень помог в создании моей мобилки!

Полезное видео, самому захотелось сделать топ даун шутер. Слушай Maxter когда будет стримчик?)

Добавь рандомный дроп бонусов с врагов))

Крутое видео, особенно понравилась очень гибкая система настройки генерации уровня.
P.S И ещё наконец-то Макс исправил, чтоб не отображалась панель задач в видео) Теперь даже не узнаешь сколько было потрачено времени на запись видео ((

@maxter дай угадаю поиграл в Айзека и теперь хочешь сделать его на мобилу да?

@maxter Спасибо За крутой ролик, у меня возникла ошибка что делать если на начальной комноте спавнятся сразу много и нету прохода

Пока Арти с Флатом тупят, ты видосы пилишь, да при том какие! Красава)

@Мансур Акаюмов Согласен

@BeHappian Studio флатинго откровенно пишет говнокод. просто как он делал движение игрока наандроид. иликакон хилбар делал. Кароч художник он хороший, но вотс кодом у него проблемка. Аудитория большая изза хорошей подачи. Но может онна камеру говнокодит а так может норм. хотя маловероятно

@BeHappian Studio уже врубилась
Спс ฅ^•ﻌ•^ฅ

@Polinkа UwU это два блогера по юнити:
Арталаски - разработчик юнити, который больше специализируется по художественной части и левелдизайну.

Флатинго - откровенно слабый разраб, но с очень большой аудиторией.

@BeHappian Studio эээээ. Не врубилась.

О боже именно такой урок я и искал, спасибо тебе огромное, ты лучший(я просто делаю похожую игру) Кста когда 2 часть этого видоса будет.

Отличное видео. Тема шутера очень нравится, жду больше подобных видео.

Сделай карту для ориентировки в комнатах

сделай пожалуйста гайд о том, как сделать меню для игры под андроид

Всё прекрасное про игры у тебя всё хорошое про юнити у тебя.

Как всегда топчик!

Привет! Подскажи как в игре сделать места с секретами(например за кустами, когда заходишь спрайт кустов изчезает)?

В скрипте куста
void OnTriggenEnter(Collider other)
if(other.gameObject.tag == "Player")
Destroy(gameObject);
>
>

Клево, только почему бы не использовать [SerializeField]?)

А если использовать спрайтовую заготовку угла, сделать её тайловую, то юньке нужно будет отрисовать всего четыре объекта для всей комнаты, а не много объектов с коллайдерами?

Лучше сделать объект который будет телепортироваться к середине комнаты, а на саму камеру поставить скрипт чтоб она за ним ходила, переходы будут плавными, ну это так, просто мне кажется так лучше будет

@Евгеній Музика а как же cinemachine?

можно через Vector2.MoveTowards это написать

Привет, можешь сделать урок по интеграции VS Code и Unity, и настройке всех расширений и всего прочего? Просто после выхода Unity версии 2020 почему то перестал работать VS и я поставил VS Code, но проблема в том, что он криво работает и не показывает все подсказки. Жду ответа)

Лучше когда комната большая а камера идёт за игроком вот это круто, и портал на другой лвл тоже будет круто, а так класс👍

Твои гайды ооооооочень вдохновляют

Кто знает, в чем дело? Последнее условие сделано для того, чтобы комнаты не залазили друг на друга и не спавнились бесконечно. Но у меня она просто не работает. И происходит сразу все, что я написал выше:(

Красава очень помог

Круто, когда следующая серия.

Топ контент
Полезний Канал
Буду по Больше смотреть твои видео

Я покашто учу Unity
Но умею создавать игры (в 2D)
Но я стараюсь делать всё сам
Даже без assets store
Для опыт
Єто без цение знание

Привет Макс, отличные видео. Пиши, если интересует создание совместных проектов. Я рисую в photoshopе

Как решить проблему с тем, что несколько комнат пытаются заспавнить в одном месте следующую комнату?

@Pikachu Чел , так очевидно , я 3 дня голову ломал , спасибо ) Подумал уже крыша едет

Если еще актуально, смотри. Тебе нужно поставить этот оранжевый значок в центор главной комнаты и там поставить "None". И все заработает.

выложи эту игру в плей маркет пожалуйста!

Привет. Сделай ещё ближний бой меч и топор

Уже было видео про ближний бой

сделай систему прокачки,на ютубе таких гайдов вобще нет

Очень хочу узнать: а как ты зарегистрировал аккаунт разработчика Google Play, не достигнув 18 лет?

Я пытался создать аккаунт, но его отклонили после проверки моих документов (мне 16 лет). Ты использовал документы родителей?

Ребят , у кого-нибудь была проблема , что крайне редко , но если комнаты справа и сверху к примеру сходятся к одной общей комнате , то точки успевают заспавнить 2 комнаты в одной и сразу удаляются.

Исправил , если у кого так было добавьте в void OnTriggerStay2D(Collider2D other) вот это условие после первого
if (other.CompareTag("RoomPoint") && other.GetComponent().spawned == false && spawned == false)

print("А вот и неждан ");

Ты вернул мне желание делать игры

А когда игра сделается она выйдет в плей маркет?)

Молодец очень хорошо или в том же духе

А можно как-то ограничить количество генерируемых комнат?

Сколько секунд в скрипте укажешь, это всё зависит от времени выписанного в скрипт

Чел, ты просто прекрасен

помогите) на местах перемещения в другие комнаты камер у меня чтобы камера пошла вверх нужно написать 4 в коде а не 8 как на видео , снизу так же 8 , из-за этого баги с камерой вечные

@Fresh Huk костылями и не полностью , но по крайне мере не так сильно и много багает , изредка

все сделал как на видео на 10 раз проверил а некоторые комнаты всеравно друг на друга наслаиваются что делать?

Я правильно понимаю? Комнаты не обязательно должны быть блочными?

ВАу так интереснннненько))) ты молодетс . понавилось..

Спасибо, а то я просто планирую сделать рогалик.Кстати механика похожа на the biding of Isaac

Дак это вроде и есть Айзек

Хотел про это написать но ты меня обогнал (:

Вот как создавался соул найт на минималках)

Подскажите пожалуйста у меня не работает скрипт на исправление ситуации с "Стеной в некуда" в чём проблема?

Попробуй сделать на unity bolt

Ты не представляешь, насколько ты помог

@Дискер Ютубов у меня у комнат центр почему то смещен из за чего они спавнятся криво, а как пофиксить хз

@Xiloman Смотря в чём

@Дискер Ютубов Шаришь вообще, помочь мне сможешь?

А что делать если игрок проходит сквозь стены?риджет бади2д подключено и колайдер2д тоже

Добавь стенам тег Ground, и настрой персонажа как у него

Привет макс прошу скинь ссылку на все спрайты а то я очень вырви глазные получается надеюсь ты увидишь.

Помогите пожалуйста. Стены комнаты почему-то пропадают когда я нажимаю Maximize ( Options - > Maximize) что делать?

у меня в компании другой код конвеншн, так что это не обязательный минус. кто то вообще разделяет слова в полях и переменных через нижнее подчеркивание. так что забей.

Создание карты - одна из самых интересных и занимательных систем, которая может существовать для того, чтобы разнообразить игровой процесс внутри игры. Ведь всё новые и новые локации для пользователя вызовут его интерес и заинтересованность.

Игровую карту можно генерировать достаточно разными способами и условиями. Благодаря которым могут создаваться различные препятствия и прочее.

Генерация карты из шестиугольников.

Механика генерации карты в unity

В данном случае я расскажу как генерировать карту для игры, подобной героям третьим. Где существуют разные территории, и каждая территория имеет свой цвет. Каждый шестиугольник я буду называть тайлом, который имеет свою собственную текстуру и настройку.

И так, для начала нам необходимо разбить всё игровое пространство на несколько локаций. В моём случае это будет 4 различные локации:

  • Людей (Green)
  • Нежить (Black)
  • Пустыня (Green)
  • Зима (White)

Сразу скажу, что локации называются цветами только потому что, изначально вместо текстур я использовал различные цвета, для того чтобы упростить процесс создания.

Разбитая карта на родительские тайлы

И так, после того как вы создали отдельные объекты для ваших тайлов, необходимо определить, какой из объектов будет содержать тип тайлов, в последствии чего создавать именно в нём определённый тип тайлов. (Звучит не очень, но на деле именно так)

Данные

Создаём специальный класс, который отвечает за хранение данных о родителях тайлов.

Данный код хранит в себе такие данные как:

  • сам родительский объект тайлов
  • тип родительского объекта

Назначение типов

Следующим шагом нам необходимо для каждого родительского объекта тайла назначить его тип. Сделать это нужно так, чтобы не возникало повторений, добавив к этому всему ещё рандом.

  • Перебирает четыре локации
  • Выбирает случайную из них
  • Проверяет не присвоен ли данной локации значение
  • Назначает ей новое значение

Если же значение уже присвоено, то возвращается на шаг назад. Знаю, алгоритм достаточно странный. И честно говоря, можно было бы сделать проще, но это мой код.

Тайлы

И так, когда типы у нас назначены, нам нужно откуда-то брать сами объекты, которые мы будем создавать. Для этого нам на помощь приходят ещё два класса. В себе они будут хранить данные об объектах которые мы создаём. Почему два? Потому что нам нужно сделать список списков, то есть двумерный массив. Но чтобы это работало просто.

Первый класс будет называться Tile и содержать в себе сам объект и тип этого объекта:

Второй класс будет называться Tiles. Он будет содержать в себе наименование группы тайлов, переменную для случайного создания и список префабов тайлов:

Соответственно когда всё готово мы можем продолжать наш чудесный код для создания нашей локации. Теперь алгоритм достаточно прост. Мы перебираем четыре наших родительских объекта и создаём в них случайные тайлы в зависимости от типа. Далее центрируем их относительно нашего родительского объекта.

Ну и соответственно данный код создаст нам четыре различные площади определённого типа. Единственное что останется правильно заполнить в диспетчере задач два этих массива, скриншот которых прикреплён чуть ниже.

Генерация карты в Unity

Полный код

Ну и соответственно полный код который генерирует карту также представлен ниже:

Обложка: Создание Minecraft на Unity3D. Часть вторая. Генерация мира

Это вторая часть руководства по созданию собственной Minecraft-подобной игры. В ней мы напишем генератор мира и добавим персонажа, который сможет перемещаться по миру, ставить и удалять блоки. В предыдущей части мы создали куб с текстурой.

Добавляем функциональность мыши

Прежде чем мы приступим к программированию, давайте добавим на нашу сцену направленный свет. Нам нужен источник света, чтобы лучше видеть наш 3D-мир.

35_light

Вы можете поменять направление света, если хотите:

scene-light2

Позиционируем источник света

33_newscript

Мы назовем их WorldGenerator и ClickOnFaceScript.

Прежде чем мы продолжим, вам крайне рекомендуется ознакомиться со скриптингом в Unity.

Теперь откройте WorldGenerator.cs в MonoDevelop (которая уже установлена вместе с Unity) двойным щелчком по нему и введите следующий код:

Мы используем статический метод, чтобы создать клон нашего куба. Unity позволяет нам задать имя и позицию клона. Больше информации о методе Instantiate вы можете получить здесь.

В Minecraft, если вы находитесь достаточно близко к кубу и кликаете по нему левой кнопкой мыши, он исчезает и появляется в вашем инвентаре. Когда вы кликаете правой клавишей на любую из сторон куба, новый экземпляр появится на той стороне, по которой вы кликнули, в случае, если у вас достаточно материала в инвентаре. В данном уроке мы не будем ставить перед собой ограничения, так что у нас будет бесконечное количество кубов и бесконечная дистанция клика.

27–29 января, Онлайн, Беcплатно

Откройте ClickOnFaceScript.cs и введите туда этот код:

Теперь переместите скрипт на каждую из шести сторон куба на сцене.

36_dragscript2

Применяем скрипт к GameObject

Скрипт должен появиться на каждой стороне во вкладке Inspector.

37_inspector_script1

39_test

Тестируем нажатия кнопок мыши

Запомните! В режиме игры любые изменения, которые вы произвели с элементами во вкладке Scene, будут отменены. Не меняйте ничего, пока игра запущена. Нажмите еще раз, чтобы остановить игру.

Теперь у нас есть все что нужно, чтобы создавать новые кубы по клику правой клавишей мыши. Мы должны определить точную позицию нового GameObject, который будет появляться при клике. На нашей сцене расстояние между центрами двух соседних блоков равно единице.

Для простоты мы назовем центр куба, по которому кликают, буквой C, а центр блока, который должен появиться — N. Мы рассматриваем эти центры как позиции в 3D-пространстве.

  • Если мы кликаем на верхнюю грань: N = C + (0, 1, 0);
  • На нижнюю: N = C + (0, -1, 0);
  • На правую: N = C + (1, 0, 0);
  • На левую: N = C + (-1, 0, 0);
  • На переднюю: N = C + (0, 0, 1);
  • На заднюю: N = C + (0, 0, -1).

Мы можем обобщить сказанное выше в простую формулу: N = C + delta, где delta — это смещение, требуемое для расчета центра нового блока. Каждая из шести сторон содержит свой экземпляр ClickOnFaceScript и разное значение delta.

Мы должны изменить ClickOnFaceScript.cs, чтобы реализовать функционал, описанный выше. Откройте скрипт и измените файл таким образом:

Вернитесь в редактор и поменяйте значения delta в соответствии с картинками:

40_values

Вся необходимая информация обведена

Проверьте, что все работает. Запустите игру несколько раз, задавая разные позиции камере (изменяя ее Transform во вкладке Inspector), чтобы проверить, что введенные нами значения delta верны.

41_tempcam

Настраиваем позицию камеры и нажимаем на стороны кубов

Создаём персонажа

Если все работает, как задумано, мы можем перейти к созданию персонажа, чтобы мы могли свободно двигаться в нашей игре. К счастью для нас, Unity предоставляет готовый пакет с контроллером персонажа от первого лица, так что нам не нужно будет создавать его с нуля. Перейдите в Assets → Import Package и выберите Character Controller.

42_addcc

Импортируем пакет Character Controller

В окне Importing package выберите следующее:

43_importcc

Во вкладке Project перейдите в Standard Assets → Character Controllers, выберите First Person Controller.prefab и перетащите его во вкладку Hierarchy.

44_firstpersoncontroller

Заготовка First Person Character Controller

Расположите его близко к центру сцены.

Настраиваем местоположение заготовки

Мы должны защитить нашего персонажа от падения, прежде чем перейти к тестированию. Мы вернем значение обратно, когда закончим алгоритм генерации мира.

46_gravityoff

Гравитация не нужна!

Проверьте, что все работает.

47_test

Отключаем главную камеру

Мы почти закончили! Откройте скрипт WorldGenerator.cs и модифицируйте его:

Скрипт будет запускаться только тогда, когда он прикреплен к какому-нибудь GameObject на сцене. Создайте пустой Empty GameObject и перетащите WorldGenerator.cs на него.

49_dragndrop

Перетаскиваем WorldGenerator.cs на новый GameObject

Перетащите объект Voxel на соответствующее поле в скрипте. Эта версия алгоритма генерации мира хранит все блоки в памяти, так что не рекомендуется задавать большие значения полям Size X, Size Y и Size Z, иначе вам грозит низкая производительность или, что еще хуже, Unity может вылететь.

Размеры больше указанных выставлять не стоит

Вместе с Unity ЦП публикует истории разработки игровых проектов, созданных на базе популярной технологии. Расскажите о своём кейсе, чтобы попасть в рубрику.

Игровой разработчик из Кэмбриджа Джош Ньюман написал для издания Gamasutra колонку о том, как при помощи движка Unity можно создавать программно генерируемые игровые 2D-миры. Ньюман подробно описал создание ландшафта, городов и процесс расселения неигровых персонажей.

Мне нравится мысль, что буквально всё в мире сводится к обработке и передаче информации, собственно, в университете я и потратил бесчисленное множество часов в возне с числами, пытаясь создать порядок из случайности (хотя я пишу код всего лишь три года, так что мне еще есть чему поучиться).

Пример миров, сгенерированных с помощью алгоритма

Первое, что должен делать алгоритм, — это генерация биома и базовой геологии мира. Для их создания алгоритм генерирует множество карт по методу шума Перлина для атмосферных осадков, карт высот и температур, циклично проходя по всему массиву данных (float[,]) с помощью функции Mathf.PerlinNoise из API Unity.

Сгенерированные карты шума затем немного изменяются, значения высоты уменьшаются по оси Y, значения для атмосферных осадков и температуры увеличиваются по оси X, в результате карты обычно получаются очень схожими: море находится на севере, горы на юге, пустыни на западе и так далее.

Таким образом, биом генерируется как комбинация атмосферных осадков, высоты и температуры. Для этого был создан специальный метод с входными параметрами в виде индекса биома и его параметров. Метод работает циклично, проходя по BiomeMap (int[,,]), и если параметры биома в BiomeMap[pos] больше искомых параметров, то он заменяет все, что есть в BiomeMap[pos] индексом биома.

Метод генерации биома вызывается несколько раз, каждый раз он накладывается на предыдущий слой в тех зонах, которые подходят под нужные параметры, по одному слою на каждый тип биома и в порядке слева направо в следующей таблице:

Различные типы биома хранятся в массиве GroundTiles[], который определяет такую информацию, как: какие растения могут существовать в этом конкретном биоме, и может ли биом существовать под землей.

Если вам интересно, как класс GroundTiles может отображаться в инспекторе, этот класс сериализуется путем размещения тэга [System.Serializable] над определением класса GroundTiles. Затем массив GroundTiles создается в классах генератора уровня: public GroundTiles[] groundTiles;

Озера создаются в зонах с высоким уровнем атмосферных осадков, а начало рек создается в какой-нибудь случайной дождливой точке, и желательно так, чтобы русло реки было направлено вниз по склонам и стремилось к еще более дождливым местам. Эти реки по природе своей очень незамысловатые, они не осуществляют поиск пути, а также не обладают никакой информацией о своем окружении, а только проверяют участки пространства, находящиеся в непосредственной близости.

Растения (GroundTiles.NonObstructivePlants) и деревья (GroundTiles.NaturalBarriers) располагаются на местности абсолютно случайно, хотя они всё-таки немного зависят от дождей. Затем их расположение анализируется через алгоритм клеточных автоматов (Cellular Automaton), таким образом растения немного группируются между собой.

Теперь, когда основной мир сгенерирован, алгоритм переходит к его заселению неигровыми персонажами и творениями их рук (городам, зданиям и дорогам) следующим образом:

1. Создается шумовая карта Перлина для определения густонаселенности.

2. Алгоритм циклично проходит по карте густонаселенности, время от времени делает выборку текущего значения и помещает зоны с достаточно высокой плотностью населения в список точек возможного размещения городов. Те точки, которые расположены близко к другим городам, игнорируются. Затем список случайным образом урезается, пока не станет нужной длины.

3. Дороги генерируются между центрами городов, дороги, проходящие через большие пространства воды, заменяются на лодки (с одной из сторон), которые будут перевозить игрока. Генерация дорог похожа на генерацию рек, здесь не надо очень сильно заботиться об обходе препятствий.

4. Дороги, сгенерированные случайно от точек других дорог в зонах с высокой плотностью населения, станут нашими улицами. Эти дороги генерируются на расстоянии от других дорог, сгенерированных на этом этапе, таким образом мы оставляем место для зданий, которые будут расположены между дорогами.

5. Здания генерируются рядом с улицами в густонаселенных местах. Все здания генерируются как прямоугольные параллелепипеды, размер здания зависит от доступного пространства и параметра buildingType, который выбирается случайно, но также зависит от густонаселенности и индекса биома, который находится в месте построения зданий, так как некоторые типы зданий не могут быть построены в определенных типах биомов.

Стены внутри зданий генерируются с помощью рекурсивного метода разделения (recursive division).

Читайте также: