Раньше, в игровой индустрии приходилось «вручную» разрабатывать все игровые уровни. Но на дворе уже давно 21 век, поэтому для генерации новых игровых уровней можно использовать специальные алгоритмы. Автоматическая генерация уровней в играх может происходить с помощью разных алгоритмов. Сегодня мы поговорим об алгоритме, с помощью которого происходит процедурная генерация в Unity.
Процедурная генерация — это самый распространенный алгоритм генерации, который используется при разработке игр. При помощи этого алгоритма создаются целые игровые миры, например в Minecraft. При этом, алгоритм используется не только для генерации миров или уровней, но и для более мелких задач, например: генерация объектов, персонажей или игровых правил. В общем, процедурная генерация Unity — это классный и удобный алгоритм, однако он имеет ряд своих особенностей, о которых нужно знать перед его использованием.
Процедурная генерация в Unity
Возможно, не все были у гадалки, которая гадает и предсказывает будущее по картам, но как происходит процесс гадания должны понимать все. Вы вытягиваете несколько карт из колоды, раскладываете их на столе в определенном порядке и гадалка вам предсказывает будущее. По сути, «гадание по картам» реализовано по процедурному алгоритму.
Карты — это «фрагменты» одинакового размера, которые несут определенную информацию. Одна карта мало информативна, однако несколько разложенных карт образуют «общую картину». Процесс «гадания» — это алгоритм, который генерирует раскладку карт, а потом описывает «общую картину».
Процедурная генерация уровней в Unity реализована по схожему принципу. В роли карт выступают «тайлы». «Тайл» — это готовый фрагмент уровня определенного размера, который содержит определенную информацию: размер, рельеф, объекты, инструкции и др. При генерации нового уровня процедурный алгоритм «складывает» из множества готовых фрагментов новый уровень по определенной формуле.
Формула генерации новых уровней может носить:
предсказуемый характер, когда разработчик самостоятельно настраивает из каких фрагментов и в какой их последовательности создается новый уровень;
непредсказуемый характер, когда при генерации уровней используется алгоритм, который формирует уровень по принципу «случайных чисел».
При этом процедурная генерация уровней в Unity не всегда строится на готовых фрагментах уровней. Например, в том же Майнкрафте процедурная генерация уровней построена на другом алгоритме, который называется «шум Перлина». «Шум Перлина» еще называют алгоритмом градиентного шума. Он выглядит так:
Этот алгоритм работает следующим образом:
«шум» накладывается на сцену;
потом запускается алгоритм просчета рельефа;
светлые участки становятся возвышенностями, а темные участки становятся впадинами;
алгоритм «прогоняют» несколько раз, пока рельеф не начинает четко вырисовываться;
готовый рельеф наполняют нужными текстурами и объектами: деревья, вода, снег, монстры, дома и др.
Процедурная генерация в Unity: философия игры
Процедурная генерация используется во многих современных играх, где:
Игра создается на основе реального места. Например, берут за основу какой-то город и создают игру, где игровое действие происходит в этом городе. В этом случае разработчикам нужно «копировать» реальный город и переносить его в игру. «Ручное» копирование может затянуться на долгие годы, а с алгоритмами быстрее. В этом случае разработчики наносят на игровую карту только основные улицы, объекты и достопримечательности. А алгоритмы формируют второстепенные улицы и переулки, а также «достраивают» однотипные дома, здания, объекты и др.
Создается игра с открытым миром. В таких играх игровые карты достигают колоссальных размеров: десятки тысяч видов рельефа, городов, деревень, объектов, строений и др. Из этих фрагментов формируются новые карты, новые миры. Да, по большому счету такой подход не обеспечивает разнообразие локаций. Но «вручную» их вообще невозможно было бы реализовать.
Разрабатывается игра в жанре «рогалик». В таком жанре игрок постоянно будет пробовать проходить игру, потом погибать и начинать заново. Таких «циклов» может быть очень много. Чтобы игрокам не наскучило однообразие, каждый раз, когда они начинают играть заново, уровни также формируются заново. Это стало возможным благодаря процедурной генерации уровней.
В отдельных играх, процедурная генерация формирует игровой сюжет или музыкальное сопровождение в зависимости от происходящих событий на экране. Но не все так радужно. Процедурная генерация вокруг себя вызывает много споров.
Процедурная генерация позволяет масштабировать игру до бесконечности небольшими усилиями. Но в то же время игра будет выглядеть однообразной, потому что формирование новых уровней, сюжетов или игровых объектов происходит по одним и тем же шаблонам. Спустя неделю-другую игроки начинают замечать это однообразие. И от него никуда не деться.
Процедурная генерация сохраняет память. Во время генерации новых уровней, они не сохраняются отдельным файлом. Генерация использует готовые фрагменты из других игровых карт. Давайте вспомним «гадание». Каждая новая раскладка карт — это новое «предсказанное будущее», однако количество карт в колоде от этого не меняется.
При этом автоматической генерации свойственны ошибки, потому что её проводит алгоритм, который никем не контролируется. Каждый новый уровень будет являться «сюрпризом» и для игрока, и для разработчика.
Заключение
Процедурная генерация в Unity собрала вокруг себя много противников. Но, несмотря на это, ее активно применяют как большие студии разработки игр, так и инди-разработчики. Этот алгоритм особо актуален для небольших студий и разработчиков-одиночек, потому что позволяет им создавать масштабные игры небольшими командами. К примеру, Майнкрафт был создан единственным геймдизайнером. И только чуть позже игра обросла командой разработчиков.
Другое