Hard Glide — моя первая игра на Unreal Engine

Привет! Я парт-тайм инди-разработчик и я хочу рассказать о моём первом проекте на движке Unreal Engine. Ну и демку этого самого проекта в конце показать.

Нет, не то, чтобы это моя первая игра как таковая, но так получилось, что до этого я в основном занимался веб играми на флеше (мир праху его ✝), либо мобильными. В общем, за standalone игру я взялся впервые (если не считать моих совсем уж древних поделок).

Выбор движка

Это моя первая игра на серьёзном движке стороннего производителя. До этого обычно я делал игры либо на своём собственном недодвижке, либо через небольшую прослойку ввиде кроссплатформенных графических и звуковых библиотек. У меня есть определенная мания к тотальному контролю и оптимизации. Наверно это привычка осталась со времен флеш-игр, когда приходилось биться в браузере за каждый такт процессора, деля ресурсы с десятком флеш баннеров вокруг игры😃 Также мои предыдущие игры были почти все в 2d, так что переход к полному 3d можно считать для меня тоже новым явлением.

Hard Glide — моя первая игра на Unreal Engine

Поначалу я даже взялся опять писать свой собственный недодвижок на OpenGL, но потом быстро (месяца через четыре) понял, что времени у меня стало меньше, а игровые 3d движки — сложней. И чтобы вручную реализовать функции, которые необходимы, мне нужно потратить несколько лет в лучшем случае. Так что я, переломав спицы своего велосипеда и выкинув его на помойку, пошёл смотреть что там из 3D движков сейчас актуально.

Hard Glide — моя первая игра на Unreal Engine

Оказалось, что в мире сложилась прочная олигополия ввиде движков Unity и Unreal Engine. Есть конечно и другие варианты, однако по распространённости они сильно проигрывают первым двум. А я уже не раз обжигался на том, что использовал мало распространённые (и следовательно, мало оттестированные и слабо поддерживаемые) библиотеки, так что решил остановится на первых двух вариантах.

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

Далее пошёл скачивать Unreal. С порога на сайте меня приятно удивила надпись «Плати после того, как достигнешь успеха», и внизу маленьким шрифтом приписано «после того как выручка вашего проекта достигнет 1 лям баксов плати нам 5%». Ого ничего себе, вот это номер! А ведь лет 10 назад вроде его за какие-то серьёзные деньги давали использовать, да вроде? Как быстро время летит, мы так скоро в коммунизме окажемся… Плюс ко всему прочему оказалось к нему идёт ещё гигантская бесплатная библиотека ассетов Megascans, программа для PBR текстурирования Quixel Mixer и ещё полные исходники самого движка, в которых можно копаться и изучать! (нет, видимо от своей мании мне не отделаться никогда). После этого я запустил движок и начал тыкать во все его кнопки и менюшки. И чем больше я тыкал, тем больше удивлялся: движок с ходу показывает крутую картинку, сразу из коробки доступны множество классных возможностей, субъективно — даже интерфейс более продуман и интуитивен.

Не хочу конечно развивать холивар Unity vs Unreal, я уверен мне приведут кучу доказательств что я с ходу «не нашёл» и «не разобрался», но по своим первым ощущениям после установки Unreal у меня вызвал «Вау» эффект, а после установки Unity — только «ммм… ок». Так что будем считать это моим субъективным мнением.

Плюсы и минусы Unreal

Почему я выбрал Unreal для своего проекта:

  1. Написан на моём любимом С++, с которым я имею дело на основной работе.
  2. Сразу качественный рендер и куча возможностей прямо из коробки, без дополнительных плагинов. Всё есть в базовом движке, и за время разработки проекта я даже никаких плагинов не устанавливал, кроме одного (LDAssistant)
  3. Общее впечатление «взрослости» продукта и нацеленности на качество картинки. Когда я уже начал делать на нем свою игру, я стал замечать ещё такую интересную особенность движка — как только я задумываюсь на тему «а вот не плохо было бы такую функцию тут иметь», начинаю искать в интернете и хоп, она там действительно уже есть 😀 сразу видно, что инструмент полировался на тысячах коммерческих проектов и уже закрывает типичные потребности разработчика.
  4. Лицензия. Мне нравится идея отчислений только после успеха проекта.
  5. Мне нравится куча дополнительного бесплатного контента и инструментов. Та же библиотека мегасканов и инструменты для текстурирования. В самом же магазине эпиков постоянно что-то раздаётся бесплатно, и это, не считая постоянно доступного бесплатного контента.
  6. Производительность. Я проводил довольно много стресс-тестов и пришёл к выводу что движок весьма неплохо оптимизирован даже в довольно сложных сценах выдаёт приемлемый FPS.
  7. Просто невероятное количество возможностей для просмотра разного рода статистики, поиска узких мест, оптимизации контента и прочего для подпитки моей мании тотального контроля.

