ue4 бег по стенам
Создание компонента движения для системы лазания в Unreal Engine
Здравствуйте меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на Unreal Engine в качестве хобби.
Как вы знаете недавно вышла Mirror’s edge 2. Судя по отзывам критиков игра получилась очень слабая. И вы наверно уже захотели сделать свой Mirror’s edge. Поэтому сегодня я расскажу как создать компонент движения, чтобы ваш персонаж двигался как героиня Mirror’s edge.
Здесь будет описано создание компонента движения (дальше КД) который позволит персонажу:
1) Запрыгивать на стену.
2) Бегать по стене.
3) Перескакивать через небольшие препятствия
4) Делать ускорение при непрерывном беге
5)Делать подкат при нажатие Shift
6) Скатываться с наклонных поверхностей
7) А также мы создадим интерактивный объект веревку по которой тоже можно будет скатится
Все исходники приведены в конце статьи.
Если вы впервые слышите о компоненте движения, то вам лучше всего пройти урок Epic Games там все очень подробно расписано.
В качестве базового объекта для КД я использовал UCharacterMovementComponent это компонент движения уже позволяет персонажу ходить плавать и летать.
Итак как мы видим КД является конечным автоматом который в зависимости от значения переменной ClimbingMode определяет ту или иную модель поведения. А теперь про основные методы:
DoJump — Вызывается если персонаж прыгает.
TickComponent — Самая важная функция, вызывается каждый кадр. Здесь работает основной код.
SetClimbMode — Переключает КД из одного состояния в другое
DefineClimbMode — Определяет в какое состояние должен переключится КД.
CanSetClimbMode — определяет сможет ли КД переключится в нужное состояние в данный момент.
CheckDeltaVectorInCurrentState — Получает вектор на который должен переместится персонаж и если в новых координатах персонаж все ещё может находится в заданном состояние то возвращает true, уточненные координаты и углом поворота персонажа в противном случае false.
MoveTo — Перемещает персонажа в нужное положение.
Объект UCharacterMovementComponent работает только в паре с объектом ACharacter. Поэтому класс нашего персонажа будет производным от ACharacter вот собственно и он.
И тут у нас возникает первая проблема. Дело в том что объект ACharacter порождает объект UCharacterMovementComponent в своем конструкторе. Но нам то нужен не UCharacterMovementComponent, а UClimbingPawnMovementComponent. Чтобы ACharacter породил UClimbingPawnMovementComponent нужно конструктор AClimbingCharacter изменить с такова:
Теперь ACharacter будет порождать то что нам нужно.
Это интересно: Вы наверно заметили слово Super, что оно означает? Слово Super заменят собой имя базового класса для объекта в котором его используют. То есть если я напишу Super::Tick() то это значит что я вызвал метод Tick из базового класса объекта.
Дальше я расскажу про основные методы:
Вас наверно привлек метод ChangeView. Да по нажатию кнопки F можно будет переключатся с вида от первого лица в вид от третьего. Хоть это и расходится с каноном.
Методы MoveForward, MoveRight, CameraPitch, CameraYaw, CrouchFunk, UnCrouchFunk, Jump отвечают за ввод с клавиатуры и мыши.
Метод NotifyActorBeginOverlap срабатывает когда персонаж пересекает какой то другой объект. Для всех интерактивных объектов я создал базовый класс AOverlapObject вот собственно и он:
Этот объект содержит в себе переменную типа EClimbingMode когда персонаж пересекает этот объект, его Компонент движения переключается в данное состояние.
Пока что я сделал только один интерактивный объект AZipLine это такая веревка за которую персонаж хватается и скатывается по ней вниз. Если вы играли в Mirror’s edge, то вы поняли о чем я говорю.
Метод OnConstruction аналогичен функции ConstructionScript в blueprint он также вызывается при перемещении эктора или его изменении. Правда есть небольшое отличие, если в блюпринте все добавленные объекты автоматически уничтожаются при каждом перестроении, то в c++ нужно самому уничтожать объекты.
Собственно на этом все как и обещал исходники. По многочисленным просьбам населения я разместил их на github.
32 бесплатных курса по разработке игр на Unreal Engine 4
Для начинающих с нуля в 2021 году.
1. «INTRO Gamecode» от XYZ School
Длительность: 33 урока.
Формат обучения: видеоуроки.
Программа обучения:
Чему научитесь:
Об авторе: Алексей Балакшин — геймплей-программист, имеющий опыт работы над ААА-проектами. В частности, над известной игрой — Tom Clancy’s Rainbow Six Siege.
2. «Unreal Engine 4» от Skillbox
Кому подойдёт: каждому, кто желает разобраться в создании персонажей и локаций на Unreal Engine 4.
Длительность: 3 урока.
Формат обучения: записи вебинаров.
Программа:
Чему научитесь:
3. «Уроки по Unreal Engine 4» от itProger
Кому подойдёт: людям, которые хотят научиться создавать простые игры на Unreal Engine 4.
Длительность: 6 уроков.
Формат обучения: видеоуроки + практические задания.
Программа:
Чему научитесь:
4. «Шутер на Unreal Engine 4» от itProger
Кому подойдёт: тем, кто уже имеет опыт работы с Unreal Engine 4, но хочет получить углублённую информацию по теме.
Длительность: 11 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + практические задания.
Программа:
Чему научитесь:
5. «Your First Hour in Unreal Engine 4» от Epic Games
Длительность: 7 уроков = 55 минут.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
Преимущества курса:
6. «Уроки по Unreal Engine 4» от YouTube-канала «Институт Марксизма-Ленинизма»
Длительность: 53 урока.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
7. «Знакомство с Unreal Engine 4» от Cyberstars
Длительность: 16 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
8. «Blueprint» от Unreal Engine Rus
Длительность: 29 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Программа:
9. «Unreal Engine 4 уроки для новичков» от Александра Сироткина
Длительность: 22 урока.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
10. «Уроки по Unreal Engine 4» от Channel Zero
Длительность: 22 уроков.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
11. «Unreal Engine 4 для начинающих» от Дениса Кожара
Длительность: 12 уроков..
Формат обучения: видеоуроки..
Программа:
Чему научитесь:
12. «Создание ММОРПГ на Unreal Engine 4» от BCSoftworks
Длительность: 160 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
13. «Unreal Engine 4 видеоуроки» от Cyberstars
Длительность: 11 уроков.
Формат обучения: видеоуроки на YouTube.
Программа:
Чему научитесь:
14. «Уроки по Unreal Engine 4» от RTry Harder
Длительность: 47 занятий.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
15. «Уроки по Unreal Engine 4» от Di Shiper
Длительность: 11 уроков.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
16. «C++ | UnrealEngine 4» от YouTube-канала «Институт Марксизма-Ленинизма»
Длительность: 8 уроков.
Формат обучения: видеоуроки.
Программа:
Чему научитесь:
17. «Разработка игры на Unreal Engine» от Николая Конзеровского
Длительность: 12 уроков.
Формат обучения: видеоуроки + тесты.
Программа:
Чему научитесь:
Автор: Николай Конзеровский — профессиональный UE4 Gameplay Programmer.
18. «Создание игр и приложений на Unreal Engine 4» от Stepik
Кому подойдёт: новичкам в геймдеве, которые хотят освоить азы работы с Unreal Engine 4.
Длительность: 54 урока.
Формат обучения: видеоуроки + тесты.
Программа:
Чему научитесь:
19. «Unreal Basics» от Даниила Лихоманова
Длительность: 7 занятий.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты + Д/З.
Чему научитесь:
20. «Introducing Unreal Engine» от Epic Games
Длительность: 14 уроков = 1 час 9 минут.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
21. «Your First Hour With UMG» от Epic Games
Длительность: 15 уроков = 1 час 40 минут.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
22. «Your First Hour With Animation» от Epic Games
Длительность: 11 уроков = 1 час 14 минут.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
23. «Your First Hour in Sequencer» от Epic Games
Длительность: 9 уроков = 41 минута.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
24. «Unreal Editor Fundamentals» от Epic Games
Длительность: 13 уроков = 1 час 33 минуты.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
25. «Programming Kickstart» от Epic Games
Длительность: 3 урока = 44 минуты.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
26. «Post Processing Essentials» от Epic Games
Длительность: 6 уроков = 32 минуты.
Сертификат: не выдаётся.
Формат обучения: видеоуроки + тесты.
Чему научитесь:
27. «Creating Games For Begginers on UE 4» от DevSquad
Длительность: 69 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Чему научитесь:
28. «Creating a First Person Shooter» от DevSquad
Кому подойдёт: людям, которые желают разработать свой собственный шутер от первого лица. Особое внимание будет направлено на баллистику.
Длительность: 56 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Чему научитесь:
29. «C++ Fundamentals — Producer» от DevSquad
Длительность: 14 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Чему научитесь:
30. «Creating A Role Playing Game — Unreal Engine 4» от DevSquad
Длительность: 50 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Чему научитесь:
31. «BluePrint Programming — Unreal Engine 4» от DevSquad
Длительность: 29 уроков.
Сертификат: не выдаётся.
Формат обучения: видеоуроки.
Чему научитесь:
32. «Уроки Unreal Engine 4» от Unreal Engine Rus
Кому подойдёт: тем, кто желает с нулевого уровня полностью разобраться в создании игр.
Длительность: 97 уроков.
Формат обучения: видеоуроки.
Программа: за курс человек узнает:
Чему научитесь:
Основатель и главный редактор проекта. Специалист в области интернет-маркетинга (SEO-продвижения и копирайтинга, в частности). Работаю онлайн с 2018 года.
Создаем 2D платформер при помощи Unreal Engine 4. Часть 1 — Игровой персонаж, движение
Давайте подготовим раскадровки для 2х состояний: покой и бег, для этого необходимо удалить красный фон (нам ведь не надо, что бы персонаж перемещался всегда на фоне красного прямоугольника) и вырезать требующиеся части изображения, на выходе получая что-то вроде этого:
Из фоновых изображений пока вырезаем только пол:
Структурируем папки проекта и импортируем соответствующие изображения:
Далее необходимо из текстур извлечь, собственно, спрайты. Сделать это можно двумя способами: автоматически и вручную, замечу, что с автоматичемским извлечением может быть один нюанс: спрайты будут пронумерованы по возрастанию, но совсем не обязательно, что нумерация будет соответсвовать их положению в исходной текстуре, так что после извлечения рекомендую все тщательно проверить, что бы впоследствии не было артефактов анимаций. Поскольку у нас все же урок, сделаем все вручную.
Первым делом создаем еще пару папочек, на этот раз в “Sprites” → “Alucard”, внутри которой будут папки “Idle” и “Walking” с соответствующими спрайтами. Итак, создаем пустой спрайт, называем его “Idle_1” и открываем. Сразу же переходим в “Edit source region”, а в качестве текстуры-источника указываем текстуру «Alucard_Idle».
Один спрайт должен содержать один кадр анимации персонажа, так что скорректируем значения “Source UV” и “Source dimension”, что бы получить один кадр, либо просто дважды кликаем на нужно изображение, что бы автоматически определить его границы:
Проделываем то же самое с оставшимися кадрами покоя и ходьбы:
Из текстуры платфомы так же создаем спрайт, но, поскольку там всего одно изображение можно сделать просто через контекстное меню.
Самое время придать немного жизни нашим спрайтам! Для этого создаем “Animation flipbook”, даем ему имя и открываем. Добавляем соответствующие кадры по порядку и выставляем количество кадров в секунду по вкусу, мне нравится 6:
Повторяем для ходьбы и на выходе имеем 2 flipbook’а:
Теперь добавим на сцену нашу платформу, важно что в ее положении по компонента Y была равна 0. Далее добавим управление (в заготовке оно уже включено, но переназначим, как нам будет удобно): Edit → Project Setting → Input.
Переходим непосредственно к созданию персонажа. В папке “Blueprints” создаем новый BP, нас спросят, какой класс принта, выбираем “Character”, даем имя, открываем и направляемся в раздел “Components”. Добавляет к капсуле Flipbook, в качестве источника выбираем заготовленную Idle анимацию, так же добавляем SpringArm и к ней цепляем камеру, в принципе можно обойтись и без руки, но лучше с ней. Настраиваем размеры спрайтов и капсулы по вкусу, но капсулу лучше делать немного поменьше, что бы спрайт не парил над землей. У камеры убираем зависимость от контроллера и выставляем ортографический тип, глубину — по вкусу.
Компилируем, сохраняем. В настройках мира можно создать свой GameMode, либо поменять в уже существующем “Default Pawn Class” на только что созданного нами персонажа.
Теперь можно запустить и убедиться, что мы все сделали правильно и что наш персонаж нетерпеливо ожидает приказов.
Пора научить его передвигаться, для этого вновь открываем BP персонажа и переходим в раздел графа. Стоит отметить, что Blueprints – очень мощный инструмент, с его помощью можно обойтись в проекте без классического написания кода, но на деле это то же самое программирование, просто, собственно, писать надо будет разве что несколько имен, да значений. Итак, прежде всего надо добавить движение по вектору при событии MoveRight:
Тут происходит следующее: при воздействии на ось (у нас может быть два воздействия ± 1) происходит передвижение объекта по оси X на заданное воздействие. В принципе этого достаточно для передвижения, можно пробовать — компилируем, сохраняем, тестируем. Персонаж смещается вдоль оси, но без анимации, ведь мы не предусмотрели ее переключение.
Для переключения между анимациями нам необходимо заменить, собственно анимацию в flipbook нашего персонажа. Сделать это можно несколькими способами, но я предпочитаю наиболее универсальный и, как мне кажется, изящный. Создадим на графе Свое событие, назовем соответственно цели – “Update animation”.
Логика работы тут следующая: при вызове события во flipbook цели помещается заданная анимация. Сама анимация выбирается в зависимости от того, какая скорость у нашего объекта, если больше нуля — анимация ходьбы, иначе — покоя. Обновим и граф движения:
Появилось новое событие — “Event Tick”, оно происходит каждый кадр, соответственно каждый кадр у нас теперь происходит проверка необходимости смены анимации. Если сейчас запустить игру, то персонаж будет двигаться с анимацией бега, но всегда будет смотреть в одну сторону, исправим это:
Таким образом сегодня мы создали анимированного 2D персонажа, способного перемещаться по платформе. В дальнейшем добавим способность прыгать, сражаться и уничтожать врагов. Пожелания, комментарии и критика приветствуются.
UPD 1. По совету пользователя Torvald3d убрал билинейную интерполяцию на текстурах-исходниках персонажа. Просто заходим в импортированную текстуру и меняем фильтр на «ближайший».
Ue4 бег по стенам
Создавая современную игру, нельзя упускать из виду такой важный момент, как соответствие положения ног персонажа поверхности, на которой он находится. Если персонаж стоит на лестнице, то одна нога должна стоять на одной ступеньке, а вторая — на другой. Аналогично при ходьбе по наклонной поверхности стопы должны находиться на разном уровне. Более того, поверхность стопы должна точно соответствовать нормали поверхности, на которой она находится.
Поэтому многие берутся за создание собственной системы IK для постановки стоп в UDK. Я тоже решил более глубоко разобраться в этом вопросе, потому как это точно пригодится в будущем для разработки более сложных систем с лазаньем по лестницам и стенам, хватанием за карнизы и прочего паркура.
Для начала несколько видео от тех, у кого это уже получилось, т.е. то, к чему нам следует стремиться на данном этапе:
Немного теории
Для реализации постановки стоп на поверхности через инверсную кинематику (IK) в UDK нам потребуется постоянно (или с некоторыми интервалами, для оптимизации) сканировать поверхность под ногами персонажа для нахождения точек пересечения с поверхностью. Другими словами, на каждом шаге анимации (при каждом тике) мы должны корректировать положение каждой стопы согласно результатам трассировки луча (Ray Cast или Ray Trace).
Трассировку луча нужно проводить из точки, находящейся на некотором расстоянии от земли (например, на уровне тазовой кости персонажа), в точку, лежащую на прямой, проходящей через закрепленный на стопе специальный сокет, добавленный в Skeletal Mesh в редакторе. Дальность трассировки имеет смысл проводить на расстояние, куда нога физически сможет дотянуться. Например, если персонаж стоит одной ногой над пропастью, то нога в реальной жизни так и будет болтаться над пропастью. Предположим, что метра под ногой нам будет вполне достаточно для поиска подходящей поверхности.
Если на пути следования луча попадается «твердая» поверхность, то мы получаем точку пересечения и переносим туда нашу стопу. Также мы можем извлечь нормаль пересечения и скорректировать положение стопы, чтобы она совпадала с этой нормалью.
Реализация постановки стоп в UDK
Постановку стоп будем осуществлять при помощи Skeletal Controller под названием SkelControlLimb, представляющий собой IK-ресолвер для связки двух костей, т.е. одиночного сустава. Проблема заключается в том, что после блендинга анимации через AnimNodes, на конечную анимацию начинают воздействовать контроллеры, а они изначально расположены совершенно произвольно. Но нам нужно, чтобы перед применением контроллеров, они располагались точно там, где находятся стопы после анимации, чтобы потом, корректируя положение контроллеров, поставить стопы в нужное нам место (а именно — точно на поверхность).
Для решения данной проблемы нам потребуется дополнительный набор костей (точнее, всего две). В скелете, идущем вместе с UDK такой набор уже есть. Это b_IK_Foot_L и b_IK_Foot_R. Они, вероятно, как раз и используются для внутреннего расчета постановки стоп движком Unreal Engine или же просто остались после импорта анимации из 3D-редактора. Мы же будем использовать их для запоминания положения стоп после анимации перед тем, как на них начали воздействовать контроллеры. Этого мы добьемся при помощи UDKAnimNodeCopyBoneTranslation — специального узла AnimNode, копирующего положение заданной кости в другую кость.
На рисунке выше видно, как нога тянется к скелетному контроллеру SkelControlLimb под названием IKFootRight, в то время как настоящая анимация сохранилась в b_IK_Foot_R.
IK в UnrealScript
Итак, в коде напишем следующее:
Результат работы показан на картинке ниже:
Как видно из рисунка, код работает и нормально ведет себя на наклонной поверхности. Красным выделен CollisionCylinder и лучи трассировки из стоп. Но такая реализация не учитывает некоторые исключительные случаи, которые показаны на картинке справа. В принципе, ничто не мешает игроку запрыгнуть на подоконник, и мы как-то должны обрабатывать и этот случай, чтобы добиться нормального визуального восприятия.
Похожая картина свисания ног наблюдается и на больших наклонах (порядка 45 градусов). Для решения проблемы можно в этом случае применить некоторое смещение для компонента Mesh нашего персонажа, которое слегка «осадит» его вниз, позволив дотянуться свисающей ноге до земли. Но при этом не стоит забывать про CollisionCylinder, который перестанет отражать реальные габариты персонажа. Его тоже придется немного урезать.