Жнец кошмаров
Бруно Бодуэн из Blazing Bit Games пришёл к нам, чтобы рассказать о шутере от первого лица. Он поделился идеями, которые легли в основу игры, объяснил, почему был выбран ретро-стиль, и рассказал, как спрайты были сделаны, чтобы выглядеть естественно трёхмерными.

В Nightmare Reaper используется характерный визуальный стиль «2.5D» со спрайтовыми врагами в полностью трёхмерных окружениях. Как вы подходили к воссозданию классического облика эпохи DOOM, используя при этом современные технологии?
Я стремился воссоздать плоский спрайтовый вид старых шутеров по разным причинам, но в основном потому, что мне нравится, как это ощущается, и я думаю, что у них много игровых преимуществ. Я очень внимательно относился к их реализации так, чтобы не жертвовать ощущением спрайтов, но также использовал современные техники для их улучшения там, где я считал это уместным.
Как и во всём в этом проекте, при очень ограниченных ресурсах и времени финальная реализация была неидеальной, но она соответствовала большинству/всем важным моментам, чтобы обеспечить удовлетворительный геймплей и визуалы для целевой аудитории. Также важно отметить, что этот проект начинался на полностью кастомном движке, и я портировал его на Unreal Engine, чтобы иметь в распоряжении больше графических эффектов.
Итак, многие решения могут не подойти для других проектов. У меня также не было опыта работы с Unreal Engine, так что многие вещи неоптимальны, и сейчас я бы сделал многое по-другому. Однако важнее выпустить хорошую игру, чем идеально сделанную, особенно если у вас очень ограниченные ресурсы.



Многие враги представлены в виде анимированных спрайтов, которые всегда обращены к камере. Как вы работали со светом, затенением и перспективой, чтобы эти спрайты выглядели естественно интегрированными в трёхмерный мир, а не плоскими?
Существует множество способов создания спрайтов, но только один я считаю «правильным». Спрайты в Nightmare Reaper (и в каждой классической игре со спрайтами) ориентированы не на камеру, а на ориентацию камеры. Многие современные «бумер-шутеры», сделанные похожими на игры старой школы, часто допускают ошибку, размещая спрайты лицом к игроку, или, другими словами, к камере.
Хотя в некоторых ситуациях это может выглядеть хорошо, в других это действительно ломается, и при создании игры, ориентированной на более старшую аудиторию, я считаю, что этот аспект нужно реализовать правильно. Но опять же, многие игры добились успеха, используя спрайты таким образом, который мне не нравится. Извините за отклонение от темы, но я думаю, важно отметить, что когда вы создаёте игру, вдохновлённую классикой, может быть невероятно сложно сделать всё правильно из-за страсти фанатов.
Я думаю, что спрайты никогда не казались плоскими. Когда вы играете в такую игру, как оригинальный Doom, вы быстро забываете, что враги — это спрайты, и они просто ощущаются как трёхмерные враги, которые органично занимают пространство. Я не пытался изменить что-либо в Nightmare Reaper. Мне нравится, что эти пикселированные враги вписываются в пространство. На самом деле я считаю, что низкополигональные модели более резкие и менее захватывающие.
2D-пиксельная графика имеет множество преимуществ перед 3D, и поэтому всегда будут игры с таким стилем. Но это уже другая тема. Что я действительно изменил в Nightmare Reaper, так это добавил динамическое освещение, тени, bump mapping и такие эффекты, как отражения и рендеринг материалов. Я всегда хотел, чтобы в игре были тени, чтобы улучшить атмосферу и погружение.
Я не делал никакой специальной реализации затенения для спрайтов. Тени, отбрасываемые плоскими спрайтами, появляются на поверхностях и выглядят хорошо. Если вы действительно обратите на них внимание, то когда спрайт показывает свой край к источнику света, тень станет очень тонкой, что выглядит странно, но абсолютно никто из игроков этого не замечает. Это просто хорошо выглядит всё время, и это легко выбросить из головы.
Bump mapping — это ещё одна вещь, которая просто безупречно сработала без какой-либо дополнительной работы. У каждого спрайта есть «bump map», которая заставит движок освещать его так, как будто у него есть глубина, и это ещё больше улучшает трёхмерный вид спрайтов. Иногда это работает просто потрясающе. Эти и большинство других эффектов просто отлично работают со спрайтами, и всё, что мне нужно было сделать, — это поэкспериментировать, и я сразу заметил, насколько хорошо это работает. Это было действительно удивительно.

