4 июля 2023 4.07.23 15 3589

Сказание о двух прототипах игр

+39
Лучший блог недели
2000 ₽

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

В качестве главного ремесленного инструмента был выбран движок Unity. Выбрал я его по той причине, что начинал погружение в это дело с маленьких 2D проектов, да и программирование я тогда не знал от слова совсем. Использование Unreal Engine с его богатым инструментарием для создания крупных 3D игр и языком C++ казалось мне стрельбой из пушки по воробьям. Прошло некоторое время, я набрался навыков и отправился искать работу. Оказалось, что 99% Unity проектов составляют мобильные дрочильни. От такого… "вида" игр я далёк, а потому было принято решение искать вакансии каких-то крупных студий. Просмотрев с десяток объявлений, я понял, что мои текущие навыки катастрофически низки. Тогда пришлось вернуться к вершине современного геймдева. Но и тут меня ждало разочарование. Из пары десятков откликов я получил только три отказа и одно приглашение на собеседование, которое я провалил. Причиной провала стал клишированный "недостаток опыта". Я не опустил руки и решил набить их, начав работать над теми вещами, которых никогда раньше не делал.

Чтож, с предисловием закончили. Поехали к сути.

Midnight Suns Project

Обложка оригинальной игры
Обложка оригинальной игры

Первым моим проектом стала попытка скопировать базу и скелет боевой системы " Marvel's Midnight Suns". Как по мне, крайне недооценённая игра. Интересная тактика, приправленная приятным визуалом, оказалась погребена под клеймом "Карточная помойка с мобилок". Ну ладно, не буду о грустном.

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

  • Навигация: Перемещение по арене с возможностью вращать камеру на 360°
  • Карты: Визуализация и выбор навыков посредством карт
  • Анимация: Проигрывание небольшой катсцены при использовании навыка
  • Интерфейс

Я опущу душные и малоинтересные подробности о том, как пытался научить камеру вращаться, а персонажа бегать за мышкой. Вам ведь наверняка будет интереснее читать про страдания. Не так ли, маленькие садюги? Придётся подождать ещё немного, так как сейчас я хочу рассказать о логике, стоящей за картами и действиями юнитов.

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

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

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

Для анимации стрельбы я вдохновлялся легендарной "Enter the Matrix"

Иногда я сам себя разочаровываю.

Ладно, я вроде как обещал страдания. Наступили они в тот момент, когда я работал над интерфейсом. В порядке бреда я решил сделать сегментированный счётчик энергии не набором отдельных кусочков, а шейдером. Тут стоит отметить, что это был мой первый опыт написания шейдеров. Вооружившись бутылкой и видеоуроками, я отправился покорять крепость под названием "ShaderGraph".

Итоговый шейдер кружка
Итоговый шейдер кружка

Через несколько десятков минут мой сегментированный кружок, переливающийся 50-тью оттенками жёлтого был готов. Сказать, что я был счастлив – не сказать ничего. Удивительно, как такие простые вещи, как градиентный кружок могут вызывать такие неподдельные и детские яркие эмоции. И тут вы зададитесь резонным вопросом, а где же обещанные страдания?

Через некоторое время, находясь в кураже от успеха моего прошлого опыта с шейдером, я решил самостоятельно сделать конусообразный шейдер, который должен был отображать радиус одного из алгоритмов выбора цели. Открыл я значит "ShaderGraph", нежно скопировал часть алгоритма построения круга, жёстко покрутил настройки, чтобы сделать его конусообразным, и успешно впал в ступор. Дело вот в чём, круг заполнялся, начиная с нуля градусов. Если выставить радиус конуса в 90°, то и круг будет заполнен на 90° и нужный мне "центр" будет находиться в точке 45°. Но мне-то нужно было, чтобы "центр" был в нуле. И тут началось веселье. Чего я только ни делал: пытался играться с дельтой разницы между радиусом конуса и нужного мне угла, пробовал домножать угол поворота на половину радиуса, менял алгоритм отрисовки круга, рисовал зеркальную копию круга, чтобы заполнять нужную мне половинку… Этот кошмар закончился только через несколько часов, когда я нашёл решение. Повернуть конус на 90°.

Итоговый шейдер конуса
Итоговый шейдер конуса

Я посмотрел на себя в отражении монитора, встал из-за стола, подошёл к окну, закурил… Много думал… Плакал…

Знаете, раньше я считал шейдеры чем-то магическим, неизведанным, таинственным и притягивающим. Однако реальность полна разочарований. Цитируя классика: "Это чистая математика". Перегон точек из одних координат в другие. Такова истинная суть шейдеров. Вот так, обременяя себя знаниями, разрушаешь свои надежды и мечты.

Вернёмся к проекту. Следующим шагом я решил реализовать небольшие катсценки, сопровождающие активацию скилла.

Работа над ними была достаточно весёлой. Активируешь нужные анимации, выставляешь нужные ракурсы камеры и настраиваешь переходы между ними, одним неосторожным движением руки удаляешь последние пол часа работы и в конце концов задаёшься вопросом: "А как собственно заставить противника получать урон в момент удара твоего подопечного?"

