Растягивание анимации в зависимости от расстояния между игроком и врагом с помощью Motion Warping в Unreal Engine 5
Unreal Engine

Растягивание анимации в зависимости от расстояния между игроком и врагом с помощью Motion Warping в Unreal Engine 5

АвторGameDev Base
Дата19 октября 2026 г.
16 мин чтения

Динамическая механика добиваний: масштабирование анимации в зависимости от расстояния между игроком и врагом с помощью Motion Warping в Unreal Engine 5

Основы системы Motion Warping: анализ окон варпинга (Warp Windows) и целей варпинга (Warp Targets)

В среде Unreal Engine 5, особенно в играх с упором на персонажей, необходимость адаптации анимаций с корневым движением (root motion) под реальные мировые координаты является постоянной задачей для разработчиков. Традиционные методы требуют ручной настройки всей анимации или создания сложных систем обратной связи. В этом контексте «Motion Warping» («Искажение движения»), представленный в версии Unreal Engine 5.0 и получивший значительные улучшения в последующих версиях, предлагает инновационное и мощное решение этой проблемы. В этом разделе представлен глубокий анализ базовой логики этой системы, её основных компонентов — окон варпинга («Warp Windows») и целей варпинга («Warp Targets»), а также подробно описана роль этих конфигураций в механиках, ориентированных на цель, таких как добивания на ближней дистанции. Motion Warping — это функция, позволяющая адаптировать анимации с корневым движением под текущее положение персонажа во время выполнения. Иными словами, даже если предполагается, что в анимации персонаж движется в определенном направлении, результат этого движения автоматически корректируется в соответствии с управлением игрока, позицией врага или другими динамическими факторами. Эта функция предоставляет огромные преимущества в механиках, где должна быть установлена четкая связь между начальной точкой анимации и целью, таких как атаки в прыжке, добивания или атаки с разбега.

Основу системы составляет компонент UMotionWarpingComponent, работающий на персонаже. Этот компонент является центральным строительным блоком, который активирует и управляет функцией Motion Warping для персонажа. Компонент доступен как через Blueprint, так и через C++, и позволяет управлять целями с помощью таких функций, как Add or Update Warp Target. Однако сам по себе этот компонент ничего не делает без анимации: процесс варпинга на самом деле зависит от определенных настроек внутри анимационного монтажа (Animation Montage). Самой важной из этих настроек является класс UAnimNotifyState_MotionWarping. Этот класс используется для определения «окна варпинга», которое активируется в определенный промежуток времени внутри анимационного монтажа. Эта конфигурация задействуется тогда, когда требуется адаптировать корневое движение к мировым координатам не на протяжении всей анимации, а лишь в определенном диапазоне (например, в средней части броска или при финальном ударе добивания). Благодаря этому остальные части анимации выполняются нормально, в то время как желаемая гибкость достигается только в критической зоне. Эти окна могут находиться в начале, середине или конце анимации, и в одном монтаже может присутствовать несколько разных окон.

Более детальный анализ окон варпинга требует понимания лежащей в их основе структуры. Каждый экземпляр UAnimNotifyState_MotionWarping указывает на тип RootMotionModifier. Этот модификатор является базовой структурой, определяющей, какой тип адаптации будет выполняться во время процесса варпинга, то есть какая деформация (масштабирование) будет осуществлена. Например, базовый модификатор URootMotionModifier_Warp настраивает положение и/или вращение персонажа относительно указанной цели. Более специфические модификаторы могут отвечать различным потребностям. Например, для анимации добивания на этапе входа можно использовать Rotation Modifier для фиксации вращения, а затем на этапе выхода, когда персонаж притягивается к врагу, — Translation Modifier. Эти модификаторы применяются поверх данных корневого движения анимации, когда окно варпинга активно. Класс UAnimNotifyState_MotionWarping предоставляет различные функции обратного вызова, связанные с жизненным циклом этого модификатора. Например, OnBecomeRelevant вызывается при добавлении окна варпинга в монтаж и начале его отсчета времени, и в этот момент активируется модификатор URootMotionModifier_Warp. Аналогичным образом, OnWarpBegin срабатывает при первом применении варпинга; OnWarpUpdate — во время обновления для каждого кадра; а OnWarpEnd — по завершении окна варпинга. Эти функции обратного вызова можно переопределить (override) в C++ или Blueprint, чтобы добавить пользовательскую логику в процесс варпинга. Например, такие действия, как воспроизведение звукового эффекта при начале атаки или запуск системы частиц, могут быть выполнены в одном из этих обратных вызовов.

