Двигай и разгружай. История разработки 2D игры на Unreal Engine 4 [Часть 1]

Двигай и разгружай. История разработки 2D игры на Unreal Engine 4 [Часть 1]

DarkDes

Аннотация

Поучаствовал в конкурсе по разработке игр и при этом начал изучать новый движок – Unreal Engine 4. Поделюсь своим опытом в этой статье. 

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

Ключевые слова

Making-of, unreal-engine, devlog, indiegame, indiedev, gamedev, 2D, Pixel Art, Разработка, инди игра, игрострой, геймдев

Введение

Очень кратко расскажу о своём бэкграунде: у меня около 10 лет опыта в GameMaker, до этого я почти написал свой движок на Си++ c DirectX и OpenGL. Сделал пару игр на Unity. Выпустил две коммерческие игры на GameMaker. В последнее время я пробую для себя новые движки: Godot, RenPy. Давно приглядывался к Unreal. Время пришло.

Представьте, что это я




Скриншот игры

О игре

Моя игра Move and Unpack или же Двигай и Разгружай* это 2D top-down игра о распаковке и расстановке мебели в квартире. Игра выполнена в стиле чертежей c pixel art графикой, шуршащими самодельными звуками и нейросетевой музыкой. Тема конкурса — "Не по размеру" — раскрывается через вместительность коробок для предметов, лимитах пространства для расстановки, рисунки на внутриигровых постерах, а так же как герой лихо управляется с любыми габаритными предметами. Надеюсь, я верно передал ощущения расстановки предметов в квартире, весёлые и раздражающие моменты.

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

* перевод скорее “Переезд и распаковка”

Концепция

Поиск идеи

Как уже понятно, выбрал движок Unreal Engine 4. Да, для 2D игры! Началось это как безобидная шутка “на следующий Гаминатор”. Затем я подумал “А почему бы и нет?” и серьёзно решил сделать 2D пиксельную игру на движке, который не особо для этого предназначен! Звучит как 3D в GameMaker 2D, а я таким часто баловался.

Хотел смотреть материалы по движку ещё с анонса конкурса, но решил отложить это дело до непосредственных работ, а то кто знает какая тематика будет и какая идея меня посетит! Это, конечно, ставило меня в сложное положение, ведь знаний по Unreal у меня нуль – открывал лишь пару раз, ничего там не сделал.

И вот, когда тема показалась всем, то стало ясно, что я “проиграл”. Всё дело в том, что хотел использовать подобное (тематику разных размеров) для продолжения Бумажного подземелья. Удачный пинок, чтобы участвовать в этом конкурсе именно с продолжением Бумажного. Но нет! Ведь та шутка про Unreal уже превратилась в серьезное обещание и себе, и другим! К тому же я давно хотел попробовать этот движок, а это был хороший повод.

Конкурс стартовал 15 марта, а уже 16 числа я нарисовал первый концепт и общие идеи. По своей традиции всю игру хотел описать одним листом А5. Был запасной вариант, если ничего не получится – сделать Понг! Зарисовал небольшие идеи не-по-размерности. Например, как шутка-мем про большие, несоразмерные к персонажам мечи в японских играх. В этот раз написал-нарисовал много концептов А5. Где-то до 19 марта очень долго и много описывал концепт в ТХТ файле, потом это аукнулось.




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

Концепты постеров


РАЗРАБОТКА

Принимаюсь за дело

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

Скачать PDF (он же TXT) концепт можно на странице игры сайта Itch.io. Там же можно скачать и саму игру.

Пошёл против своих же идей и начал детально описывать идею. А чем же мне аукнулись горы концептов А5 и километр текста в ТХТ? А тем, что устал на этапе концепта, от чего чуть не сдался. Придумка шла не так гладко, и постоянно было непонятно, как это превратить в игру. Много писать – не игру делать. Если нет четкого видения игры, то и получится каша.


Что же выбрать в управлении?

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


Первые проблемы

Гнев игробогов за то, что я оставил GameMaker, не заставил себя долго ждать. Они портили мне опыт с Unreal Engine. Я стал одним из тех счастливчиков, у которых с определенного времени пропадало контекстное меню! Да, вот так! Берёт и пропадает. Связано это было с Nvidia драйвером или чем-то таким. Проблеме уже года 3.


Проблема как у меня была

Проблема с контекстным меню и её временное решение в виде перезапуска движка мешали войти в ритм, поток разработки. Это едва не стало одной из причин почему мог бросить разработку в начале. Решение, конечно, нашлось позже: отредактировать реестр заменить лишь какое-то одно значение. После этого критичных проблем с Unreal не заметил и разработка продолжилась в более-менее стабильном темпе, но всё равно пару раз были проблемы.


Подготовка ресурсов

Столкнулся с организационными вопросами. Дело в том, что с опытом GameMaker я принял их конвенцию имён, так сказать, даже в файлах. В итоге у меня спрайт в формате png мог называться, например, s_hero.png, где s – это sprite. Термины Unreal и его работа с ресурсами иные. Пайплайн добавления спрайта с анимацией такой: добавить текстуру, извлечь из неё спрайты (регионы на текстуре), а потом добавить последовательность спрайтов в flipbook. 