Мне в голову пришло три варианта решения проблемы:

  • В скилле настраивать время, через которое произойдёт активация эффекта
  • Использовать события, вызываемые в нужный кадр анимации
  • Использовать события, вызываемые в нужный кадр катсцены

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

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

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

Ну и на данный момент "Midnight Suns Project" выглядит вот так:

 

Геймплей

Обложка оригинальной игры
Обложка оригинальной игры

Вторым и гораздо более серьёзным является проект, в котором я пытался скопировать боевую систему ранних игр серии "Tales of". Она мне казалась достаточно простой в реализации и невероятно интересной и динамичной в геймплее. "Простой в реализации…" Как же я ошибался. Ну и по уже сложившейся традиции я отправился игра… собирать информацию.

В процессе изучения я выделил несколько основных геймплейных моментов:

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

Вооружившись бесплатными спрайтами из открытых источников, я отправился творить. У меня уже был достаточно обширный опыт работы с 2D проектами, а потому с базовыми управлением и перемещением проблем не возникло абсолютно никаких.

Как спрайт персонажа при гиф'изации жмыхнуло...

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

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

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

На данный момент одним из самых популярных механизмов имитации интеллекта является "Behavior Tree"(Древо поведения). Древо состоит из множества нодов или ячеек, которые связаны друг с другом в нисходящем порядке. На картинке будет понятнее и нагляднее.

Ноды делятся на несколько основных групп:

  • Корень: база всего древа, с которого начинается его работа
  • Листья: именно эти ячейки и являются конкретными действиями обладателя интеллекта. Например, побежать в нужную точку или нанести удар
  • Декораторы: такая надстройка над листьями, которая позволяет модифицировать их поведение. Например, выстрелить не один раз, а десять
  • Селекторы: логический блок "ИЛИ". Решает в какую следующую ветку пойдёт обработка дерева. Например, выбирает какое использовать оружие, в зависимости от дистанции до цели
  • Секвенции: логический блок "И". Последовательно выполняет все действия из своей ветки. Например, юнит подбегает к цели → юнит атакует цель → юнит отбегает от цели

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

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

Искусственный интеллект можно реализовать и с помощью "State Machine". Грубо говоря, всё поведение юнита разделяется на "состояния". Например, "Преследует цель" или "Атакует цель". Активное состояние обрабатываются каждый кадр, что достаточно сильно бьёт по производительности, особенно если состояния являются достаточно комплексными. "Древо поведения" же позволяет запомнить конкретную ветку и, грубо говоря, единовременно обрабатывать лишь один "лист", что благоприятно сказывается на использовании ресурсов компьютера.

Древо поведения в Unreal Engine
Древо поведения в Unreal Engine

Ладно, закончим с духотой и перейдём к веселью. В "Unreal Engine" есть встроенные инструменты создания и редактирования "Деревьев поведения". Однако я работал на царском "Unity" и мне пришлось писать расширение редактора, которое позволило бы мне с удобством и радостью работать с ячейками древа. Как же хорошо, что на просторах интернета есть YouTube, в котором можно найти видосы по разработке практически чего угодно.

Написанный благодаря YouTube граф
Написанный благодаря YouTube граф

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

Для начала я научил их косплеить JoJo.

Затем они возомнили себя пружинками.

А под конец вовсе обзавелись разумом роя.

Однако я не сдался и уже через некоторое время система автоматического боя была готова.

Не уровень " F.E.A.R" конечно, но тоже не плохо. Юниты могут выбирать цель, оценивать расстояние до неё, атаковать, получать урон и умирать. Подконтрольный игроку персонаж может действовать в двух режимах: на автопилоте и в полуавтоматическом. Полуавтомат работает так же, как и автомат, вот только обновление древа происходит не по таймеру, а по вводу игрока.

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

В принципе, всё что я хотел реализовать в прототипе уже было готово. Конечно были ещё геймплейные фичи, которые я так и не воплотил в жизнь, но никаких сил не осталось. Смог добавить лишь пару аудиальных штришков. Режим исследования начал сопровождаться композицией "The Second Act" из " Tales of Phantasia", а дополнительную динамику бою придавала "Take Up The Cross" из той же игры. Для озвучки трёх моих персонажей я позвал известных профессионалов. Xander Mobus, Robbie Daymond и Max Mittelman с радостью подарили свои голоса персонажам моего пет проекта. Ну или я просто взял их "Ngh" из " Persona 5". С этими небольшими улучшениями я закончил работу.

Ну и на данный момент "Tales of Copyright Project" выглядит вот так:

 

Геймплей

Заключение

Ну что, ребят. Вот и подходит к концу мой рассказ. Над "Midnight Suns Project" я работал около двух недель по три четыре-часа в день. "Tales of Copyright" занял у меня уже чуть больше месяца. С такими темпами не знаю даже, когда смогу достичь того уровня просветления, который позволит мне устроиться на работу в студию разработки игр. Если ты, дорогой читатель, добрался до этой строчки и работаешь разработчиком игр, то напиши в комментариях о своём пути. С чего начинал, какими навыками овладел и как попал на эту галеру. Уверен, что не только мне, но и другим людям, желающим попасть в геймдев будет интересно почитать небольшую автобиографию и почерпнуть из неё важную информацию. Ну а я озвучу лишь одну финальную мысль.

Работать в одиночку ужасно тяжело. Каждый раз, когда не получается реализовать какую-ту интересную задумку появляется желание опустить руки. Рядом нет никого, кто мог бы поддержать и подсказать, в каком направлении стоит думать. Нет никого, кто был бы так же увлечён проектом и подталкивал к его развитию и завершению. Однако… Однако несмотря на все трудности я не намерен сдаваться. Всеми силами я буду стремиться к тому, чтобы в один день увидеть своё имя в титрах прекрасной игры.

Tales of Copyright: https://github.com/Gryisic/Tales-of-Copyright

Midnight Suns Project: https://github.com/Gryisic/Midnight-Suns-Battle-System


Лучшие комментарии

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

ОГО! круто. А я Левел Дизайнер новичок, страдающий от той же фигни на собеседованиях на которые пробиваюсь.

«Жаль у вас мало опыта. Сделайте нам тестовое чтобы и VFX и конечное качество графики, и боты и еще механики напишите пожалуйста. Спасибо, но мы решили выбрать другого кандидата.» а я такой, но я Дизайнер Уровней или Локаций но никак не написания всего кода, всех моделек и спецэффектов....

[Обновление] Успехов тебе, твой прогресс восхищает. Уход крупных европейских компаний нам выстрелил в ногу, а с Русскими новичками связываться теперь очень не хотят. Раньше было реально попасть к более лояльным Европейцам, а сейчас такое чувство, что Русские HR сидят и ловят спецов, которые по тем или иным причинам не релоцировались, имея колоссальный опыт они готовы работать за намного меньше денег чем у них было до этого.

Круто получилось, молодец! Интересные наработки. Главное, не сдаваться!

Как говорил мастер Чак: «Когда решаешь сдаться, то в этот момент до победы остается один шаг».

В моем случае, в разработку игр попал в 30 лет. Долго искал работу, не получалось ничего найти стоящего. Оставались только подработки, мутные жлобы-работодатели, недоплаты и прочая фигня. И тут удача, вдруг пишут мне в чат: «А хотел ли бы ты поработать в игровой индустрии?». Ну и началось, выполнил тестовое задание, прошел кучу собеседований, а когда началась практика, то это был взрыв мозга из-за потока новой информации. Ну ладно, на самом деле, это было не так страшно. До полной адаптации ушло около 6 месяцев, а далее стал уже помогать другим, обучать и предлагать решения по оптимизации. Из ключевых знаний мне пригодилось: git, небольшой опыт в программировании и понимание работы игровых движков.

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

По разработке, могу добавить, думаю лучше не стоит копировать чужую идею на 100% — это не сделает идею проекта интересной как её оригинал, веселее придумать что-то своё. Для начала выбрать легкий проект, пусть даже это будет тупой 2D платформер в стиле «Марио» по смыванию борща в унитаз, главное, чтобы это был рабочий полноценный проект доведенный до релиза у которого есть какая-то цель (начало, середина и конец игры).

По вакансиям, да — очень сложно. Жалко, что сейчас компания не работает в России (из-за чего в итоге пришлось её покинуть), так бы пригласил инвайтом. Очень большой потенциал! За приглашение других разработчиков, в хороших компаниях, дают очень крутые бонусы.

Левел Дизайн, круто! Лично для меня это одна из самых сложных сторон геймдева. Мой максимум в создании локаций это подобие мира 1-1 из Марио.

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

Желаю тебе творческих и профессиональных успехов

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

Желаю вашей команде успешно закончить игру)

Отличные прототипы для портфолио. Есть в планах сделать что-нибудь небольшое свое?

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

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

Сейчас разрабатываем полноценную игру, которую надеюсь не забросим как несколько предыдущих.

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

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

Спасибо за приятные слова и рассказ о своём опыте)

Совет по планированию разработки очень ценный. Возьму на вооружение)

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

Сдаваться я не планирую. Путь будет долог и тернист, однако я уверен, что однажды приду к своей цели

Не забудьте про знаки вопроса на карте (который реальные знаки вопроса без какой либо тайны) и сбор 1000 носков, где потом скажут что надо найти их пару (ещё 1000), но в игре их будет только 1999)

Сейчас основной упор делаю на кодерские навыки, а геймдизайн потихоньку изучаю в свободное время

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

— Я хотел улучшить свои навыки написания расширений для Unity, а потому писал отображение графа ручками — Zenject'ом я умею пользоваться, но конкретно в этих проектах решил не прибегать к нему -Шейдер у меня работал вообще без текстур, а потому граф. редактор никак бы не помог. И я как-то не подумал продемонстрировать готовые шейдеры на сцене, надо будет добавить в блог

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

Непосредственно, кем идёшь? Кодером-разработчиком и/или игровым дизайнером?

Читай также