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

Обновлено: 07.07.2024

Как создать простой бесконечно генерируемый уровень для линейной игры, вроде раннера или side-scroller'a.

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

Существует много идей и алгоритмов для процедурной генерации различных уровней и миров, в этом видео я начну .

Привет! В этом видео я покажу вам как генерировать мир в юнити! Конечно в данном видео я показываю как это делается .

. процедурная, процедурная генерация 3д уровня, unity 3d процедурная генерация, процедурная генерация из тайлов, .

Динамическая генерация мира - процесс достаточно интересный, и позволяет создавать уникальный игровой ландшафт .

Как сгенерировать собственный меш? Что такое вершины, полигоны, uv и нормали? Как использовать тангенсы с картами .

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

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

Как процедурно генерировать подземелье, или dungeon, для игры в стиле Rougelike, вроде The Binding of Isaac или Enter .

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

. процедурная, процедурная генерация 3д уровня, unity 3d процедурная генерация, процедурная генерация из тайлов, .

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

Minecraft

Minecraft

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

No Man’s Sky

No Man’s Sky

В No Man’s Sky генерируется вся вселенная – а это 18 квинтиллионов планет, которые можно посетить в космическом приключении. Игрокам предстоит исследовать галактики, добывать ресурсы, строить базы и сражаться с врагами. Делать это можно в кооперативе, в том числе кроссплатформенном. Несмотря на негативные отзывы на старте, сейчас No Man’s Sky – один из лучших боевиков с открытым миром.

Deep Rock Galactic

Deep Rock Galactic

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

RimWorld

RimWorld

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

The Binding of Isaac

The Binding of Isaac

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

Spelunky

Spelunky

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

Rogue Legacy

Rogue Legacy

Into the Breach

Into the Breach

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

Remnant: From the Ashes

Remnant: From the Ashes

Хардкорный ролевой экшен генерирует планировку уровней, расположение врагов и боссов для каждого игрока, за счет чего геймеры получают уникальные приключения. Ваше прохождение будет отличаться от прохождения другого геймера, но вы можете посещать миры друг друга и совместно сражаться с монстрами. Кроме того, поведение тварей в Remnant: From the Ashes регулирует ИИ-режиссер, и если ему покажется, что вы слишком легко преодолеваете испытания, он тут же исправит этот недочет с помощью волны особо сильных противников.

Серия Borderlands

Borderlands

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

Elite: Dangerous

Elite: Dangerous

X-COM: UFO Defense

X-COM: UFO Defense

В тактическом режиме культовой первой части серии X-COM карта генерируется случайным образом, что вносит долю непредсказуемости в игровой процесс: игрок, как и подконтрольные ему солдаты, прибывшие в незнакомую локацию, не знает, чего ожидать, а пришельцы могут скрываться где угодно. Подобной концепцией также может похвастать идейный наследник игры – стратегия Xenonauts.

Nosferatu: The Wrath of Malachi

Nosferatu: The Wrath of Malachi

Классический хоррор-шутер Nosferatu: The Wrath of Malachi предлагает игрокам спасти семью главного героя из лап вампиров, заточивших его родственников в огромном замке. Ключевой особенностью игры стала процедурная генерация расположения комнат, что значительно усиливает напряжение – ведь выполнить задания необходимо за определенное время, и отсутствие плана локации дезориентирует игрока.

Серия Civilization

Civilization

В играх серии Civilization генерируется карта мира, где рандомно размещаются столицы цивилизаций, города-государства, залежи ресурсов, чудеса природы и другие объекты. При этом разработчики предусмотрели интересы тех геймеров, которые хотят играть на знакомых локациях: для них есть карты с очертаниями земных континентов и исторически достоверным расположением государств.

Spore

Spore

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

Don’t Starve

Don’t Starve

Действие Don’t Starve разворачивается в случайно сгенерированных альтернативных мирах, и игрокам предстоит собирать ресурсы, добывать пищу, а также следить за уровнем рассудка главного героя, который вынужден противостоять невиданным кошмарам. Выживать можно вместе – для геймеров, не желающих оставаться в одиночестве, разработчики подготовили кооперативное дополнение Don’t Starve Together.

Starbound

Starbound

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