Минусы же движка мне видятся такие:

  1. Движок всё-таки сложный комплексный продукт — и чтобы его начать использовать, в нём нужно серьёзно разбираться (особенно если используешь С++). Это не какая-то там библиотечка, в которой можно разобраться за несколько дней. Слава богу, для него есть много полезной документации и примеров.
  2. Движок использует свою систему рефлексии для редактора, свой сборщик мусора, свой препроцессор, кучу собственных типов и классов. И если вы не хотите проблем, то по крайней мере с объектами движка нужно использовать только их. Я по началу пытался нарушать это правило и движок больно бил мне по рукам.
  3. Принятый в движке стиль кода. Куча префиксов у классов (сейчас это уже не модно), Все Названия С Большой Буквы (я привык методы\поля писать со строчной), ну и много остального такого спорного, вроде названия методов (Знаете как получить длину массива? Size()? Length()? Может Count()? Нет, Num() 😁 Эпики знатные выдумщики).
  4. Достаточно бойлерплейт кода, который никак не сократишь (в основном это тот код, который относится к рефлексии для связи с редактором и блюпринтами).
  5. Беспощадность к ошибкам. Если что-то идёт не так, редактор с треском крашится, можно было бы наверно какой-нибудь sandbox придумать.
  6. При разработке требователен к ресурсам компьютера, и в основном я про ОЗУ и диск. Послушайте моего доброго совета — если хотите работать с С++ проектом легко и приятно, сразу докупайтесь памятью до 32 Гб и ставьте систему, студию, сам движок на шустрый SSD, иначе вы будете страдать (на жёстком диске компиляция даже при минимальных изменениях могла длится несколько минут! и это при всех включённых рекомендованных оптимизациях).
  7. Иногда не отражает результат изменений С++ кода в редакторе. Приходится перезагружать редактор. Вылеты также при этом периодически бывают.

Да кстати, в движке есть интересная возможность визуального программирования под названием Blueprints. Когда я первый раз это увидел то был очень вдохновлен этим. Однако, когда я начал реально это использовать, то всё больше и больше кода перекочёвывало у меня с блупринтов на С++, т.к. если количество нодов становилось больше 10-20 читать и править такой блюпринт становилось невыносимо больно (хотя это частично решается пользовательскими функциями). Простейшие конструкции с циклами и ветвлениями на блюпринтах превращались в монструозные сооружения. В общем мне, как программисту, проще делать почти всё на С++, а в блюпринты выносить минимальные вещи, в основном касающиеся визуальной настройки объектов, интерфейса, анимации, и т.д. Жаль только многие из примеров по движку именно на блюпринтах, приходится их как-то самому адаптировать под С++ код.

Привет, я твой блюпринт, пора приступать к отладке...
Привет, я твой блюпринт, пора приступать к отладке...

Проект Hard Glide

Итак, раз я решил заняться новыми для меня standalone 3d играми, использовать новый для меня движок, да ещё и новый стек создания графики (blender + quixel mixer для pbr текстурирования), то мне необходимо было выбрать не сильно масштабный проект, но с определённой интересной концепцией и чтобы все основные функции, типичные для игр, в нём были (для освоения движка на приемлемом уровне).

Кстати я несколько раз участвовал в местном #screenshotsaturday так что может кто уже видел мой проект 😉

Геймплей

Так в чём основная идея моей игры? По сути, это авоидер (жанр популярный на заре флеш-игр, хехе), но на стероидах. Лично я формулирую его как «аркадный скилл-шутер». Игрок управляет инерционным девайсом (по сюжету – хакнутым сервисным ботом) при помощи только мыши. Главная задача — собрать все кристаллы на арене и успеть смыться с нее до того, как кто-нибудь размажет игрока. А размазаться есть об чего: в руках игрока быстрый, но крайне хрупкий девайс, который теряет здоровье даже от врезания в стенки уровня, не говоря уже про врагов или других опасных вещей. С течением времени на уровнях появляются более сложные препятствия и враги, например стреляющие турели, двигающиеся блоки, таранящие боты, магниты, лазерные двери и т.д. Боссы тоже будут – на этих уровнях нужно будет не собирать кристаллы, а просто уничтожить босса (вот это поворот!).

