Developed with Unreal Engine 5.2
Проект разработан Рябченко Константином в качестве тестового задания для студии Midnight Works.
Краткое описание моего процесса разработки и особенности, которые я добавил к базовому заданию
Особое внимание я уделил анимациям персонажа:
- В базовом задании сказано: "Персонаж должен иметь базовую анимацию для ходьбы и прыжка". Я же пошел дальше. Сделал систему передвижения как в God of War, где персонаж ходит боком/задом, а не поворачивается в сторону движения. Для этого я нашел различные анимации на сайте mixamo.com, добавил к ним рут кость при помощи плагина для Blender, а затем сделал собственный IK Retargeter для скелета и конвертировал анимации под скелет манекена Unreal 5. И после создал свой Blendspace и при помощи нового инструмента UE, Analysis, настроил персонажа так чтобы ноги не проскальзывали.
- Также я добавил систему присаживания и обзавелся анимациями при помощи способа указанного выше.
- Провел тонкую настройку анимаций, blendspace'ов и State'ов в AnimationBP, для получения приятной для глаза плавной анимации.
- Создал собственный Control Rig для базовой IK ног, включая их поворот по нормали.
Не меньше внимания я удалил системе дверей. Я добавил и протестировал несколько способов добавления ключей и монет (далее - пикапов) для их открытия:
- В каждой двери есть массив пикапов с уровня - PickupsFromLevel. Можно крайне просто добавлять пикапы прямо с самой двери с помощью пипетки.
- Система тэгов (Tags). У каждой двери есть переменная - DoorName (если её не заполнять, она заполниться автоматически, имя будет соответствовать имени двери в outliner). Можно раскидать пикапы по карте и просто каждому добавить тэг соответствующий DoorName желаемой двери. Это сделано для того чтобы можно было быстро и эффективно добавлять пикапы без необходимости вручную заполнять массив пикапов с уровня. Например: поставить одному пикапу нужный тэг и просто копировать/вставлять его куда нужно. Эти два метода между собой не конфликтуют, один пикап не будет необходим два раза.
- Рандомная генерация пикапов. Я создал класс PickupSpawner, в котором необходимо указать тэг соответствующий двери с которой он ассоциирован и тип пикапа, который спавнер создает. Дальше, дверь может рандомно создать необходимое количество пикапов (все настройки для этого предоставлены). Если же спавнеров меньше чем нужно - лишние пикапы не будут созданы и кол-во необходимых уменьшиться соответственно. Эту систему можно использовать в двух случаях. Первый: если в двери не назначены пикапы с уровня и нету пикапов с соответствующим тэгом. Второй: если поставить галочку RandomisePickupsAbovePreset. Опять же, если спавнеров меньше чем необходимо - это учтется.
Далее, я настроил звуки:
- Используется новейший тип аудио-данных в Unreal Engine 5: Metasounds.
- У каждого типа пикапа есть свой уникальный звук при подъеме и во время простоя.
- Настроена базовая система Sound Attenuation, дабы звуки исходили от самих предметов и "вели" к ним.
Меню:
- Выполнил базовое задание: "Реализуйте меню начала и завершения игры". При запуске игры пользователя встречает главное меню на отдельном уровне, из которого можно собственно и начать игру. Двери есть двух типов: обязательные и нет. Если игрок открыл все обязательные двери - его встречает одно меню, из которого можно продолжить игру для исследования игрового мира, перезапустить уровень и выйти из игры. Если же игрок открыл все двери на карте - его встречает другое меню с аналогичным функционалом.
- Реализовал систему паузы. Во время игры достаточно нажать Esc/Tab для паузы и открытия меню, из которого можно продолжить игру и выйти в главное меню или из игры.
- Также я настроил систему загрузки уровней, а именно: добавил уровень для загрузки и простенький виджет. Однако испытать это мне не удалось, поскольку на моем компьютере уровни загружаются мгновенно.
Карта: Ничего особого, небольшая карта с Landscape и такой себе крепостью построеной при помощи встроенного в UE типа Geometry, из которой и должен выбраться игрок найдя все пикапы. А при выходе из нее игрока ждет самая-самая приятная новость которую он может получить :-).
"Реализуйте камеру, которая следует за персонажем и плавно перемещается при движении игрока". Честно говоря, не особо понял что требовалось, я создал камеру, прикрепил ее к шее персонажа чтобы была легкая и реалистичная тряска при перемещении; также настроил Camera Lag чтобы он был не сильно резким и не укачивал.