В итоге, чтобы соответствовать рекомендациям Unreal, файл пришлось называть не s_hero.png, а T_Hero.png*, из которого образуется T_Hero текстура, S_Hero_Walk_0, S_Hero_Walk_1, …, S_Hero_Walk_n спрайты, а потом FB_Hero_Walk анимация флипбук.

* на самом деле не так важно как называется исходный файл



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

Сначала попробовал программу Texture Packer, взял пробный период, т.к. она платная. Использовал графический редактор Aseprite и понял, что удобнее рисовать сразу атлас со всеми объектами, поэтому не было смысла компоновать отдельно. В этой программе есть инструмент Slice – нарезка областей и … он не подходит для экспорта в Unreal. Бегло поискал – нет готового решения. Тогда я быстро с использованием аналога chatGPT накидал скрипт конвертации – снова выручили нейросети. Теперь я могу экспортировать нарезанный SpriteSheet из Aseprite в Unreal.


Работа с движком

Март, 27 число. Разработка идет крайне туго, рисую на бумаге логические и архитектурные схемы интерактивности, как выстроить классы и прочее. Много времени уделяется изучению движка, например, тому, что есть Actor и какие компоненты у него. Раньше видел, но всё равно очень непривычно программировать через Blueprints. Впрочем, описание архитектуры на бумаге очень помогло и действительно лучше так делать, чем бежать “писать код”, ОСОБЕННО в Unreal. Если в GameMaker простительно писать, извиняюсь, говнокод, то в Unreal это потом аукнется. 

Мне показалось, что переделывать визуальный спагетти-код куда сложнее, чем обычный текстовый код. К тому же, Unreal Blueprints очень странно работает с Git. Через систему контроля версий не посмотреть изменение в коде Блюпринтов, что становится крайне неудобно (потом я узнал, что можно смотреть разницу внутри самого Unreal, но удобства это не добавило).

Неочевидно работает то, что если меняешь родительский Блюпринт, то меняются и дочерние, словно в них внесли изменения.


Незапланированный перерыв

Разработка начала буксовать, и чтобы хоть что-то делать, я решил страшное – устроить небольшой рефакторинг спагетти-Блюпринтов. Стало чуть лучше, но всё равно не идеально. А затем и вовсе на дня 3 отложилась разработка. Смешно, что этот перерыв выпал и на 1 апреля.

Уже 2 апреля решил порисовать и обновить спрайты и … по моим записям хронологии у меня пропал спрайт! Какой, где и как – непонятно. Но разве я буду обманывать сам себя?! Есть также пометка, что UNREAL ВИНОВАТ, что, конечно, возможно, ведь именно в этот момент я узнал, что он как-то странно работает с переименованием и перемещением ассетов, и нужно нажимать специальный пункт меню, который называется “Fix Up Redirectors in Folder”.




Внезапная смена курса

А вот 3 числа отвлёкся на другой проект! И тоже на Unreal! В этот раз правда от первого лица и с нулём механик. За один день сделал простую штуку про самолёт по мотивам сна. Но здесь не об этом, хотя если захотите и попросите – напишу и о разработке G27 Airplane.

Создание Меню

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

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

Программная анимация планировалась очень простая: колёса крутятся, кабина с корпусом сжимается-разжимается. И как же я удивился, что не было простого способа сделать анимацию в Акторе, как это было в Godot, например. В Unreal же есть некие Cinematics для уровня, где мне таки удалось сделать анимацию грузовика. Сначала я сделал бесконечный скролл заднего фона через материал, а уже потом нашёл эти Кинематики.


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


Продление конкурса и Плакаты

Изначально я хотел успеть к дедлайну 7 числа, даже был близок к этому. Продление на неделю, до 14 апреля, было кстати – микропроблемы и дела постоянно возникали во время разработки.

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

Один из плакатов на тематику большого трона и короны. Смотрю заявки на сайте конкурса и увидел, что TheDreik делает игру про корону. Мне показалось интересным сделать прямую отсылку к его игре – спросил разрешение, спрайты попросил и быстро накидал постер. От меня здесь рисованное название и композиция, а другая графика от Дрейка;

Второй плакат именуется “кошкодевочка”. Очевидно, что должно быть изображено, но играет мета-шутка надо мной – у меня не получается рисовать конкретных животных. Например, когда я рисую кота, про него говорят: “Это пёс”! В этот раз смысл рисунка был в больших ушах, я предполагал кошачьи уши, но вышло совсем всё не то! Если хотите, то получился фурри-персонаж (как я понимаю, они достаточно сильно отличаются от понятий “кошкодевочка”)! Под конец рисования вдруг понял, что это ведь похоже на одного зверька – фенек. И долго не думая, беру и называю персонажа на постере DJ Vulpes zerda, что есть научное название этих самых животных;


Третий момент в том, что у меня были слишком абстрактные зарисовки и от этого придумалось несколько версий одного постера – сначала я решительно выбрал один, но потом дал слабину и зарисовал все три варианта с мечом, вот они, слева направо: Отсылка на Final Fantasy 7, Devil May Cry 3 и неслучившийся сиквел моей игры с КОД про инопланетного повара.




Продолжение, вторая часть: https://telegra.ph/Dvigaj-i-razgruzhaj-Istoriya-razrabotki-2D-igry-na-Unreal-Engine-4-CHast-2-04-26




Report Page