Hard Glide — моя первая игра на Unreal Engine

Слава богу, на уровне есть не только «опасные” и “крайне опасные» объекты, но и бонусы (ака powerups), которые каким либо образом улучшают функционал нашего хрупкого бота: можно взять щит, или замедление\ускорение, ремонт, остановку врагов на время, либо оружие для стрельбы. Также на уровне встречаются особые зоны-модификаторы, которые влияют на игрока в лучшую или худшую сторону.

Hard Glide — моя первая игра на Unreal Engine

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

Hard Glide — моя первая игра на Unreal Engine

В целом я вдохновлялся аркадными играми прошлого, проект мимикрирует под аркады начала 2000х, однако с добавлением современной графики и эффектов. Игра нацелена на тех игроков, которые любят экшн игры на ловкость вроде Geometry Dash, Super Meat Boy и т.д.

AirXonix (2001) и Hard Glide
AirXonix (2001) и Hard Glide

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

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

Разработка

Сейчас я использую связку Blender – для 3д моделлинга и развёртки, Quixel Mixer – для текстурирования, Unreal Engine как фреймворк для самой игры, Visual Studio – как редактор кода. Они имеют довольно хорошую интеграцию друг с другом. Также использую библиотеку megascans, как базовый набор текстур для текстурирования в Quixel Mixer, которые можно комбинировать между собой, создавая собственные.

Грузовичок, спешно увозящий кристалл от игрока в неизвестном направлении
Грузовичок, спешно увозящий кристалл от игрока в неизвестном направлении

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

Hard Glide — моя первая игра на Unreal Engine

Визуальный стиль и сеттинг

Я люблю реалистичный стиль в графике. Не скажу, что я никогда не делал игр со стилизованной или «мультяшной» графикой, но душа всё же лежит больше к реалистичному представлению. Поэтому основой визуального стиля Hard Glide лежит реалистичность и детализация. Но у этого стиля есть один недостаток – сложно визуально отделять активные объекты, не зашумлять картинку мусором, делать уровни «читаемыми» для игрока. В данном проекте я думаю с этой задачей более-менее справился: игра сочетает в себе реалистичный визуал но в тоже время сохраняет определённый уровень абстрактности окружения, позволяя игроку лишь по цветам и определенным текстурам «читать» уровень и не путать назначение объектов.

Hard Glide — моя первая игра на Unreal Engine

Сеттинг в игре не совсем обычный: Hard Glide – это мир автоматизированных ботов, оставшихся без надсмотра, путешествующих по бесконечным сервисным туннелям, пытаясь выполнять кем-то давно поставленные и уже, скорее всего, бессмысленные задачи. Общий дизайн я старался выдержать в ретрофутуристичном стиле, что-то между дизель и киберпанком. Транзисторпанк может быть? 😃

Hard Glide — моя первая игра на Unreal Engine

Основа мира игры – The Pipeline – мегаструктура, огромное самонесущее искусственное сооружение, являющийся одновременно фундаментом, и средством перемещения по нему. Он соединяет не многочисленные островки-арены, на которых всё ещё можно встретить остатки прежнего мира. И на которых собственно игрок будет выполнять игровые задачи.

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

Также можно посмотреть геймплейный трейлер, сделанный специально для этой демки:

Геймплейный трейлер для демки

➡Скачать демку можно на itch: https://olantipov.itch.io/hard-glide

➡ Игру также можно добавить в вишлист: https://store.steampowered.com/app/1731390/Hard_Glide

Моя группа в VK: https://vk.com/olegantipovgames

Другие мои игры здесь: https://OlegAntipov.com

Спасибо всем кто дочитал до этого места!

Hard Glide — моя первая игра на Unreal Engine
457457
11
124 комментария

Комментарий недоступен

54
Ответить

Хуета как всегда

4
Ответить

Постоянство - признак мастерства!

55
Ответить

Урыл бля 

1
Ответить

Выглядит классно, дерзайте, товарищ 👍

17
Ответить

Спасибо :)

6
Ответить

видел в скриншототудеях прототип, но тогда он скучновато смотрелся.
а теперь прям огонь: от больдозера-крошителя хочется немедленно убежать :D
стиль написания тоже порадовал (самоирония - наше все).
удачи проекту и человеку :D

13
Ответить