28/04/2020

Дизайн уровней в масштабной ролевой игре

Age of Silence от команды Game Gods — однопользовательская партийная игра от первого лица, вдохновленная сериями Might and Magic и Wizardy. Действие происходит в фэнтезийном мире, восстанавливающемся после катастрофы. Группа героев отправляется исследовать мир, чтобы узнать, куда исчезли их боги. Оставаясь партийной RPG от первого лица, Age of Silence также сочетает элементы визуальной новеллы, квеста и тактической RPG. В этой статье мы хотим рассказать о том, как в нашей команде устроена разработка локаций. 

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

Планирование локации

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

Первоначальная план-схема

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

  • 1 уровень — главное здание, богатое убранство; 
  • 2 уровень — рабочая область, обслуживание территории и местных жителей;
  • 3 уровень — природная область, место проживания крестьян, работающих в соседних полях.
Доска референсов

На первом уровне должны были располагаться менее функциональные и направленные на созерцание (ротонда, арка с ниспадающим плющом и сад в отдалении от дома) и занятия детей объекты. На втором — жилые/рабочие дома местных специалистов: кузнеца, конюха, плотника и кожевника. А на третьем необходимо было продемонстрировать самообеспечение и оторванность населения нижнего уровня от верхних.

Ранние заметки о метриках персонажей не подходили как по динамике игры, так и по построению пропорций окружения. Поэтому мы собрали небольшой полигон с базовыми тестами на передвижение игрока: высота и длина прыжка, габариты стоя и в приседе, угол наклона поверхности, доступный для передвижения игроку и т.п. На этом полигоне мы и тестировали изменения метрик.

Примеры метрик и полигон для их снятия

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

Первоначальный блокинг главного здания

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

Первоначальный блокинг 1-го уровня

Дальше было необходимо тестировать блокинг силами команды и вносить корректировки. Первое же, на что обратили внимание — малое количество объектов для навигации в пространстве, для более подходящих результатов были расставлены временные меши:

  

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

   

Схема основных транзитных путей

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

Добавление визуальных ориентиров и направляющих с помощью пристроек:

  

На следующем этапе нужно было фиксировать задачи для 3D отдела,  предстояла организаторская работа, а также плотное взаимодействие с главами соответствующих отделов для принятия оптимальных решений по загрузке команды. Были сформированы таски/ТЗ для специалистов по персонажам и художников по окружению в 3D отделе, также были определены типы взаимодействия игрока с окружением на ситуативных примерах (цепочка последствий от минимального вмешательства игрока, типы интерактива и т.п.), что тоже относилось к анимации NPC и скриптам на уровне.

Зоны основного пребывания NPC в Риверморе

После согласования спорных аспектов с другими отделами, было выработано общее видение и внесены корректировки в концепт уровня и некоторых квестов.

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

Первоначальный вариант таверны

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

Кузница
Дом рабочего, развилка к главному дому: через плотника (налево) и по основной тропе (направо)

Помимо внесения визуальных правок в уровень, были добавлены дополнительные пути передвижения между вторым и первым уровнями —  подъем по веревке и проход через рабочее место плотника.

Лут на локации и основной проход к нему
Зоны локации по уровням

Первый уровень был разделён на зоны исследования: базовая (транзитная) зона при входе, зона взаимодействия с NPC возле входа в главное здание и прикрытая от глаз NPC зона исследования, где были запланированы основные секреты, проходы и лут.

Выработка применяемых методик и технологий

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

Тест инстансов для декалей

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

Были разработаны первоначальные шаблоны (мастер-материалы) для различных элементов (пропсы, декали, камни/скалы, архитектура), которые в процессе разработки редактировались, и изменения автоматически применились ко всем объектам на уровне.

Мы разделили материалы на несколько типов:

  • Пропсы (небольшие объекты окружения с уникальными текстурами)
  • Декали (различные текстуры, которые накладываются на поверхность с помощью шейдера, по простому — наклейка)
  • Архитектура (крупные модульные части окружения. они характеризуются тайловой разверткой. [прим. — Модульные части зданий])
  • Растительность
  • Камни\скалы
  • Уникальные материалы

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

Пресет LOD’ов в материале

MasterGrass нужен для глобальной настройки отдельных аспектов материалов. В каждом мастер-материале прописан пресет LOD’а, который включается в следующем инстансе.

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

Для удобного внедрения и простого редактирования механик исследования мы сделали базовые сущности сундука, записок и собираемых предметов. 

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

Примеры использования цветового кодирования на локации

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

Демонстрация цветовой палитры локации

Получается, что мы используем преимущественно верхнюю часть цветового круга (теплые оттенки). У нас остались оттенки синего, фиолетового и холодный красный.

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

Демонстрация читаемости выбранных элементов визуального языка в контексте локации

Синий цвет мы решили использовать как редкий акцент в наиболее важных\интересных\необычных местах, например, в квестовых элементах:

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

Обозначение возможных путей

После заморозки основного блокинга локации была составлена ориентировочная карта объектов интереса (записки, сундуки и предметы для осмотра) и выделены цвета для их обозначения (оранжево-красный — лут, синий — квестовый предмет, белый — направление движения в "секретных" проходах). 

Полировка и финал

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

Пример использования метрик при создании уровня

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

Демонстрация активностей на крыше главного здания

Ближе к завершению этого этапа tech artist на нашем проекте завершил динамическое изменение атмосферы (тумана), неба, ситуативный спавн партиклов и параллельную настройку системы дня/ночи и дождя на основе “ultra dynamic sky”, благодаря чему в итоге мы имеем такое сочное изображение дождливой погоды. 

Дождливая погода на уровне

Появление этих функций повлекло за собой необходимость переработки материала landscape’а и исправление багов смешивания текстурных слоев. Но оно того стоило.

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

Конечный вариант таверны

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

Конечный вариант входной зоны главного дома

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

Результат ручной замены и оптимизации коллизии на уровне:

  

В связи с возникающими на протяжении всего производства проблемами с созданием уникальных моделей, было принято решение использовать сторонние ресурсы и собирать отдельные элементы уровня и здания из составных частей (вы наверняка узнаете некоторые ассет-паки и измененные модели из Quixel Megascans). Вследствие чего, помимо чистки и оптимизации зон перемещения игрока, возникла необходимость отключать коллизию у большинства построек и вручную выставлять Blocking Volume по габаритам, например, стен (на паре ракурсов, расположенных выше, голубое — коллизия, встроенная в меши, розовое — Blocking Volume).

Заключение

Финальную часть хочется обрисовать буквально парой предложений, но для нас есть необходимость разделить выводы на "Арт" и "Дизайн".

Арт. Самое сложное с точки зрения арта — переработать все доступные материалы и задать им схожую стилистику. Мы использовали цветовую вариацию по глобальным координатам, vertex paint (для примешивания земли и мха), а также вручную редактировали текстуры при импорте ассетов в движок.

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

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

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

Нет предела совершенству, всегда можно сделать лучше, но не менее важно всегда думать о ресурсах команды.

* * *

Над статьей работали:

Текст: Дмитрий Варчев, Александр Станин, Николай Персианов, Юлия Воронюк
Level art / Level design: Дмитрий Варчев & Александр Станин
Tech Art:
Артур Алдошин
Программисты: Александр Лапко и Дмитрий Шелепев
Нарратив: Николай Персианов и Юлия Воронюк

Полный набор материалов доступен по ссылкам: 

[ART] Александр Станин
[ART] Дмитрий Варчев
[DESIGN] Александр Станин

Недавние статьи

Мечтать, не отступать и не сдаваться

24/09/2020
Рассказываем, как команда Game Gods борется за новое прочтение жанра партийных RPG от первого лица, надеясь раскачать в нем второе дыхание.

Каждый костер когда-то догорит

23/09/2020
Геймдев — это состояние души. Именно так думают в Payara Games, создавая небольшой командой narrative story driven игру под названием Beyond The Thaw.

Сценарий вертикального среза

16/09/2020
Алексей Савченко на конкретном примере показывает и рассказывает, как сделать очень важный для разработки игры документ. Образец документа — прилагается.