Добро пожаловать, berk
Twitter Группа Steam Страница Вконтакте Группа C.O.R.E. Dragon Age Контакте Новостная лента RSS
/ Статьи / Общеролевые статьи / Аналитика

Процедурная генерация и дизайн уровней в Shattered Planet

Автор: Tanya X Short | Добавил: m00n1ight, 10.03.2014 | Просмотры: 2392

Таня Икс. Шорт – творческий директор Kitfox Games. Данная статья была впервые опубликована на блоге Kitfox Games. Любая связь с новой игрой студии Moon Hunters является чистым домыслом.

Вступление

Я дизайнер уровней по профессии и образованию. Я занималась системными элементами, игровыми структурами, сюжетом, но в душе я дизайнер внутриигровых объектов. Независимо от того, работаю ли я с ловкрафтовскими тёмными историями The Secret World или с дружелюбными слизнями в Dungeons of Fayte, мне интереснее всего вручную создавать приключения для игрока. Поэтому, когда мы в Kitfox решили, что маленькая команда разработчиков должна приобщиться к процедурной генерации объектов, чтобы выжить на постоянно растущем рынке видеоигр, мне сперва было немного не по себе.

Одна из опасностей применения процедурной генерации — в результате вам достаётся органичный набор схожих материалов, легко предугадываемых по стилю и направленности. Учитывая, что непредсказуемость является исключительным преимуществом генерированных объектов над «высокохудожественными материалами», важно не преуменьшить эту особенность. Данная статья предоставляет ретроспективный взгляд на наши попытки избежать подобного промаха. Я рада тому, как мы поступили.

Я расскажу немного о нашей структуре данных, покажу, как мы использовали движок Unity для создания «инструментов» разработки, и продемонстрирую, как сложность работы пропорционально возрастала, начиная с момента простого замысла. Помните, что я дизайнер — я не написала ни строки кода процедурной генерации в Shattered Planet. Все чудеса, созданные руками программистов и завораживающие виды — дело рук Майка Дитчберна, Джонгву Кима, и Грега Лондиша.

Shattered Planet: Процедурная генерация (1)

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

Если вам интересен сам код, дайте знать, и мы придумаем что-нибудь!

Итак, без дальнейших отступлений… давайте начнём с начала.

Наша Цель

Мы начали работу в начале июня 2013 года. Через две недели наш маленький прототип был готов, игровой процесс представлял собой пошаговую RPG в процедурно сгенерированных уровнях. Мы знали, что будем использовать Unity.

Вскоре мы определили три столпа, на которых зиждутся все наши решения по разработке (также учитывая создание художественного оформления):

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

Естественно, в связи с любым из этих аспектов могут возникнуть определённые проблемы, если его элементы недостаточно сбалансированы или плохо реализованы. Слишком запутанная «интрига» непонятна для игрока и сбивает с толку. Чрезмерно сильный стратегический компонент отталкивает или пугает, особенно если люди играют на планшетах (если, конечно, мы не делаем ставку на поклонников Paradox). С другой стороны, очень простая и понятная игра без стратегических решений или загадочности выглядит как пустая оболочка и ничем не привлекает. Особенно это касается опытных игроков, таких как я.

Итак, чтобы построить уровень, нужны строительные блоки.

Построение комнат

В Сети есть тонны и тонны информации по процедурной генерации уровней. Мы хотели учиться по ним. Чаще всего рассматриваются «подземелья», собранные из квадратных «комнат» и «коридоров» с использованием плиток. Мы читали и использовали всё, что можно. Тем не менее, чтобы сохранить образ «разрушенной планеты», Син создал такое художественное оформление — наши комнаты должны были смотреться более органично. Крутая идея, но в результате мы не могли использовать уже созданный кем-нибудь алгоритм (хотя, несколько месяцев спустя кто-то составил вот такой замечательный генератор подземелий).

Мы задаём для каждой комнаты максимальную и минимальную высоту и ширину, используя квадратные плитки. Например, комната может быть минимум 2х2 и максимум 4х4. Появляется множество вариантов размеров. Вот снимок моего инструмента для определения потенциального размера комнаты (в каждом наборе для уровня есть 4-5 пропорций комнат).

Shattered Planet: Процедурная генерация (2)

(Замечу, так как из контекста не ясно: Минимальное и Максимальное Количество Комнат обозначает, сколько раз эти пропорции комнаты могут появиться на уровне).

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

Вверху изображён кусочек набора для уровня «Базовые комнаты»,  в противопоставление таким наборам, как «Без озёр». Используя данные правила для ширины/высоты/озёр мы получаем следующие типы комнат.

Shattered Planet: Процедурная генерация (3)

Как вы видите, практически в каждую из них можно добавить «дыры» или «озера». Генерация происходит полностью за счёт движка. Как дизайнер я только устанавливаю, в каких комнатах есть место для озёр. В зависимости от темы оформления (пустыня, лаборатория и т.д.), «озёра» представляют собой воду, лазеры, кислоту и все в таком роде. Также я могу определить, какие плитки будут использоваться в оформлении комнаты (Грязь и кусты? Камни и трава? И то, и другое?) и препятствия (камни, грибы, и те, и другие, что-то ещё). Ещё один снимок инструмента:

Shattered Planet: Процедурная генерация (4)

(Gen Dirt = Общая грязь, Des Sandstone = Пустынный песчаник, StoneDirt — половина на половину, органично образовывая границу между основными и вторичными плитками оформления).

Помимо этого, благодаря нашему ведущему программисту Майку Дитчберну, в каждой комнате есть набор из 2-4 плиток на «двери» с обеих сторон. Как только они соединяются с другими комнатами, игра использует алгоритм нахождения пути, определяя, где «безопасно» расположить препятствия — например, где они не помешают игроку пересечь комнату и достать сокровище.

