За последние несколько лет мне снова стали нравится игры, с разделением экрана (англ. Split Screen). Особенно в жанре гонок, с динамичным геймплеем прекрасно подходящим для игры в компании друзей. Существует, конечно и кооперативный режим, который значительно популярнее разделения экрана, но он не всегда удобен для игры двух или более игроков на одном экране.

В последнее время разработчики гоночных игр практически упразднили режим Split Screen

К сожалению большинство гоночных игр, которые мне нравятся, не поддерживают функцию разделения экрана, например её нет в Race Driver: Grid, Need for Speed: Shift или FlatOut 2 (без модов). Но некоторые разработчики все же уделяют этому внимание и даже при наличии сетевых режимов, оставляют в своих проектах возможность использовать локальный мультиплеер рассчитанный на двух, трех или четырех игроков. К числу таких видеоигр можно отнести некоторые части DiRT, Horizon Chase Turbo, Monster Jam, Road Redemption, MX vs ATV и некоторые другие.

Во что играть?

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

Descenders

У игры веселая физика вкупе с аркадным геймплеем, что позволяет быстро привыкнуть к управлению и проходить сгенерированные трассы одна за другой не задумываясь над тем, какую кнопку сейчас нажать, как это не редко бывает в подобных играх. Хотя Descenders и с мультиплеером, но возможности включить режим разделения экрана, чтобы проходить трассы или соревноваться с друзьями на одном ПК нет. Аналогичных игр на тему велоспорта поддерживающих SplitScreen, найти не удалось. Это и заставило задуматься, о создании своего проекта.

Захотел игру и не сделал

Стоит отметить, что желание сделать велоигру появилось еще до того как поиграл в Descenders и были даже некоторые наработки игровых механик. В то же время, недолго размышляя над описанием и оформлением, я создал страницу будущей игры в Steam, которую назвал BIKEOUT (решил «скрестить» велосипеды и FlatOut).

После публикации страницы начал поиск референсов (англ. reference) для создания уровней и препятствий на трассах, а также похожих по тематике видеоигр, среди которых оказались Lonely Mountains: Downhill и вышеупомянутая Descenders. В обоих играх основной целью было добраться до финиша не разбившись и как дополнительное развлечение — выполнение трюков. Но самое главное, что привлекает в таких проектах (судя по отзывам), это физика управления велосипедом.

Lonely Mountains: Downhill

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

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

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

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

Начало разработки игры

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

Велосипед за $79

Для проекта я использовал привычный мне движок Unreal Engine, который долгое время не хотел обновлять до 5-й версии, но вечно сидеть на «4-ке» не самый лучший вариант и было решено работать в свежей версии, с технологиями «нанит» и «люмен». Но от них, пришлось отказаться, потому что с новой системой оптимизация явно не улучшилась в сравнении с привычными LOD’ами (упрощают сетку модели в зависимости от расстояния до нее), а обновленное освещение не стал использовать, по причине появления некоторых артефактов у теней. Впрочем, я мог не совсем корректно настроить эти технологии и в руках грамотного специалиста, думаю они бы показали более удачные результаты, нежели у меня (к сожалению скриншотов для сравнения не оставил).

3D модели для игры

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

Деревья, которые я когда-то сажал в Майе

На самостоятельное создание модели велосипеда, персонажа или каких-нибудь объектов окружения для игры про даунхилл я не рассчитывал — сложность моделей была явно выше, нежели домик или примитивная машинка из учебного курса. А по хорошему, кроме создания моделей в редакторе, еще требовалась их подготовка к экспорту в движок (доработка до т.н. «Game Ready» оптимизации), что имеет свои особенности, которые могут впоследствии сказаться на производительности игры. Поэтому работу с 3D графикой лучше доверить опытным специалистам или использовать готовые для игр модели, приобретенные, например в Marketplace UE.

Так выглядит «фуллфейс» шлем

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

Mannequin из Unreal Engine

В Unreal Engine для игрового персонажа по умолчанию используется Mannequim (гуманоидный робот), у которого «из коробки» уже реализовано множество возможностей в зависимости от выбранного типа проекта. Но, что самое главное, скелет (Epic skeleton) этого персонажа является неким стандартом для большинства 3D художников создающих модели для Unreal Engine и поэтому вам не нужно беспокоиться о совместимости той-или иной модели с анимациями, что уже были добавлены в проект. Важно только, чтобы персонаж имел такой же скелет.

Про дизайн уровней

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

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

Типичная ежемесячная раздача в Marketplace UE

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

Procedural Landscape Ecosystem (PLE)

Игровые меню, UI и локализация

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

О качестве переводов

По моим наблюдениям, для переводов на/с языки(-ов) относящихся к группам в составе славянской ветви индоевропейской языковой семьи (в частности, восточнославянской), лучше всего подходит Яндекс Переводчик. Например, для переводов с русского на английский, с украинского на польский, с французского на белорусский и т.д. Для всех остальных языков подойдет Google Translate. Но в целом качество переводов у обоих сервисов-переводчиков в настоящее время на достаточно хорошем уровне.

В Яндекс Переводчике нет разделения на китайский упрощенный и традиционный, зато есть разделение португальского и португальского-бразильского, которого нет в Google Translate. Так, что при переводах на большое количество языков, вам скорее всего потребуется использовать не один сервис-переводчик.

Про субтитры

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

Так выглядят самодельные субтитры

О костылях и полной поддержке геймпадов

Отдельно хотелось бы написать про геймпады и UI. Я еще не сталкивался с таким количеством костылей, как в реализации поддержки геймпада в игровых меню или интерактивных элементах интерфейса созданных с помощью виджетов в движке Unreal. Управление в игре (имею ввиду управление персонажем) обычно реализуется предельно просто, но для того, чтобы вы могли нажать ту или иную кнопку в меню используя только контроллер или клавиатуру, вам скорее всего, потребуется придумывать собственное решение. Я с этим не сталкивался, потому что в своих проектах обычно ограничивался мышью. Но в этот раз решил добавить полную поддержку геймпада, чтобы не лезть за мышкой, каждый раз при попадании в меню, которых у меня получилось два: главное и выбор уровней.

Меню проще и не придумать. С динамичным фоном в игре выглядит хорошо

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

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

О музыке и озвучке

Изначально хотел использовать музыку подобно той, что звучала во FlatOut 2. Найти такую с лицензией CC или без АП, к сожалению, не удалось. Пришлось снова зайти в маркетплейс и поискать что-то подходящее. Названия активов впечатляли, «Real Rock Music Pack», «Ultimate Music», «Premium Game Music», «Elite Game Music», но на деле оказывались однотипными композициями не лучшего качества, которые к тому же плохо зацикливались (хотя должны были, ведь авторы добавляли отдельные «loop» версии к своим трекам).

Самый настоящий рок, можно не сомневаться

Для озвучки я использовал уже знакомый мне сервис озвучивания на основе ИИ SteosVoice (ex. CyberVoice), в котором за пару лет появилось достаточно большое количество голосов, из которых нашел наиболее подходящие — Хьюстона (Голос персонажа из The Riftbreaker) и Виктории (Женский голос с приятным тембром). Текста в игре было не так много, а скорость озвучки при помощи ИИ происходит практически мгновенно. На все это (включая написание примитивных шуток для компаньона игрока) у меня ушло не более часа. Оставалось лишь добавить в проект и подготовить субтитры.

Голос персонажа Хьюстон из The Riftbreaker.
Голос персонажа Тинкер из Dota 2
Голос персонажа Джин из Лиги Легенд
Просто женский голос с приятным тембром

Игра за выходные

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

Самыми интересными, мне показались уровни с полосой препятствий

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

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

Оправдание и этичность использования ассетов

Также хотелось затронуть тему использования активов с различных магазинов подобно Asset Store (Unity) и Marketplace (Unreal). Среди разработчиков игр есть значительная часть тех, кто осуждает всяческое использование готового контента и укоряет тех, кто использует его в своих проектах. Контент (обычно, подразумевают 3D и 2D графику) по их мнению, в инди-проектах должен создаваться с нуля разработчиком или командой. Но это не совсем правильный подход к созданию игр. Контент изначально создаётся для того, чтобы его использовали в своих проектах разработчики, которые не могут позволить себе нанять отдельного специалиста или сделать сами. И порой, хорошие готовые решения не только экономят время и ресурсы, но и позволяют разработчику не понижая качества завершать проект в срок. Ведь актив созданный опытным специалистом узкого профиля, будет гораздо более качественным, нежели тот, что создаст инди-разработчик, занимающийся всем подряд. В общем то, магазины контента для разработчиков игр и создаются с целью помочь им в этом не лёгком деле.

Стоит ли использовать активы?

Использовать одни и те же активы в десятках проектах, конечно плохо, но в нескольких не связанных по жанру играх вполне разумная практика. Например, в моем проекте из популярных активов используется «City Park», который вы наверняка могли узнать из некоторых инди-игр, созданных на Unreal Engine за последние два года. Также использовались горы из пака «Spring Landscape», который я также встречал в некоторых играх. Но я более чем уверен, что вы (если конечно вы не мониторите все товары на Marketplace) не встречали в играх всех остальных активов, которые были использованы в проекте, и уже тем более в такой специфичной тематике, как велоспорт.

Пример страницы Marketplace UE

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

Маркетинг, которого не было

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

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

Тестирование обложки

Я решил менять изображения, чтобы выявить наиболее привлекательное (подобно A/B-тестированию). На данный момент успел протестировать 2 картинки, на одной была красная надпись, на другой белая. С первым изображением коэффициент переходов был в районе ~8%, со вторым этот показатель стал ~17%.

Обложка BIKEOUT

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

Демоверсия

Демоверсия, которую я загрузил в Steam оказалась не удачной и принесла по моим расчетам около 60 вишлистов. Я это связываю с несколькими факторами: обучающий уровень в игре слишком скучный, а игроки скорее всего ожидают более динамичного геймплея зайдя на страницу с игрой; небольшое количество уровней, рассчитанных на 20-30 минут прохождения демо; в игре нет прогрессии и игроку не к чему стремиться.

Хорошая демоверсия — отличный способ поднять вишлистов

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

Реддит и блокировка

Когда я начал писать эту статью, появилось желание сделать публикацию с гифкой на Reddit, в типичном для r/gaming формате, чтобы посмотреть приблизительные метрики по переходам в Steam и конверсию в вишлисты. Но для начала нужно было сделать хотя бы один пост не связанный с проектом, иначе сразу бы мог получить блокировку за спам или рекламу на сабреддите. Я взял недавно созданную пикчу для моей прошлой статьи и опубликовал её.

Я бот

Модераторам видимо эта пикча не понравилась и спустя несколько минут меня расценили как бота, выдав бан в «r/gaming». Видимо их смутил мой ник, состоящий из случайных букв без какого-либо значения, или слишком низкая частота публикаций. Но объяснять причину блокировки не стали, ответив на мое возражение, что-то вроде: «Мы точно знаем, что вы бот и продолжать диалог не намерены». После чего, я ради интереса сделал тот же самый пост в «r/Steam» — как и ожидалось, никто не заблокировал, а публикация получила положительный отклик от аудитории. И это учитывая что у меня была нулевая карма в этом сабреддите, а в «гейминге», как раз большая за счет прошлых публикаций.

На следующий день пост все же удалили и модераторы r/Steam (без причины). Но пока он висел, я немного поднял кармы и получил от какого-то благодарного пользователя награду, за которую выдали Reddit Premium.

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

Тот несчастный пост

Послесловие

Разработка игр в современных движках все больше и больше напоминает конструктор, из которого можно собрать что угодно, в любом жанре и с любым контентом. А порог входа, который обычно считают гораздо выше, чем в других более привычных IT-сферах, например web-разработке, сейчас уже не кажется таким недосягаемым. Процесс создания игр становится более творческим, нежели техническим и в скором времени, думаю это будет напоминать работу в Roblox Studio или UEFN.

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


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

Great Creator