Вторым основным компонентом в этой системе является целевая точка, называемая «Целью» («Target»). Warp target — это точка, к которой процесс варпинга адаптирует корневое движение персонажа. Эта цель является весьма гибкой и может определяться самыми разными способами. В простейшем виде целью может быть скелетная кость или сокет (socket) другого персонажа. Например, для добивания в качестве цели можно использовать «SpineSocket» или «PelvisSocket» на передней части тела врага. В более изощренном подходе целью может быть точка попадания луча (ray-cast), направленного туда, куда целится игрок. Это делает атаки более динамичными и ориентированными на пользователя. Кроме того, целью может быть пустой USceneComponent, размещенный на сцене и способный двигаться независимо от персонажа. Эта гибкость дает разработчикам свободу выбора наиболее подходящего варианта цели для различных механик. Цели регистрируются на UMotionWarpingComponent под уникальным именем (в виде строки). Это имя используется для обновления или удаления цели во время выполнения. Например, если цель зарегистрирована под именем «TakedownTarget», параметр «Warp Target Name» ноузды Add or Update Motion Warping Target в Blueprint принимает это значение.

В следующей таблице обобщены основные строительные блоки и их роли, составляющие систему Motion Warping:

В результате система Motion Warping начинается с добавления UMotionWarpingComponent к персонажу. Затем этот персонаж воспроизводит анимационный монтаж (Animation Montage), оснащенный UAnimNotifyState_MotionWarping. Этот монтаж использует указанные URootMotionModifier (UAnimNotifyState_MotionWarping) в определенные временные интервалы (окна варпинга), чтобы динамически адаптировать корневое движение персонажа в соответствии с FMotionWarpingTarget, определенным во время выполнения. Это тройное взаимодействие автоматизирует привязку анимаций непосредственно к миру, значительно упрощая проектирование и реализацию сложных механик, таких как добивания. Разработчики могут программировать поведение анимации в соответствии с игровой логикой с меньшим вмешательством со стороны аниматоров. Эта базовая структура закладывает основу для механизмов динамического обновления целей и масштабирования расстояния, которые будут рассмотрены в следующих разделах.

Управление целями во время выполнения с помощью Blueprint и C++

Сила системы Motion Warping в Unreal Engine 5 заключается не в статических настройках, а в ее способности адаптироваться к динамически меняющимся условиям во время работы игры. Особенно в ориентированных на цель механиках, таких как добивания, критически важно, чтобы цель (целевая точка) постоянно обновлялась на основе таких динамических данных, как текущее положение, направление и расстояние игрока до врага. В этом разделе подробно описывается, как динамически создавать, обновлять и управлять целью с помощью UMotionWarpingComponent через Blueprint и C++. Этот процесс следует схожим базовым принципам как для визуального скриптинга (Blueprint), так и для разработки кода (C++), но имеет различия на уровнях реализации.

API Blueprint предоставляет разработчикам множество готовых и простых в использовании ноуд (узлов) для управления целями Motion Warping. Эти ноуды представляют функцию Add or Update Warp Target компонента UMotionWarpingComponent и включают различные параметры, определяющие положение, вращение и статус отслеживания цели. Самым базовым и часто используемым ноудом является Add or Update Motion Warping Target. Основными входными данными для этого ноуда являются: целевой компонент, к которому будет добавлена цель, уникальный идентификатор (имя) цели, положение цели, вращение цели и флаг Follow Component, указывающий, должна ли цель следовать за ссылочным компонентом. Этот ноуд обновляет цель, если она уже существует с указанным именем, или создает новую, если нет. Это очень эффективно для обновления только значений цели вместо ее пересоздания каждый кадр или при каждом срабатывании атаки.

Помимо Add or Update Motion Warping Target, Blueprint предоставляет и другие вспомогательные ноуды для создания цели на более абстрактных уровнях. Например, Add or Update Warp Target from Component использует позицию и вращение USceneComponent (сокета или пустого компонента) в качестве цели. Аналогичным образом, ноуды вроде Add or Update Warp Target from Location and Rotation и Add or Update Warp Target from Transform позволяют определять цель напрямую с помощью векторов положения и вращения или структуры Transform. Такая гибкость допускает сложные сценарии, где метод расчета цели может изменяться в зависимости от игровой логики. Например, для добивания целью может быть точка попадания луча (ray-cast), направленного в обращенную к игроку поверхность врага. В этом случае в Blueprint выполняется операция ray-cast, извлекаются положение и вращение из полученного HitResult, и эти значения передаются в ноуд Add or Update Warp Target from Location and Rotation.

Динамическое обновление цели обычно происходит в определенный момент игровой логики. Типичный сценарий выглядит следующим образом: игрок инициирует добивание против ближайшего врага. Обычно это происходит из системы игровых способностей (Gameplay Ability System) или в цикле (tick) персонажа. После срабатывания сначала рассчитывается целевая позиция. Этот расчет может заключаться в нацеливании на сокет врага (например, «HeadSocket») или на позвоночник ( pelvis) первого врага на линии видимости игрока. Вращение цели также может быть настроено по желанию; например, компоненты X и Y вращения цели могут быть сброшены до нуля, чтобы убедиться, что персонаж смотрит на цель. Наконец, эти рассчитанные положение и вращение присваиваются цели, зарегистрированной UMotionWarpingComponent под определенным именем (например, «TakedownTarget»), с помощью ноуда Add or Update Motion Warping Target. Затем воспроизводится Animation Montage, использующий эту подготовленную цель. Если цель необходимо постоянно обновлять (например, если цель находится в движении), можно включить опцию Follow Component . Эта опция гарантирует автоматическое обновление позиции цели при перемещении SceneComponent, на который она ссылается, в любое место на сцене. Однако у этого подхода есть потенциальный недостаток: если функция Tick персонажа-владельца (Owner) отрабатывает раньше функции Tick самой цели, может возникнуть задержка в один кадр. Чтобы устранить эту проблему, можно управлять порядком обновления, добавив Tick Prerequisite к функции Tick самой цели .

На стороне C++ эта функциональность доступна напрямую из класса UMotionWarpingComponent. Функция с именем AddOrUpdateWarpTarget является ключевым инструментом для динамического управления целью . Эта функция принимает два основных параметра: уникальное имя цели (const FName& InTargetName) и структуру FMotionWarpingTarget, содержащую данные цели (const FMotionWarpingTarget& InTarget) . Структура FMotionWarpingTarget включает множество свойств, эквивалентных входам в Blueprint: Component (ссылочный компонент), LocationOffset (смещение позиции), RotationOffset (смещение вращения), bUseRotationOffset (использовать ли смещение вращения), bUseCustomRotation (использовать ли пользовательское вращение) и CustomRotation (заданное пользовательское вращение). Программное создание и заполнение этой структуры требует больше кода по сравнению с Blueprint, но в то же время обеспечивает большую гибкость и контроль.

Интеграция с C++ идеально подходит для сценариев, требующих реализации логики целей на более глубоких уровнях, таких как сложное поведение ИИ или логика контроллера персонажа игрока. Например, класс AEnemyCharacter может динамически определять свою цель при атаке игрока, используя собственный UMotionWarpingComponent. Хотя это отличается от ситуации, когда UMotionWarpingComponent класса AMainPlayerController обновляется напрямую, принципы остаются теми же. Следующий фрагмент кода на C++ демонстрирует, как работает этот процесс:


FMotionWarpingTarget TakedownTarget;
TakedownTarget.TargetName = TEXT("TakedownTarget");
TakedownTarget.Component = EnemyPelvisSocket; 
TakedownTarget.bUseRotationOffset = true;
TakedownTarget.RotationOffset = FRotator(0.0f, 90.0f, 0.0f); 
UMotionWarpingComponent* MotionWarpingComp = Cast<UMotionWarpingComponent>(GetAbilitySystemComponent());
if (MotionWarpingComp)
{
   
    MotionWarpingComp->AddOrUpdateWarpTarget(TakedownTarget);
}

Этот код добавляет или обновляет цель с именем TakedownTarget в UMotionWarpingComponent на основе сокета таза врага и со смещением вращения +90 градусов. Этот подход предлагает более производительный и типобезопасный опыт кодирования по сравнению с Blueprint. Кроме того, положение и вращение цели могут быть получены из более сложных систем на базе C++, таких как симуляция физики или сложные алгоритмы поиска пути.

В следующей таблице сравнивается управление целями с помощью Blueprint и C++:

В заключение, как Blueprint, так и C++ предлагают мощные и функциональные инструменты для динамического управления целями Motion Warping. Blueprint идеально подходит для быстрой итерации и потока визуальной логики, в то время как C++ превосходит в плане более высокой производительности, типобезопасности и сложной игровой логики. В профессиональном проекте по разработке игр наиболее эффективной стратегией является взаимодополняющее использование этих двух подходов. Ситуации, где положение цели определяется простым лучом (ray-cast), могут быть решены с помощью Blueprint, в то время как сложное поведение ИИ или одновременное управление большим количеством целей эффективнее обрабатывать на C++.

Механизмы адаптации по разнице динамического расстояния и угла

Успех механики добивания зависит не только от эстетической привлекательности анимации, но и от ее способности последовательно взаимодействовать с динамическим миром игры. Это взаимодействие достигается за счет адаптации корневого движения анимации в зависимости от мгновенного расстояния и разницы в угле между игроком и противником. Хотя система Motion Warping предоставляет базовый механизм для автоматической адаптации, для достижения желаемого сложного поведения необходимо понимать некоторые важные технические детали и потенциальные препятствия. В этом разделе рассматривается то, как добиться адаптации по разнице расстояния и угла с использованием стандартной функциональности Motion Warping, а также исследуются ограничения, с которыми можно столкнуться в этом процессе, и продвинутые решения для их преодоления.

Когда активируется окно корневого движения (определяемое внутри монтажа анимации), стандартный Motion Warping берет необработанные данные корневого движения (изменения положения и вращения), генерируемые анимацией, и корректирует эти данные относительно заданной цели. Например, предположим, что анимация добивания заставляет персонажа сделать шаг вперед на 300 см. Если этот монтаж воспроизводится с целью (целевой точкой), указывающей на грудь противника, механизм Motion Warping вместо перемещения персонажа вперед примерно на 300 см переместит его только на текущее расстояние между игроком и противником (например, 150 см). Это гарантирует, что персонаж не проскочит мимо противника и не остановится раньше времени, а анимация будет «привязана» к цели. Адаптация вращения работает аналогичным образом: данные вращения анимации корректируются в соответствии с вращением цели, поворачивая персонажа лицом к противнику. Это основная логика адаптации как по расстоянию, так и по разнице угла.

Однако в этом простом подходе есть существенное ограничение: он склонен предполагать статичное «целевое расстояние» для самой анимации. То есть Motion Warping настраивает направление и положение корневого движения относительно цели, но способность напрямую масштабировать величину (длину) этого корневого движения обычно является скорее необходимостью, чем следствием базового дизайна системы. Если игрок находится слишком далеко от противника в момент запуска анимации добивания, варпинг применяет расстояние в 300 см полностью. Если слишком близко — варпинг сокращает расстояние. Тем не менее возникает проблема: если игрок продвигается к противнику после начала анимации и внезапно оказывается в той же позиции, что и противник, механизм варпинга не может этого распознать и продолжает выполнять оставшуюся часть анимации, пытаясь переместить игрока за спину противника. Это нежелательное и несогласованное поведение. Аналогично, если игрок начинает движение прямо за спиной противника, механизм варпинга попытается потянуть персонажа к цели, ожидающей перед противником, но это может привести к странному вращению, выглядящему так, будто персонаж появляется из-за спины оппонента.

Чтобы решить эту проблему, разработчики создали несколько обходных путей (workarounds) и продвинутых стратегий для динамического контроля величины корневого движения. Самый простой из них — использовать проверку коллизий (collision check), которая прерывает корневое движение. В этом методе после запуска монтажа атаки перед персонажем игрока запускается небольшой трассировщик квадрата (box trace) или сферы (sphere trace). Эта трассировка проверяет, есть ли на пути игрока препятствие. Если трассировка касается коллайдера противника, скорость (velocity) CharacterMovementComponent игрока сбрасывается. Это мешает игроку проскочить мимо противника. Данный метод жертвует естественной гибкостью Motion Warping, так как игрок больше не движется со свободораспределенным корневым движением; его перемещение ограничивается кодом. В механиках, требующих быстрых реакций, это может привести к зависанию или «залипанию» движений игрока.

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