Shattered Planet: Процедурная генерация (5)

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

Критический путь

Если вы занимаетесь разработкой уровней, то знаете, что «критический путь» — это путь, который игрок ДОЛЖЕН пройти, чтобы завершить уровень, без побочных тропинок, отвлечений и несчастных случаев. Обычно для привлечения игрока к «правильному» пути разработчики используют награды, те же монетки (или помните, как Элиот приманивал E. T. инопланетянина конфетками?)… и врагов. С одной стороны, это нелогично, но если бои интересны и выступают основной особенностью вашей игры (точно не шпионская игра), игрок будет только рад ввязаться в очередной поединок и идёт вперёд.

Одно из наших первых правил генерации уровней Shattered Planet гласит, что движок должен создать «критический путь» из помещений, включая стартовую «комнату», конечную «комнату-телепортатор», откуда игрок переходит к другим уровням, и все комнаты между ними. Вот небольшой макет. Я составила его вручную в июне 2013 года, чтобы объяснить программистам мои задумки по дизайну:

Shattered Planet: Процедурная генерация (6)

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

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

Shattered Planet: Процедурная генерация (7)

Запертые двери

Добавляя разнообразия и поводов для исследования укромных уголков, мы расставили запертые двери, и раскидали по уровню ключ-карты к ним. Чтобы не останавливать процесс прохождения (или пугать игроков, когда они в спешке — убегают от Мора!) мы решили отгораживать закрытыми дверями только дополнительные сокровища-призы (и монстров!). Следили, чтобы закрытые двери не оказались на критическом пути. Так как мы знали, какие помещения относятся к критическому пути, было достаточно легко отделить один коридор от боковой комнаты и заменить его вот этим:

(Если внимательно присмотреться, на первой картинке из трёх вверху тоже заметна одна закрытая дверь).

Shattered Planet: Процедурная генерация (8)

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

Альтернативные пути

Мы проложили критический путь, организовали боковые помещения, даже добавили закрытые двери, и почти сразу же поняли, что уровни выглядят уныло. Очень много тупиков с постоянными возвратами на основной путь, охотникам за сокровищами не поздоровится. Уровень построен не по фэн-шую. Если уж на то пошло, в представленных выше картах есть только два выхода! Не особо большой выбор.

Для разнообразия и «текучести» после установки критического пути и боковых комнат мы изменили переходы между помещениями. Помните, в «Структуре Помещений» я сказала, что мы выделяли несколько «дверей» на комнату? Мы опять воспользовались этим! Мы (я имею в виду, Майк настроил, и движок сделал) находили пару дверей недалеко друг от друга и проводили между ними как можно более прямую линию, поворачивая под прямыми углами, если необходимо. Так мы избавились от проблемы тупиков и добавили увлекательности исследованиям.

Shattered Planet: Процедурная генерация (9)

Исключения

Как и везде, здесь есть исключения. Даже в разработке видеоигр. Или — особенно в разработке видеоигр.

Большая часть нашей игры создана способом процедурной генерации, однако, нам надо было оставить место и под уровни «ручной работы» — космический корабль, служащий базой игрока, и другие секретные уровни, битвы с боссами и тому подобные события. Мы как можно больше использовали повторяющиеся материалы. Например, в оформлении я использовала те же TerrainData кубы, как и на примерах выше — посмотрите на указатель в центре комнаты — я взяла обычную плитку и заменила её на старую знакомую «Gen Dirt» из предыдущих.

Shattered Planet: Процедурная генерация (9)

Также я могу наполнить местность обычными врагами, препятствиями и вещами.

Помимо этого периодически приходится вносить исправления в результате новых особенностей игры. Включив в игру механику «разжигания огня», мы сделали органические плитки (трава, кусты, мох) поджигаемыми, чтобы огонь плавно распространялся по местности. Сейчас мы придерживаемся правила, что в игровом процессе обязательно должны присутствовать органические плитки, если конечно их отсутствие не обусловлено какими-то важными причинами. Можно полностью изменять среднее соотношение органических/неорганических плиток, чтобы соответственно увеличить/уменьшить их полезность и опасность для структуры и заставить игроков менять стратегию на лету. Однако, если огонь полезен только в одной местности, пользы от такой механики будет немного.

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

Дальнейшие изменения и полученный опыт

Всегда есть чем ещё заняться! Дизайн уровней Shattered Planet прааактически готов, но мы хотим (как вы могли заметить по иллюстрациям Критического пути) изменить телепортаторы так, чтобы игроки могли перемещаться к особым/секретным уровням, по-своему добираться до плавающих локаций, может быть, даже научим персонажей плавать.

Вот всё, чему мы смогли научиться за эти месяцы экспериментирования:

  • С умом применяйте принципы традиционной разработки уровней — они все ещё очень полезны!
  • Процедурная генерация требует невероятно долгого тестирования. Поиск ошибки может занимать несколько часов загрузки и перезагрузки для выделения неправильно работающей части алгоритма.
  • Рассчитывайте на возможные улучшения, после того как «закончили» с применением процедурной генерации. Как и в случае любого другого аспекта дизайна, вряд ли вы вообще когда-нибудь «закончите».

Shattered Planet станет доступна бесплатно на планшетах в марте. За ней выйдет ПК/Мак версия. Если хотите узнать, когда она выйдет, подпишитесь на нашу новостную рассылку или заглядывайте на наш блог.

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


Обсудить статью на форуме

Обновления форума

Копирайты

  • C.O.R.E. © 2009 – 2016
Система Orphus Creative Commons License
Войти на сайт?
Логин:
Пароль: