Доработка From Inferno после джема

Как мы портировали и дорабатывали игру с джема, созданную на Unreal Engine 4

#лонгрид

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

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

Как участие в Хакатоне вылилось в создание отдельного проекта


Что было в начале

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


From Inferno ранней версии представляла собой экшен-головоломку с элементами жанра Tower-Defence. Игроку необходимо взять под контроль армию демонов и уничтожить базу противника, минуя выстроенную оборону. Можно расставлять разных юнитов в реальном времени, затрачивая на это свой ограниченный бюджет. Так как каждые корабли имеют свои характеристики (скорость движения, урон, скорострельность, количество здоровья, радиус обзора и др.) - имеет значение, в каком порядке, в каком месте и в каком соотношении их устанавливать.

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

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

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

Если говорить об оптимизации, то проще сразу привести конкретный пример, который отразит всю суть:

RTX 2070 Super + AMD Ryzen 2700 + 16 GB DDR3 RAM - выдавало 150 +- 15 на “неактивной” сцене. При установке 17-и простейших AI - падало до ~60 FPS.

Предсказываю вопрос: как не особо детализированная и практически полностью статичная сцена может так плохо работать? И да, летающие камни тут практически не причём. Как мы с этим справились - будет описано немного ниже, а пока… Небольшой интерактив: попробуйте угадать сами :)

Не долго думая, мы с командой быстро приняли решение продолжить этот проект, забросив старый в архив (Который был довольно продуманным и существовал в “бумажном виде” на ~60 страниц, но идеи, описанные там - были слишком амбициозны).


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

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

https://soundcloud.com/etojeragie/warm-wind

Катерина - художник и по совместительству дизайнер, вот один из артов на тему From Inferno. Делает красиво даже там, где это кажется невозможным.
Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

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

Даниил "THunter" - 3D-моделлер, сценарист и нарративный ГД. А еще источник крутых идей, реализовать которые мы чаще всего не имеем возможности :)

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(невыпущенный пока что ассет)

Никита “theonrd” - Геймдизайнер, но в целом занимаюсь всем: от рисования концептов и планирования, до разработки и всяческим связям, а самое любимое — environment-дизайн!

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

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

Никита “niki119” - Техническая часть в самых глубинных смыслах и разработчик искусственного интеллекта. Единственный в команде, кто действительно хорошо дружит с этим и не готов убегать в панике от вида сложных систем :)

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Сложно показать тех. часть красиво, потому мы покажем вот так! А вы попробуйте угадать, что это.)

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


Изменения, которые мы заслужили

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

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Теперь локация выглядит так.)


Стоит сказать, что многие идеи (в том числе центральные) сразу отвалились. Например, пропал космос и действие перешло лишь на одну планету. Конечно-же, она будет включать в себя разные локации в разных биомах: от жарких пустынь до холодных зим, от токсичных, убивших всю природу, заводов, до нетронутых воздушных островов, где собралась “элита” этого мира. Таким образом мы смогли лучше прописать лор, построить более понятную сюжетную линию и, в целом, лучше продумать всю сценарную часть.


Даниил "TwilightHunter":

“В целом, для меня в играх едва ли не максимально важны детали и глубина. Делать простую и прямую, как палка, игру не хотелось даже под мобилку. Разумеется, я думал о том, как бы по-максимуму залить лора, сюжета, деталей в локациях и мешах, но, к счастью, на одного неадеквата в нашей команде найдется управа логикой и аргументами, так что мы пришли к решению подавать лор тонко, мягко, не заваливая игрока тонной информации и давая ему выбор. С сюжетом - также. Он должен быть, должен быть не похож на труЪ-мобилки, где какие-либо диалоги введены просто для галочки, содержать нейтральные рофлы, не раздражать и по желанию скипаться. На это и решено было сделать упор, хотя вначале обсуждений ж… нервы сгорали неслабо.
В итоге, многое от уже неслабо прописанной в голове вселенной останется невысказанным напрямую, фракции противников по большей части нераскрытыми дальше, чем позволяет дизайн локаций. А ведь столько идей в голове... И все же, несмотря на это, придуманное, продуманное, сделанное - радует глаз!”

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(А вот и одна из моделек)


Позже, уже после первых прототипов, всплыли многие другие проблемы:

Расстановка юнитов в реальном времени не работает так, как этого бы хотелось. В игре появляется черта “прокликай как можно быстрее”, причем иногда успеть довольно сложно. И всё бы, может, и ничего, но игра подразумевает тактику и грамотную расстановку юнитов. Можно было бы понизить скорость кораблей, чтобы дать больше времени, но нам, в итоге, наоборот её пришлось повышать (об этом ниже). В итоге мы решили разбить геймплейные цикл на несколько частей: расстановка юнитов, установка меток и активная фаза.


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

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

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

Полностью переписали все геймплейные скрипты, так как они не позволяли внести изменения выше.

С проходом нашего художника и дизайнера - решили отказаться от текущего интерфейса, так как он ужасен эстетически и не очень подходит под изменившийся геймплей логически :) Но нового пока еще нет, так что, увы, пока показать не можем. Зато можем показать старый.

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Текущий (временный) HUD. Тут немного творческий беспорядок и рофлы, но тем интереснее.)


Немного об оптимизации.

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

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


Вообще, в Unreal Engine 4 “тупой” порт сделать довольно легко, нам достаточно было просто изменить платформу в настройках проекта и отключить туман (Т.к. он не поддерживается. Хотя не исключаю, что его можно как-то включить). Для более сложных игр потребуется немного повозиться с шейдерами, так как не все функции поддерживаются на всех платформах, а еще есть немного других ограничений (по освещению, количеству вершин на моделях и более мелкие), но в целом - тоже не должно доставить проблем.

