Разбор EventGraph в ABP на примере персонажа от Epic Games
Всем привет короткая заметка о Event Graph в ABP(Animation Blueprint) на примере от эпиков
Event Blueprint Initialize Animation — событие, которое срабатывает один раз при инициализации ABP - если очень грубо говорить то при запуске игры ( однако это конечно грубое упрощение и на самом деле не так)
Get Owning Actor — возвращает актора-владельца этого ABP
в данном случае это BP Third Person Character
Cast To Character —приводит Owning Actor к типу Character, чтобы получить доступ к его переменным/компонентам. (Если владелец не Character — каст фейлится.)
SET Character — сохраняет ссылку на полученного Character в переменную ABP
Character Movement — берёт из Character ссылку на его Character Movement Component.
Это компонент, который управляет движением персонажа: скорость/ускорение, ходьба/бег, прыжок/падение, гравитация, трение, столкновения, движение по наклонам/ступенькам и Movement Mode (Walking/Falling/Flying и т.д.).
SET Movement Component — сохраняет ссылку на Movement Component в переменную ABP
А вот где Character Movement находится в блюпринте (BP_ThirdPersonCharacter) персонажа
«По сути, мы говорим движку: возьми владельца этого ABP, сохрани ссылку на него в отдельную переменную, чтобы я мог к владельцу обращаться, где мне удобно, и брать переменные и т. д., созданные в самом блюпринте. После этого достань из владельца Character Movement и сохрани в отдельную переменную, чтобы я так же мог спокойно брать всё, что мне нужно из Character Movement (скорость персонажа и т. д.).»
Почему это так сделано ?
Производительность: Если делать Try Get Pawn Owner и Cast To Character каждый кадр в Update Animation, это создаёт лишнюю нагрузку. Намного быстрее один раз при инициализации (Blueprint Initialize Animation) сохранить ссылку и потом просто обращаться к готовой переменной.
- Чистота кода: граф не будет забит бесконечными линиями от одной ноды владельца, и мы сможешь достать любую переменную персонажа в один клик.
Чистота кода: граф не будет забит бесконечными линиями от одной ноды владельца, и мы сможешь достать любую переменную персонажа в один клик.
Event Blueprint Update Animation — вызывается каждый кадр для этого ABP
- Is Valid (Character) — проверяет, что переменная Character действительно существует (не None) и можно безопасно к ней обращаться.
- Is Valid → идём дальше, обновляем параметры анимации.Is Not Valid → ничего не делаем.
то как бы система подстраховки : если ABP останется без владельца, у нас могут вылететь ошибки
- Sequence — просто “разветвляет” один входной exec на несколько веток Then 0 / Then 1 / Then 2…, чтобы подряд выполнить несколько логик одновременно)
- хотя конечно я читал о том что старт выполнения следует друг за другом , однако с такой небольшой разницей что нам на это все равно
- Очень удобная штука
Movement Component → Velocity — берет вектор скорости из CharacterMovementComponent.
Velocity— это скорость движения персонажа в виде 3 чисел (X, Y,
- направление — куда он движется,
- величина — насколько быстро (м/с или см/с в UE).
Set Velocity — сохраняют этот вектор в переменную Velocity в ABP (чтобы дальше использовать в расчётах).
Vector Length XY — считают длину скорости только по X/Y (по земле), игнорируя Z (прыжок/падение).
Set Ground Speed — сохраняют результат в GroundSpeed (обычно идёт в BlendSpace как параметр Speed).
Идем дальше
Get Actor Rotation (Character) — берут текущий поворот персонажа (куда он “смотрит”).
Calculate Direction
Она вычисляет разницу между вектором скорости (куда персонаж на самом деле движется) и поворотом персонажа (куда он смотрит). Это стандартный способ определить, должен ли персонаж проигрывать анимацию бега вперёд, стрейфа вбок или назад.
(Velocity+ Get Actor Rotation втыкаем в нее )
Clamp (Float) -45…+45 — ограничивают угол, чтобы не включались анимация назад , когда персонаж быстро разворачивается и у нас включена галочка Orient Rotation To Movement ( честно говоря если убрать Clamp - разница не будет большой на дефольтных настройках от эпиков )
Однако если вы поставите скажем Rotation Rate c 500 на 180 в блюпринте персонажа (BP_ThirdPersonCharacter) то разницу можно увидеть - вот видео
Как видите персонажа использует анимацию бега назад при развороте
Movement Component → Orient Rotation to Movement
Включено (True): Персонаж всегда разворачивается носом в ту сторону, куда вы жмете кнопки WASD или стик
Включается в Movement Component блюпринте персонажа
Select — выбирает:
если Orient Rotation To Movement включен используется , берут Clamp (угол режут до ±45),
если выключен → берут полный угол из Calculate Direction. ( у нас будут стрейфы)
Set Direction — сохраняют итоговый угол в переменную Direction
Идем дальше
Тут они вычисляют двигается персонаж или нет
- Берут GroundSpeed и проверяют > 0.01 (чтобы мелкий дрейф/шум не считался движением).
- Берут Current Acceleration из Movement Component и проверяют, что она не нулевая (то есть есть input/ускорение).
- Склеивают это через ноду AND.
И если оба условия совпадают - у нас будет True в Should Move
- Результат записывают в ShouldMove.
Current Acceleration
Это ваш ввод (Input). Как только вы нажали клавишу движения — ускорение появилось. Как только отпустили — оно мгновенно стало 0, хотя персонаж по инерции еще может немного проскользить (Velocity ещё не 0).
Еще немного)
Тут мы узнаем падает ли наш персонаж или нет - обращаясь в Movement component и записываем данные в переменную IsFalling
Рассмотри несколько примерно использования созданных эпиками переменных
Зайдем в AnimGraph > Locomotion > Walk/Run (State)
Тут мы увидим что переменные Direction + Ground Speed - используется в BS_Idle_Walk_Run
Это Blend Space
Специальный асет, который позволяет плавно переходить от одного движения к другому в зависимости от числовых значений (например, скорости или угла).
Основные виды:
- 1D : работает по одной оси (только по Скорости). Идеально для простых пробежек вперёд.
- 2D): работает по двум осям (например, Скорость + Направление). Нужно для стрейфов, чтобы персонаж мог плавно переходить от бега вперёд к бегу боком или по диагонали.
Если его открыть дважды щелкнув мышкой по Blendspace Player ,то можно увидеть такую картину
Соответственно - ноду Direction мы воткнули в input (Horizontal Axis) названный Direction , а ноду Speed в Vertical Axis input Speed
Тут видим сетку в которой расставлены анимации в зависимости от скорости и направления
Скорость с которой может бежать персонаж мы настраиваем тут в Character Movement блюпринта персонажа
Настройки сетки для BS (BlendSpace2D) здесь
2 Перейдем в AnimGraph >Main State >
дважды по стрелочки и мы увидим что условие перехода в анимацию Fall Loop - нахождение персонажа в падении
На этом все ,мы разобрали пример достаточно простого EventGraph.
мой телеграмм канал про анимацию итд, тут .