Ретро-шутеры традиционно полагались на предварительно отрендеренные спрайтовые кадры для анимации. Вы придерживались аналогичного подхода в Nightmare Reaper или экспериментировали с гибридными техниками, такими как рендеринг 3D в спрайты или процедурная анимация?
Мне не нравятся спрайты, которые выглядят предварительно отрендеренными. В классике, даже если спрайты были фактически предварительно отрендерены (или сделаны с помощью физических моделей), каждый кадр вручную прочёсывался, чтобы убедиться, что сами пиксели выглядели хорошо. Если этого не сделать, то мне, как заядлому фанату этих классических игр, это просто кажется хуже.
Я думаю, что преобразование 3D в спрайты — это абсолютно худший способ сделать это. Это всегда заканчивается тем, что выглядит как пикселированное месиво. Я думаю, что это можно сделать приемлемо, в зависимости от фильтра и художественного стиля, но я всё равно буду сильно предпочитать ручной вариант. Именно так мы и поступили с Nightmare Reaper. Абсолютно каждый кадр анимации нарисован вручную. Каждый пиксель был размещён там специально.
Это действительно заставляет искусство выделяться, несмотря на низкое разрешение, и стиль художника действительно проявляется. Это гигантский объём работы, но мы в Blazing Bit Games не боимся этого. Что касается процедурной анимации, я экспериментировал с ней, но она выглядела действительно неуклюже и искусственно. Вам всё равно приходилось тратить много времени на их ручную модификацию, так зачем вообще усложнять и делать всё вручную, если есть преимущества?

Какие инструменты и рабочие процессы вы использовали для создания и анимации спрайтовых врагов и оружия, и как вы обеспечили их согласованность с полностью трёхмерным окружением?
Nightmare Reaper создан в Unreal Engine, поэтому спрайты — это просто материалы, применённые к плоским рекламным щитам (специально созданным, потому что рекламные щиты Unreal Engine имеют ограничения). Есть базовый материал, который предлагает рендеринг спрайтов, и каждый спрайт использует его или версию для правильного отображения. Материалы используют различные входные данные карты, такие как Текстурная карта для цветов, Карта нормалей для bump mapping, Эмиссионная карта для излучающих элементов, таких как светящиеся глаза и т. д.
Что касается инструментов, я лично использую Photoshop 6.0 с двухтысячного года. Я использую бесплатный онлайн-инструмент для генерации карт нормалей из карт высот, и это всё. Как я уже сказал, мы делаем всё вручную. У нас определённо есть мнение, что часто просто лучше усердно работать, чем настраивать сложный рабочий процесс. Другой художник проекта, Brouzouf, использует Corel Painter, Asesprite и более современную версию Photoshop для преобразования файлов.

Многие шутеры, вдохновлённые ретро, сталкиваются с проблемами читаемости, когда на экране десятки врагов и снарядов. Как вы подошли к дизайну визуальной ясности и эффектов в хаотичных боевых сценариях Nightmare Reaper?
Я бы сказал, что Nightmare Reaper определённо виновен в проблемах с читаемостью. Это в основном связано с тем, насколько низким является разрешение. Самый маленький пиксель на самом деле не такой уж маленький. Поскольку я делаю игру, которая мне нравится, это никогда не было для меня большой проблемой, потому что мне легко разобраться в визуальном беспорядке. Я пытался улучшить его разными способами.
Визуальная ясность наиболее важна, когда начинается бой, поэтому, когда это происходит, игра слегка обесцвечивается, пока враги сохраняют свои более яркие цвета. У врагов также есть определённая степень видимости сквозь все частицы. Например, может появиться красная обводка, когда они находятся за взрывом.
Эти эффекты очень редко замечаются игроками, но они делают игру чуть-чуть лучше. Ещё одна хитрость — наш отличный аудиодизайн. Гобелен звуков будет предупреждать вас о врагах и опасностях в любой момент времени, даже если они не находятся в вашем поле зрения.

В Nightmare Reaper представлено огромное разнообразие оружия со случайными характеристиками и чарами. С технической точки зрения, как вы разработали системы, которые могли бы поддерживать такое большое количество комбинаций без нарушения баланса или производительности?
Как и почти каждая система в Nightmare Reaper, это всё управляется с помощью очень быстрого пользовательского кода на C++. Сама система оружия очень лёгкая и существенно не влияет на производительность. На производительность влияют снаряды и их физика. Это не похоже на фокус вопроса, но, по сути, объединение снарядов в пулы очень важно, и, к счастью, Unreal Engine может поддерживать большое количество физических объектов с низким влиянием на производительность.
Сама система оружия — это полностью универсальная реализация оружия. Устанавливая список переменных на определённые значения, вы можете полностью изменить поведение оружия. Это означает, что если бы не искусство и звуки, создание нового сбалансированного оружия заняло бы (и занимало) около часа. Это означает, что код оружия немного сложен, но мы этого тоже не боимся. Ещё один уровень сложности и проблем с производительностью возникает с оружием в многопользовательском режиме, но это в основном другая тема.

Уровни сочетают в себе ручной дизайн с процедурными элементами. Как эти системы работают вместе за кулисами, чтобы сохранить непредсказуемость забегов, сохраняя при этом высокий уровень плавности?
Не говорите никому, но уровни не генерируются случайным образом во время выполнения. Большинство процедурной генерации уровней в играх делается с комнатами, которые вписываются в форму сетки, но мне это никогда не нравилось, и я хотел по-настоящему органические уровни с интересными формами. Генерация таких уровней приведёт к тому, что они будут скручиваться и перекрываться друг другом.
Идеальным решением было предварительно сгенерировать множество потенциальных уровней и выбирать один случайным образом во время выполнения. Элементы этих предварительно сгенерированных уровней также в определённой степени рандомизированы. Это позволяет уровням загружаться молниеносно, и вы никогда не получите один и тот же. Если только вы не умрёте много раз на одном и том же уровне.
Я решил использовать комнаты, сделанные вручную, которые сцепляются друг с другом, вместо того чтобы делать это полностью случайным образом, потому что это был самый быстрый способ сделать уровни, которые хорошо выглядят и при этом выглядят случайно. Создание алгоритма, который делает по-настоящему запоминающиеся комнаты со своей индивидуальностью, возможно, но очень сложно.
Создавая их вручную, каждая комната может иметь свою тему и точку интереса, чтобы помочь игрокам запомнить, куда идти дальше, если им придётся вернуться назад. Конечно, в этих вручную созданных комнатах всё равно есть элемент случайности. У каждого уровня также есть своя индивидуальность. При генерации случайного уровня есть переменные, которые вы можете настроить, чтобы получить определённую конфигурацию уровня и задачи.
Так что, даже если комнаты отличаются и не соединяются одинаковым образом, вам всё равно нужно решить ту же «головоломку», чтобы пройти этот конкретный уровень. Например, на уровне может потребоваться красный ключ, головоломка с переключателями и состоять из определённого количества комнат определённых типов.
Что касается того, как всё это было сделано, снова использован собственный C++. Создание алгоритма, который бы генерировал уровни случайным образом, заняло массу работы, но, написав короткий скрипт, вы можете создать собственный уровень за час.

