от выбора названия до анимации окружения. На примере диплома Анастасии Мельник
Как создать свою игру:
Играть в игры и собирать их — совсем не одно и то же. Но создание своего продукта может быть еще более увлекательным, чем наслаждение игровым процессом. Как, например, для Анастасии Мельник — выпускницы курса «Unreal Engine 4».

Мы решили взять интервью у нашей студентки и узнать подробнее, как создавалась World Beyond: the Rescue. Читай дальше о том, как Анастасия пришла к геймдеву, как набивала шишки на разработке прототипа и какие советы считает самыми важными для начинающих девелоперов.

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

Когда начала изучать направление серьезно, осознала: игры — не убийцы времени!

Игры — одно из самых великих достижений человечества, потому что объединяют в себе дизайн, литературу, музыку, игру актеров, синематику, спецэффекты, программирование и еще много чего. В общем, геймдев — это круто!
С чего ты начала изучение темы? Как выбирала свой курс?
Я не знала, с чего хочу начать. Вариантов было много: моделирование, скульптинг, анимация, Unreal Engine 4 и т. д. Движок UE4 казался сложным и страшным из-за С++. Но остановиться я решила именно на нем — у меня был опыт работы с Unity.

Вот, кстати, этот опыт — небольшая игра наподобие Марио :)
Учиться я предпочитаю самостоятельно и курс выбрала больше для разнообразия. Считаю, в обучении все индивидуально, но для себя поняла: за базой, фундаментом надо идти на курсы, обязательно платные (да, разница есть). А если хочешь поднять скилл — читай документацию и увеличивай количество подписок на YouTube.

Для меня было важно, чтобы школа находилась в Украине. В ArtСraft на ближайший курс по UE4 я не попала — группа уже набралась. Поэтому я подписалась на их канал в Telegram и дождалась следующего потока: другие школы мне не подходили.
Как тебе удавалось совмещать работу и освоение движка?
Занималась я каждый день после работы примерно по 2-3 часа. Чем дальше по программе, тем больше времени уходило на выполнение домашек. Совмещать оказалось несложно: на работе я отдыхала от курса, а на курсах — от работы.
Расскажи о дипломе: как долго ты над ним работала? Каким было задание?
Прототип World Beyond: the Rescue создавался два месяца. У меня была цель использовать как можно больше знаний и подходов, набить шишек на одном проекте — получить как можно больше опыта.

По ТЗ нужно было создать шутер от первого лица в стиле Roguelike*. Спойлер: шутер есть, а на элементы рогалика времени не хватило.

В простонародье — рогалик

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

Чтобы придумать имя своему детищу, нужно понимать смысл игры. Из мест, где будет проходить действо, я рассматривала варианты с заброшенным складом, необитаемым островом и заброшенным кораблем. Сперва я выбрала остров и даже попробовала набросать его в WorldMachine:

Подробнее об этом дальше в статье

Понимая, что времени на разработку относительно немного и опыта в моделировании у меня нет, я отправилась за ассетами на Marketplace. Выбирала по принципу «нравится / не нравится», и так уж получилось, что все модельки были в стиле Sci-Fi. Так и появилась идея с космическим кораблем и игроком, который стреляет во все, что движется.

Наконец, можно приступить к выбору названия. Все оказалось проще некуда: выбираешь понравившихся английских слов и обращаешься к генератору имен. Затем проводишь мини-опрос среди друзей — и готово. Так появилась на свет игра с именем World Beyond: the Rescue
Подключение системы контроля версий
Настоятельно рекомендую использовать эту систему вне зависимости от того, работаешь ты один или в команде, в игровом движке или в любом пакете моделирования. Масштабные проекты нужно бекапить, и в этом вся прелесть системы контроля версий: если вдруг Ctrl+Z перестанет работать или дома внезапно выключат свет, твои нервные клетки останутся целыми.

Так я подключила проект к Perforce — ее я выбрала только потому, что раньше с ней не работала (больше нового опыта, как и планировалось).
Создание структуры проекта
Как программисту, мне важно придерживаться определенного стандарта в создании архитектуры и написании кода (хотя вся игра была создана без единой строчки кода). Я выбрала Gamemakin UE4 Style в качестве шаблона, чтобы иметь представление о структуре, правильном нейминге ассетов и переменных / функций и т.п.

Принципы «чистого кода» тоже никто не отменял. Не хочу относить себя к мемной категории разработчиков:
Структура оказалось простой:

Например, анимации из Mixamo, 3D-модели, изображения, звуки, которые не привязаны ни к какому контенту из Marketplace

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

Задачи были разбиты на следующие категории:
  • персонаж;
  • оружие;
  • пикапы;
  • искусственный интеллект;
  • графический интерфейс (UI);
  • система здоровья и нанесения урона;
  • создание уровня;
  • правила игры;
  • дополнения.

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

Вот как выглядит одна из досок:

Trello, Notion, Jira и т.п.

Этап 2. Персонаж
Самое главное на этом этапе — грамотно определить положение камеры. Если установить ее на уровне головы, в вид могут попадать куски меша — это испортит общее впечатление от игры.

В проектах от первого лица обычно используют такие варианты:
  1. Когда есть отдельные меши для руки и ног. Тогда камера располагается чуть ниже уровня головы или как-то так:
  1. Когда есть отдельные меши для тела персонажа и его головы. Это больше подходит для мультиплеера или если планируется смена видов от первого лица к третьему. Этот подход я и выбрала.
Выглядит он так:
Меш головы помечается как «OwnerNoSee*», а для реалистичности можно чекнуть «HiddenShadow», чтобы голова отбрасывала тень. Очень важно приаттачить и камеру, и меш головы к косточке основного скелета «head».

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

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

Готово, персонаж умеет двигаться.
Этап 3. Оружие
Я использовала семь видов оружия: создала один базовый класс и отнаследовалась от него. В производных классах переназначила основные свойства (количество патронов, тип стрельбы*, чем стреляем*), затем — создала отдельный сокет в скелете для каждого вида оружия.

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

Единичные выстрелы, автомат или выстрелы дробь

HitScan или projectile

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

Особое внимание уделила анимации перезарядки. Я хотела не просто обновлять UI и проигрывать анимацию, а бросать магазин на пол и вставлять новый. Для этого пришлось добавить несколько уведомлений в анимацию.
Реализация блюпринтов
MagazineDisconnect
MagazineChange
MagazineConnect
И финальный результат.
Теперь нужно настроить импакт эффектов и всего, что с ними связано. Заранее определяю типы поверхностей (у меня это metal, glass, concrete и flesh). Создаю базовый класс с такой логикой и добавляю ссылки на необходимые импакты, декали и звуки в производных классах.
Финальный этап — добавление прицела. Я добавила сокет к каждому оружию, а когда игрок нажимает соответствующую клавишу, основная камера перемещается на позицию этого сокета. Для снайперской винтовки я добавила еще и изображение прицела.
Этап 4. Пик-апы
Персонаж может подбирать оружие, патроны и здоровье. Каждый меш я обернула в систему частиц, красоты ради. Базовый класс пикапа содержит эту систему частиц и оверлап-сферу. Когда игрок пересекает эту сферу, на экран выводится информация о компоненте.
Этап 5. Искусственный интеллект
В игре есть несколько основных типов врагов: дрон, паук и гуманоид.

Дрон — аналогия всем известной турели. У него есть несколько состояний: покой (вращение), прицеливание и атака. Начинает атаковать, когда игрок подходит достаточно близко, и прекращает, когда игрок отходит на определенное расстояние. Для разнообразия я решила добавить лазер: если игрок попал под него, дрон начнет атаковать независимо от расстояния.
Гуманоид патрулирует территорию и, когда слышит выстрелы, получает урон или замечает игрока, начинает атаковать. Если игрок прячется, гуманоид еще какое-то время ищет его, а затем возвращается к патрулированию территории.

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

Я создала три вида пауков:
  • Всегда преследует игрока и атакует только в ближнем бою.
  • Патрулирует территорию, а когда игрок подходит достаточно близко — прыгает на него и атакует.
  • Преследует игрока, а когда дистанция значительно сокращается — стреляет. Если подойти слишком близко, атакует в ближнем бою.
Этап 6. Графический интерфейс
Для отображения выносливости и здоровья я добавила два прогресс-бара. Если уровень здоровья становится критическим, проигрывается UI-анимация. Она меняет цвет иконки на красный и изменяет прозрачность самого прогресса.
Прицел я решила сделать динамическим: разброс меняется в зависимости от скорости игрока и/или разброса пуль при выстреле. Дополнительно я настроила изменение цвета на красный, когда выстрел попадает по врагу.
Информация о количестве патронов подвязывается с помощью обычного байдинга. 

Самым сложным оказалось создание иконки оружия. Обычно в 3D-пакете выставляется ортографический вид, делается скриншот и зачищается в Photoshop. Я с этим софтом не дружу, поэтому было решено создавать все в UE4. Пришлось добавить материал, который определяет цвет будущей иконки*.

Раздел "Создание иконки оружия без ФШ"

Цвет настраивается через параметры Color, EdgeAngleFalloff, GlowIntensity, RenderWidth

Создала новый уровень, в котором будет только камера и меш оружия. Настроила камеру вот так:
Созданный материал нужно обязательно добавить в список материалов постпроцессоров. После этого в левел-блюпринте выполняем следующее:
И наконец получаем скриншот оружия и импортируем его как текстуру. Остается убрать фон — для этого создаю еще один материал:
Теперь в UI добавляем картинку и в качестве кисти указываем последний созданный материал:
И вот что получилось:
Этап 7. Система здоровья и нанесения урона
Система здоровья и нанесения урона есть и у персонажа, и у врагов, поэтому я создала интерфейс.
Заимплементировав этот интерфейс в каждом акторе отдельно, я получаю возможность описать особенности реагирования на него. Например, когда обычный враг гуманоид получает несмертельный урон, он может отшатнуться назад в зависимости от того, в какую часть косточки попали. А если выстрелом попало в голову — сразу умирает. При получении смертельного урона гуманоид падает по рэгдолл-физике, а дрон — взрывается.
Игрок принимает урон иначе: на экран я вывела хитмаркер, который показывает, с какой стороны был нанесен урон. А если уровень здоровья падает до критического, отображается дополнительный слой в UI в виде затемнения экрана.

Для симуляции смерти игрока я создала отдельный актор в виде куба* с компонентами RadialForce*.

Который симулирует физику

Они гарантируют разнообразие падения

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

Создание блокаута, метрики, вайтбоксы и т.п.

Когда основной уровень был создан, я добавила отдельных акторов, которые отвечают за спавн пикапов и врагов, и разбросала их по всему уровню. 
Этап 9. Правила игры
Задача игрока — убить всех врагов. Враги атакуют волнами. Количество волн зависит от выбранного уровня сложности.

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

И наконец добавляем UI для индикации начала волны, подсказки, экран смерти и победы.
Этап 10. Дополнения
Последние штрихи, чтобы как-то оживить игру:
  • добавила звуки*;
  • создала дверь, которая открывается, только когда игрок подходит к ней с оружием;
  • анимировала движение некоторых вентиляторов на уровне;
  • создала основное меню и меню паузы.

Готово! Можно нажимать волшебную кнопку Build.

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

Эмбиен саунд, звук шагов, выстрелов, перезарядки, получения урона и т.п.

Спасибо за такое подробное описание — проделана колоссальная работа. Что бы ты посоветовала начинающим разработчикам?
Хочется дать несколько важных советов:
  1. По возможности используй базу данных — это значительно упрощает жизнь, когда количество производных классов больше двух.
  2. Сохраняйся перед тем, как переименовать переменную, функцию или макрос. Движок очень часто вылетает на переименовании. И вообще сохраняйся чаще, автосейв тут так себе.
  3. Не трать время на то, что игрок не заметит. Ты ведь обратил внимание, как красиво сгибается палец, когда игрок нажимает на курок?
  4. Используй несколько источников информации. Курс — это хорошо, но услышать еще одно мнение бывает очень полезно.

Что запомнилось от Димы*, так это фраза «Самая плохая игра — это та, которая не вышла». Я поняла, насколько он прав, только когда сдала диплом. Закончить работу, да еще и в срок, — один из самых важных навыков в геймдеве.

Преподаватель курса «Unreal Engine 4»

А были какие-то неожиданные открытия в процессе работы?
Да. При проектировании уровня я осознала кое-что о гизмо. У него есть три оси — XYZ, каждая ось определенно цвета. И названия этих цветов зашифрованы в аббревиатуре RGB.
Еще поняла, что разработка игр — это всегда весело, особенно часть, связанная с анимациями. Как бы ты хорошо ни разбирался в движке, ты всегда забудешь поменять настройки коллизии.

Раздел "Создание иконки оружия без ФШ"

А какие общие впечатления о курсе?
Курс, как и саму школу, однозначно рекомендую. На выходе ты получишь отличную базу. Огромный плюс — это наличие паблика, ребята очень отзывчивые, и мне всегда было с кем подискутировать.

Преподаватель объясняет буквально на пальцах и всегда дает студентам шанс решить проблемы самостоятельно. А вот если у нас что-то не получается — он подталкивает в сторону возможного решения.

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

И насчет диплома: если уже взялся за дело, то доведи его до конца и выложись на полную. Я относилась к дипломному проекту как к работе, а работу надо делать всегда хорошо — именно это залог профессионализма. Не жалей времени и сил: результаты всегда себя окупят.
Круто, спасибо! Поделишься планами на будущее? Куда дальше — всерьез браться за игру?
Изучение UE4 — это только начало пути. Я пока не определилась с направлением, но планирую попробовать все, что только возможно. Во время прохождения очередной игры, я не перестаю удивляться, как много разных профессий объединяет в себе эта сфера.

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

Вот так создавался прототип World Beyond: the Rescue. Надеемся, однажды мы сможем увидеть игру Анастасии во всей красе.
Скачать и подробно посмотреть весь проект ты сможешь здесь
Мечтаешь создавать игры?
Запишись на бесплатное пробное занятие курса «Unreal Engine 4» и стань ближе к своей мечте.
Любимые статьи преподавателей ArtCraft:
ArtCraft™ Education.
Registered international trademark. All rights reserved.