Стандартный URootMotionModifier_Warp корректирует корневое движение с помощью целевого трансформа (transform), но не предлагает возможности применения дополнительной логики поверх этого трансформа. Поскольку в системе отсутствовал «механизм расширения» (extension mechanism), позволяющий разработчикам добавлять пользовательскую логику, для преодоления этого ограничения требуется наследоваться от собственного класса URootMotionModifier. Когда этот кастомный модификатор наследуется от URootMotionModifier_Warp, он может переопределить функцию Update() для настройки логики варпинга. Внутри нее, перед вызовом Super::Update(), вы можете получить целевой трансформа через GetTargetTransform() и применить к нему собственную логику. Например, вы можете применить смещение (offset), которое сдвигает целевой трансформа немного назад (отрицательный вектор вперед / negative forward vector) в зависимости от расстояния игрока до противника. Это гарантирует, что варпинг достигнет цели, но предотвратит попытку корневого движения анимации заполнить максимальную дистанцию. Это самый чистый и гибкий способ манипулирования величиной корневого движения. Такой подход позволяет разработчикам добавлять совершенно новые типы поведения в систему Motion Warping и создавать согласованную механику, полностью совместимую с физическими и логическими правилами игры.

В следующей таблице представлено сравнение различных стратегий адаптации:

Кроме того, улучшения Motion Warping в версиях UE5.1 и новее расширили возможности этой системы. Например, в версии 5.1 была добавлена поддержка, позволяющая внедрять трансляцию (перемещение) через плагин варпинга даже тогда, когда у самой анимации нет никакого корневого движения. Это делает даже те анимации, у которых раньше не было корневого движения, адаптивными и открывает более широкий спектр их применения.

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

Ограничения, потенциальные проблемы и подходы к расширенным решениям

Хотя система Motion Warping в Unreal Engine 5 представляет собой мощную основу для адаптации анимаций с корневым движением под динамический мир, эта технология все еще развивается, что влечет за собой определенные ограничения, потенциальные проблемы и неожиданное поведение. В этом разделе обсуждаются данные трудности, задокументированные баги и влияние на производительность, с которыми могут столкнуться разработчики, а также предлагаются продвинутые подходы к решению для их преодоления. Одним из наиболее критических ограничений системы является то, что разработчикам не предоставлен «механизм расширения» (extension mechanism) для добавления кастомной логики к трансформам FMotionWarpingTarget во время выполнения. Текущая архитектура передает целевой трансформа в логику варпинга и не оставляет шансов на его изменение. Это серьезное ограничение для продвинутых механик. Например, эффекты, которые отталкивают персонажа на определенное расстояние после удара или добавляют динамически меняющееся вращение в зависимости от цели, сложно реализовать напрямую с помощью стандартного API. Единственный официальный способ обойти эту проблему — наследоваться от URootMotionModifier и изменять целевой трансформа с помощью вашей собственной логики в функции Update(). Это требует от разработчиков глубокого понимания системы и добавления собственных правил, но в то же время является наиболее гибким решением.

Задокументированные баги — это еще один фактор, требующий осторожности при использовании Motion Warping. Например, в указанных источниках отмечается, что варпинг вращения может давать несогласованные результаты, из-за чего персонаж не достигает цели и попадает в другую позицию. Аналогичным образом в отчете об ошибке утверждалось, что в версии UE5.0.2 варпинг работал только в плоскости XY и некорректно функционировал на оси Z. Подобные проблемы, зависящие от платформы или версии, подчеркивают важность тестирования в производственных средах и разработки возможных обходных путей (workarounds).