Battle Brothers

Battle Brothers

В тактической RPG с открытым миром Battle Brothers мир создается заново в каждой новой игре. Расположение поселений и лагерей разбойников, количество и плотность отрядов, события – все это генерируется случайным образом. Вместе с тем, также здесь есть и перманентные глобальные события, с которыми игроку так или иначе придется столкнуться.

Dwarf Fortress

Dwarf Fortress

Dwarf Fortress – это популярный бесплатный roguelike, в котором игроки строят подземную крепость дварфов в процедурно созданном мире. Перед началом игры можно задать некоторые параметры, вроде размера мира, количества опасных локаций, насыщенность ресурсами и так далее, при этом вселенная игра подчиняется определенным правилам и меняется в зависимости от степени воздействия на нее игрока.

Серия Diablo

Diablo

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

Returnal

Новый трейлер и подробности Returnal

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

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

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

Обложка: Создание 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 может вылететь.

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


Смотря что генерировать. Тунели/Коридоры, города, ландшафт? Это все довольно разные алгоритмы. На сайте есть видео урок по генерации дорог, советую поглядеть.
_________________
Мои работы.
Youtube Channel
Форум по геймдеву.

Пользователь

Как насчет космоса? А вообще я хочу понять как писать алгоритм генерации для всего (мира, пещер, города, ландшафта, ресурсов. ) на C++. Буду благодарен за любую информацию.

Пользователь

Проблема не в алгоритме, проблема в том, что все это будут динамические объекты, с динамическими тенями и освещением.
То есть такой уровень будет с резкими тенями, не будет на нем GI - глобального отсвещения (отраженного света) статического. А все динамическое жрет ресурсы "мама не горюй".
При больших объемах в итоге ты получишь пошаговую стратегию а не шутер с FPS в 5-10 кадров в секунду.
Сначала реши эту проблему - размести на уровне туеву хучу моделей с динамическим освещением, добейся адекватного освещения и FPS не ниже 60-ти. Размести столько, сколько хочешь чтобы было в поле зрения игрока. Тогда будешь думать о генерации.
В противном случае я тебе предрекаю разочарование самое великое и горестное после того как ты придумаешь и реализуешь таки систему генерации нарвешься на проблемы с оптимизацией ))

Пользователь

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

Сам расчет и генерация может вызвать падение FPS так как задействуется много ресурсов ЦПУ в основном.
Алгоритмы генерации можно найти в сети, если нужно, потом адаптировать под Анриал. Хотя Анриал, как по мне не предназначен для такого применения.

Пользователь

Как насчет космоса? А вообще я хочу понять как писать алгоритм генерации для всего (мира, пещер, города, ландшафта, ресурсов. ) на C++. Буду благодарен за любую информацию.

Hello Games своим "No Man's Sky" уже эпически зафейлили саму идею процедурной генерации. Посему я бы не стал озвучивать слово "процедурный" еще лет 5 как минимум.

Пользователь

Проблема не в алгоритме, проблема в том, что все это будут динамические объекты, с динамическими тенями и освещением.
То есть такой уровень будет с резкими тенями, не будет на нем GI - глобального отсвещения (отраженного света) статического. А все динамическое жрет ресурсы "мама не горюй".
При больших объемах в итоге ты получишь пошаговую стратегию а не шутер с FPS в 5-10 кадров в секунду.
Сначала реши эту проблему - размести на уровне туеву хучу моделей с динамическим освещением, добейся адекватного освещения и FPS не ниже 60-ти. Размести столько, сколько хочешь чтобы было в поле зрения игрока. Тогда будешь думать о генерации.
В противном случае я тебе предрекаю разочарование самое великое и горестное после того как ты придумаешь и реализуешь таки систему генерации нарвешься на проблемы с оптимизацией ))

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

Вот тут процедурный ландшаф и на GeForce GTX 960 примерно 60-80 фпс.

При этом проект не доделан до конца и оптимизации никакой нет вообще.
Если все сделать нормально с LODами и оптимизацией то можно с процедурального ладншафта и 100 fps снять.
Последний раз редактировалось epic_slowpoke 24 ноя 2016, 11:38, всего редактировалось 2 раз(а).

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