Учитывая, что новый кооперативный режим позволяет до четырёх игроков проходить всю кампанию, какие технические задачи были самыми сложными при адаптации преимущественно однопользовательского опыта к многопользовательскому?
Nightmare Reaper никогда не был рассчитан на мультиплеер, так что это была масштабная задача. У меня уже был большой опыт создания многопользовательских игр. Я работал в Ubisoft программистом сетевых игр почти 6 лет. Одним из больших препятствий было обнаружение и обход ограничений и проблем Unreal Engine, связанных с многопользовательскими системами.
Полностью изменить машину состояний/порядок событий на игровые состояния было настоящей задачей, особенно учитывая, что я начал эту задачу с нулевым опытом работы с мультиплеером Unreal Engine. Однако самой большой задачей была репликация оружия. Мне пришлось изменить систему, чтобы синхронизировать оружие по входам, а не по фактической функциональности оружия, потому что это было бы слишком обременительно для пропускной способности.
Мне также пришлось внедрить систему проверки попадания, чтобы сервер был авторитетом в том, что происходит в игре, и мог передавать это всем. Это означает прогнозирование того, где клиенты находились в момент выстрела, и корректировку событий, произошедших на клиентах, чтобы отразить то, что на самом деле произошло на сервере.
Это было особенно сложно, потому что в Nightmare Reaper используются настоящие физические снаряды, на которые влияет гравитация, для каждой пули. Unreal Engine не синхронизирует физику, и они могут вести себя совершенно по-разному из-за задержки.

Бои в Nightmare Reaper чрезвычайно быстрые и насыщенные эффектами. Какие методы оптимизации вы использовали, чтобы поддерживать плавную производительность, пока на экране происходит так много всего?
Активное использование собственного C++. Это намного быстрее, чем использование Unreal Engine blueprints. Ещё одним ключевым аспектом был пулинг снарядов, а также взрывов, крови, гильз и всего, что может привести к будущим действиям. В зависимости от настроек качества мы также изменили множество систем.
Мы могли уменьшить рендеринг и дистанцию обработки объектов или источников света, снизить качество эффектов частиц, таких как дождь, убрать физику воды, использовать простую физику на C++ для некоторых объектов и ограничить максимальное количество объектов определённых типов одновременно. Unreal Engine/современные движки определённо содержат определённое количество раздутия, которое трудно/невозможно преодолеть, и я не полностью удовлетворён результатами.

Ретро-эстетика игры распространяется на её пользовательский интерфейс, мини-игры и системы прогресса. Как вы подходили к разработке этих элементов, чтобы они вызывали ностальгию, но при этом были интуитивно понятными для современных игроков?
Честно говоря, я не думаю, что пользовательские интерфейсы для шутеров сильно изменились с времён «шутеров-бумеров». Ключевым аспектом было сохранение блочного пиксель-арт-вида повсюду. Я старался максимально ограничить количество входов и использовать стандартные элементы управления, которые были наиболее знакомы. Я также с первого дня убедился, что игра будет хорошо работать с геймпадом, что заставляет вас упростить и оптимизировать многие вещи.
Я также приложил немало усилий, чтобы сократить количество текста в игре. Изображение гораздо яснее и его быстрее понять, и я старался проектировать вещи настолько очевидными, насколько это возможно. Я также не хочу слишком сильно держать игрока за руку, и это было для меня действительно важно, поэтому каждая часть игры пытается показать вам, что вы должны быть внимательны и разобраться во всём самостоятельно.
Оглядываясь назад на разработку Nightmare Reaper, были ли какие-нибудь неожиданные технические открытия или творческие прорывы, которые существенно повлияли на окончательный вид и ощущение игры?
Игра кардинально изменилась с момента первой концепции, так что таких событий было много. Изначально у игры должен был быть плоский дизайн уровней, как в Wolfenstein 3D, но я добавил немного вертикальности для тестирования, и после этого я не мог вернуться назад.
Я думаю, что использование физических объектов для пуль было ещё одним важным моментом, в котором я не был уверен, что это сработает, но из-за этого стрелять действительно приятно, а физика с этим хорошо справляется. Трудно сказать, что ещё является изюминкой, потому что всё развитие игры было сплошным экспериментированием и трансформацией через игру. Вот почему игра увлекательная, потому что она была сформирована мной, играющим в игру, и направляла её к тому, что было для меня увлекательным.

Blazing Bit Games
Интервью проведено Дэвидом Ягнео
Автор: Blazing Bit Games
Материал подготовлен на основе статьи 80.lv. Перевод — Skills Up.