Кроме того, еще одна серьезная ошибка заключается в том, что варпинг не активируется повторно после добавления цели к определенному монтажу анимации. Этот баг возникает из-за того, что модификатор URootMotionModifier_Warp при единоразовом отключении больше не активируется заново, даже если цель добавляется повторно. Epic Games выпустила патч для решения этой проблемы, но подобные ошибки могут стать серьезным препятствием, особенно для разработчиков, использующих более старые версии. При столкновении с такими неполадками в качестве временного решения можно использовать специальные условия, унаследованные от UMotionWarpingSwitchOffCondition. Например, условие отключения на основе расстояния может сохранять варпинг пассивным до тех пор, пока персонаж находится достаточно близко к цели, и повторно активировать варпинг при уменьшении расстояния.

Производительность — это еще один фактор, который следует учитывать, особенно в крупномасштабных сценах, где Motion Warping интенсивно используется для сложных персонажей. Персонажи с большим количеством одновременно работающих целей варпинга могут создавать дополнительную нагрузку на CPU. В частности, обновление целей на каждом кадре в функции Stop может быть затратным с точки зрения производительности. Поэтому обновление целей только при необходимости — то есть при запуске атаки или значительном перемещении цели — имеет решающее значение для оптимизации. Хотя параметр Follow Component гарантирует автоматическое обновление цели при перемещении ее ссылки, это все равно может потребовать проверки на каждом кадре. Более эффективным подходом является настройка USceneComponent (ссылки на цель) на отправку сигнала об изменении (notification) и прослушивание этого сигнала для обновления цели только при таких изменениях. Кроме того, выполнение сложных лучевых трассировок (ray-casts) или математических вычислений в функции Stop может негативно сказаться на производительности. Подобные операции должны быть сведены к минимуму или заменены более эффективными алгоритмами.

Расширенные подходы к решению требуют более глубокого понимания и настройки системы для преодоления вышеупомянутых ограничений и проблем. Как уже упоминалось, кастомные модификаторы корневого движения — один из самых мощных инструментов. Это включает в себя создание классов, унаследованных от URootMotionModifier и переопределяющих функцию Update(). Эти пользовательские модификаторы могут расширять стандартную логику варпинга или полностью заменять ее. Например, создав URootMotionModifier_DirectionalWarp, вы можете гарантировать, что варпинг применяется только вдоль определенной оси (например, оси движения вперед / forward axis). Или же, создав такой класс, как URootMotionModifier_WeightedBlend, вы можете объединить трансформы нескольких целей с весами для создания сложной целевой точки. Этот подход дает разработчику полный контроль над системой Motion Warping и несет в себе потенциал создания безграничного разнообразия механик.

Другой продвинутый подход — объединение Pose Warping с Motion Warping. Pose Warping динамически настраивает позу персонажа (положение и вращение костей) в соответствии с определенными целями. Это дополняет тот факт, что Motion Warping работает только с корневой костью (root bone). Например, в механике добивания, пока Motion Warping пытается подтянуть персонажа к противнику, Pose Warping может зафиксировать руки или ноги персонажа на теле противника или в целевой точке. Это устанавливает более прочную согласованность и физическую связь между глобальным движением анимации и локальной позой персонажа. Интеграция этих двух систем позволяет обеспечить более глубокое и последовательное «прилипание» персонажа к миру.

В следующей таблице суммированы потенциальные проблемы, связанные с Motion Warping, и предложенные расширенные решения для их преодоления:

В заключение можно сказать, что система Motion Warping в Unreal Engine 5 — отличная отправная точка для разработки механик добивания профессионального уровня. Тем не менее, чтобы полностью задействовать эту систему и обеспечить ее бесперебойную работу в продакшн-среде, разработчики должны хорошо понимать фундаментальные ограничения, потенциальные проблемы и влияние на производительность. Вместо простых решений на Blueprint следует применять более продвинутые подходы, такие как кастомные модификаторы корневого движения на C++ и интеграция с другими анимационными системами Unreal Engine. Это позволяет разработчикам рассматривать Motion Warping не просто как инструмент настройки корневого движения, а как компонент игрового движка, разработанный для контроля физического и логического поведения персонажа.

*Примечание: Изображения сгенерированы Google Gemini.

MotionWarpingRootMotionBlueprintC++GameDev
Инструмент глубокого поиска
Qwen (Alibaba Cloud)
Qwen (Alibaba Cloud)
Инструмент перевода
Google Gemini
Google Gemini

Поделиться
Растягивание анимации в зависимости от расстояния между игроком и врагом с помощью Motion Warping в Unreal Engine 5 | GameDev Base