Вот такой вот порт без особой обработки порадовал нас следующими результатами:

- Xiaomi redmi note 4 - не больше 15 FPS

- Honor view 20 - не больше 45 FPS

- Samsung A51 - не больше 20 FPS

- Размер билда - более, чем 1.5 GB

В целом, если не учитывать размер, то результат оказался даже не плох, учитывая что оптимизацией мы еще даже не занимались. И так как смартфонов у нас подходящих для тестов не было (Мой samsung S4 безнадежно устарел, а у команды как назло либо телефон сломался, либо еще более устарел), то мы решили начать с веса, всё-таки 1.5GB - это уж слишком. Для статистики выше, если что, тестировали у друзей (а на своём новом А51 - просто протестировал уже позже).

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

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Видите 4к текстуры на всех объектах? А они есть.)


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


Даниил "TwilightHunter":

“Вспоминая истории с текстурированием, ретекстурированием, реретекстурированием, и прочими последующими этапами, которые можно пустить на локальные мемы, даже не обрезая, 3д-моделлер в моем лице четко осознает, что смарт-материалы все-таки умнее него самого. Зато весело… (очень, бл..ин)
И все же, в итоге вышло довольно неплохо. Зато приятно было наблюдать, как файл проекта на глазах начинал весить в 10 раз меньше. Приятнее, чем если бы сразу сделать все не так, как мы любим делать по жизни. Странно? Еще как!”
Когда текстурам понизили разрешение до более адекватных значений, обратили внимание, что игра генерирует под 1-1.5 тысячи запросов на отрисовку (DrawCall’ов) и их количество линейно растёт после начала активной фазы (когда спавнишь юнитов и они начинают атаку). Это слишком много и явно не соответствует сцене, даже будь это ПК игрой.

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Тут уже другая локация, так как от прошлой мы отказались. Эта тоже еще очень сырая.)


Вся проблема крылась в одном простом факте: Каждый юнит был разделён на 6-9 материалов, а другие модели - на 2-6. Таким образом, каждый меш, каждый юнит, каждая турель добавляла свой посильный вклад в этот счетчик, раздувая его до каких-то нереальных значений, а в качестве компенсации неплохо так кушала FPS.

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Тут хорошо заметно, что дравкаллов в разы больше, чем мешей на экране.)


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

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

2. Все повторяющиеся статические модели теперь оборачиваются в (Hierarchical) Instanced Static Mesh или создаются через Foliage (что, в принципе, одно и тоже, только способы расстановки разные). Таким образом, сколько бы их ни было - все они рисуются в один запрос. Мы использовали это по максимуму и применяли даже к зданиям, деревьям и другому не особо многочисленному декору.

Если вы занимаетесь разработкой игр на Unreal Engine 4 и также имеете мало опыта, то обратите на это внимание. Команда для профайлинга со скриншота - stat SceneRendering

В итоге удалось прийти к следующим значениям (Хотя тут еще есть куда расти):

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(Сцена стала более детализированной, а число DrawCall’ов ниже)

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(В активной фазе)


Настройки проекта.

На эту тему существует больше информации, её легче гуглить, да и комментарии у параметров обычно вполне информативные.

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

https://docs.unrealengine.com/en-US/SharingAndReleasing/Mobi...

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

Кроме того, “по советам с форумов” включил Blueprint Nativization, что должно было увеличить FPS, но заметной разницы не заметил. Так как я не с++ программист и были задачи куда более важные - до более глубокого изучения руки еще не доходили, но когда-нибудь, быть может…

Доработка From Inferno после джема Unreal Engine 4, Gamedev, Indiedev, Гифка, Видео, Длиннопост

(From Inferno с выключенным HDR)


Ну и еще один… Совет? Не совсем так. В общем, у нас был забавный баг с тем, что мы забывали уничтожать пули и они могли бесконечно лететь, тратя ресурсы на просчёт движения. Конечно, мы не использовали для них полноценный movement-компонент, не использовали даже прожектайл-компонент - лишь простой векторный сдвиг с правильной привязкой к времени кадра.. Но всё-равно это кушало немало FPS. Так что, если делаете игру, проверьте, всё ли вы уничтожаете? Простая невнимательность может аукнуться тут довольно серьезно :)


Дальнейшие планы

На данный момент мы готовимся к началу ЗБТ (среди друзей и активных пользователей среди аудитории), а потом к ОБТ (если хотите поучаствовать - заходите в наш дискорд или группу в VK, мы обязательно всех пригласим, когда придёт время!).


В ОБТ мы планируем показать первую локацию, получить новые идеи, критику, обнаружить баги и, в целом, хотим сделать игру совместно с аудиторией, ведь играть-то будут люди, а не мы (хотя и мы тоже, но всё-таки!). Хотим подойти к этому со всей ответственностью, так что будут различные опросы, конкурсы и прочие активности!


Но для этого нужно выполнить несколько задач:

- Фиксы всевозможных багов. Большая часть, скорее всего, выявиться после ЗБТ, но часть уже лежит в нашей трелло-доске.

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

- Нехватка эффектов. Конечно, часть эффектов уже есть, но многие только предстоит сделать.

- Картинка слишком статичная, мало движения. Можно оживить эмбиент-эффектами и какими-либо активностями. Идеи на этот счёт уже есть, нужно только получше продумать и реализовать.

- Нет внятного окончания уровня. Не говоря уже о выходном UI со списком выполненных дополнительных задач (которых также пока нет).

- Нужно всё-таки переделать интерфейс…

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


https://discord.gg/m9EVb3jkAV

https://t.me/f1cont

https://vk.com/f1content?