- Movement Component в Unreal Engine
- Ключевая функциональность Movement Component
- Наследование классов
- Родительский класс
- Дочерние классы
- Updated Component
- Настройки Movement Component во вкладке Details
- Velocity
- Planar Movement
- Movement Component
- Blueprint-функции, связанные с абстрактным компонентом Movement Component
- Управление плоскостью ограничения движения
- Получение информации
- Управление движением
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы обсудим абстрактный компонент Movement Component, отвечающий в Unreal Engine (UE5, UE4) за функциональность перемещения подконтрольного ему компонента. Разберём его настройки, а также связанные с ним Blueprint-функции.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Movement Component в Unreal Engine
Movement Component в Unreal Engine — это абстрактный компонент, который отвечает за функционал перемещения связанного с ним Updated Component (обновляемого компонента, обычно это Root-компонент Актора-владельца), обновляя его положение и ориентацию каждый кадр.
* Абстрактный компонент (Abstract Component) — это класс компонента, объект которого не может быть создан напрямую. Он служит в качестве основы или шаблона для других, более конкретных (неабстрактных) компонентов.
Перевод официальной справки: Movement Component — абстрактный компонентный класс, определяющий функциональность для перемещения Primitive Component (Updated Component) каждый кадр.
При своей инициализации Movement Component выбирает подконтрольный ему компонент, который он будет перемещать (Updated Component). Обычно это Root Component Актора, однако можно явно указать другой компонент с помощью функции Set Updated Component.
Далее, в процессе обновления каждый тик (Tick), Movement Component рассчитывает новое положение для Updated Component на основе текущей скорости (Velocity), возможных ограничений движения по плоскостям (Plane Constraint) и других параметров. После вычисления нового положения компонент непосредственно перемещает Updated Component на заданную дельту и устанавливает значение вращения (Rotation), используя внутренний метод MoveUpdatedComponent(), с учётом всех заданных ограничений.
Во время перемещения Movement Component учитывает возможные коллизии (столкновения с другими объектами) и проникновения (Penetration) в другие объекты. В случае проникновения компонент вызывает внутренний метод ResolvePenetration() для корректного выхода из состояния проникновения. Также, если при движении возникает столкновение с поверхностью, могут применяться специальные внутренние методы (например, SlideAlongSurface()), чтобы обеспечить корректное скольжение вдоль поверхности препятствия и сделать движение более естественным.
После завершения перемещения Movement Component обновляет скорость (Velocity) у подконтрольного компонента (Updated Component) с помощью внутреннего метода UpdateComponentVelocity(), чтобы другие системы, зависящие от Velocity, работали корректно.
Таким образом, Movement Component служит базовым строительным блоком для реализации любой логики передвижения объектов в игровом мире. Он инкапсулирует общие задачи перемещения, такие как обработка коллизий, ограничений и обновление положения компонента на основе скорости (Velocity), позволяя уже классам-потомкам реализовывать конкретные специфические типы движения (например, движение персонажа, снаряда, транспорта).
Ключевая функциональность Movement Component
- Move Updated Component — перемещение Updated Component (обычно Root-компонента Актора-владельца);
- Constrain Plane — ограничение перемещения по плоскости или оси;
- Collision Result — специальная обработка коллизий (результатов столкновений) во время перемещения и реакций на них;
- Penetration — обработка возможных первоначальных проникновений объектов друг в друга;
- Tick Control — управление зависимостями тика компонента (Tick Before Owner).
Наследование классов
Родительский класс
Movement Component наследуется от класса Actor Component, расширяя его функционалом перемещения связанного обновляемого компонента (Updated Component).

Дочерние классы
Вследствие своей абстрактности, Movement Component является базовым классом для более специализированных компонентов:
- Projectile Movement Component — компонент, обеспечивающий движение снарядов с учетом гравитации, скорости, ускорения и траектории полёта.
- Nav Movement Component — абстрактный компонент, предоставляющий базовую навигационную функциональность для компонентов движения.
Updated Component
Как уже писалось выше, абстрактный компонент Movement Component перемещает связанный с ним Updated Component.
По сути, Updated Component — это целевой компонент, на который применяются все вычисления и действия, связанные с движением. Он имеет тип Scene Component (компонент сцены). Это означает, что обновляемым компонентом может быть любой компонент, унаследованный от Scene Component, например Static Mesh Component, Skeletal Mesh Component, Capsule Component. Важно, чтобы это был именно компонент сцены, потому что Movement Component использует его трансформацию (местоположение, вращение и масштаб) для вычисления и применения движения.
Чаще всего в качестве Updated Component используется Root-component (корневой компонент) Актора. Корневой компонент — это «основа» Актора, и его перемещение влечет за собой перемещение всего Актора (включая все прикрепленные к нему компоненты). Именно поэтому, если не указано иное, Movement Component часто автоматически пытается назначить Root-component Актора в качестве Updated Component (если параметр данного компонента Auto Register Updated Component установлен в значение True).
Однако, Updated Component не обязательно должен быть Root-компонентом. В некоторых случаях может потребоваться перемещать только часть Актора, оставив остальное на месте. Переназначить обновляемый компонет для Movement Component позволяет специализированная функция Set Updated Component, которая назначает новый компонент для перемещения и обновления.
Настройки Movement Component во вкладке Details
Компонент Movement Component является дочерним от класса Actor Component. Соответственно, многие настройки вкладки Details также были унаследованы от родительского компонента. Чтобы не повторяться, в этой статье рассмотрим только дополнительные настройки, относящиеся к Movement Component.
Остальные повторяющиеся настройки (Component Tick, Tags, Replication, Variable, Cooking, Asset User Data, Navigation) Вы можете изучить в отдельной статье: Details в Actor Component.
Velocity

- Velocity (скорость) — текущая скорость (вектор скорости) перемещаемого компонента (Updated Component).
Planar Movement
Категория Planar Movement (движение по плоскостям) определяет ограничения движения компонента в пределах плоскости. Это может быть полезно для создания 2D-игр или для ограничения движения в 3D-игре.

- Plane Constraint Normal (нормаль ограничения плоскости) — нормаль или ось плоскости, которая ограничивает движение, если включена опция Constrain To Plane. Значение 0 — движение по оси разрешено, значение 1 — движение по оси заблокировано.
- Plane Constraint Origin (начало ограничительной плоскости) — задаёт точку отсчёта (начало координат) плоскости, к которой привязывается движение объекта, если включена опция Constrain To Plane.
- Constrain to Plane (ограничить плоскостью) — если установлено значение True, движение будет ограничено плоскостью. Включает или отключает ограничение движения в заданной плоскости. Полезно для создания 2.5D игр или для ограничения движения в определенных областях.
- Snap to Plane at Start (привязать к плоскости при старте) — если установлено значение True, и включены ограничения плоскости, перемещаемый компонент (Updated Component) будет привязан к плоскости при первом подключении. Параметр гарантирует, что Актор начнёт движение непосредственно на плоскости, если включено ограничение.
- Plane Constraint Axis Setting (настройка оси ограничения плоскости) — определяет, как ограничивается движение компонента по плоскости, то есть вдоль какой оси движение запрещено (заблокировано), если включено ограничение по плоскости.
- Custom: ограничить движение по пользовательской (заданной вручную) оси.
- X: заблокировать движение по оси X (движение только в плоскости YZ).
- Y: заблокировать движение по оси Y (движение только в плоскости XZ).
- Z: заблокировать движение по оси Z (движение только в плоскости XY).
- Use Global Physics Setting: использовать глобальную настройку физики проекта для ограничения движения.
Movement Component
Категория Movement Component (компонент движения) определяет базовые настройки обновления компонента в Unreal Engine (UE4, UE5).

- Update Only if Rendered (обновлять только если отображается) — если Актор не виден на экране, его движение не будет обновляться (функция TickComponent() пропускается), что экономит ресурсы. Может вызвать проблемы, если объект должен двигаться за пределами видимости.
- Auto Update Tick Registration (автоматически обновлять регистрацию Tick) — если установлено значение True, всякий раз, когда перемещаемый компонент (Updated Component) изменяется, Movement Component включит или отключит свой Tick в зависимости от того, есть ли что-то для обновления. Помогает оптимизировать производительность.
- Tick Before Owner (выполнять Tick перед владельцем) — если установлено значение True, Tick компонента Movement Component выполняется перед Tick его владельца. Порядок Tick может быть важен для правильной работы некоторых систем. Эта опция гарантирует, что компонент движения будет обновлён до того, как будет обновлен Актор-владелец.
- Auto Register Updated Component (автоматически регистрировать обновляемый компонент) — если установлено значение True, движок регистрирует корневой компонент Актора-владельца в качестве Updated Component, если в данный момент нет назначенного компонента для обновления. Иначе говоря, параметр автоматически назначает корневой компонент Актора в качестве компонента, который будет перемещаться.
- Auto Register Physics Volume Updates (автоматически регистрировать обновления объёма физики) — параметр позволяет компоненту движения автоматически обновлять информацию о Physics Volume, в котором находится Актор.
- Component Should Update Physics Volume (компонент должен обновлять объём физики) — включает отслеживание физического объема (Physics Volume) у связанного компонента (Updated Component) во время инициализации или при его изменении через Set Updated Component. Это позволяет компоненту определять, находится ли он в воде, под действием гравитации или других физических условий.
Blueprint-функции, связанные с абстрактным компонентом Movement Component
Управление плоскостью ограничения движения

- Constrain Direction to Plane — ограничивает вектор направления движения ограничением плоскости, если включено ограничение движения по плоскости (Plane Constraint).
- Constrain Location to Plane — ограничивает переданный вектор позиции (Location) плоскостью, если включено ограничение движения по плоскости (Plane Constraint).
- Constrain Normal to Plane — ограничивает переданный нормализованный вектор (единичной длины) плоскостью, если включено ограничение движения по плоскости (Plane Constrain).
- Set Plane Constraint Axis Setting — устанавливает тип ограничения движения по плоскости.
- Custom: ограничить движение по пользовательской (заданной вручную) оси.
- X: заблокировать движение по оси X (движение только в плоскости YZ).
- Y: заблокировать движение по оси Y (движение только в плоскости XZ).
- Z: заблокировать движение по оси Z (движение только в плоскости XY).
- Use Global Physics Setting: использовать глобальную настройку физики проекта для ограничения движения.
- Set Plane Constraint Enabled — включает или отключает ограничение движения по плоскости.
- Set Plane Constraint from Vectors — задаёт ограничивающую движение плоскость с помощью переданных векторов направления Forward (вперёд) и Up (вверх).
- Set Plane Constraint Normal — задать нормаль (ось) плоскости, к которой будет ограничено движение компонента, если включено ограничение по плоскости (Plane Constraint).
- Set Plane Constraint Origin — задаёт начало координат (Origin) плоскости, к которой ограничено движение компонента, если включено ограничение по плоскости (Plane Constraint).
- Snap Updated Component to Plane — перемещает Updated Component на плоскость ограничения. Это полезно для инициализации положения компонента или для исправления его положения, если он каким-то образом оказался вне плоскости
Получение информации

- Get Plane Constraint Axis Setting — возвращает текущую настройку оси ограничения движения по плоскости.
- Custom: ограничить движение по пользовательской (заданной вручную) оси.
- X: заблокировать движение по оси X (движение только в плоскости YZ).
- Y: заблокировать движение по оси Y (движение только в плоскости XZ).
- Z: заблокировать движение по оси Z (движение только в плоскости XY).
- Use Global Physics Setting: использовать глобальную настройку физики проекта для ограничения движения.
- Get Plane Constraint Normal — возвращает нормаль (ось) плоскости, к которой ограничено движение компонента, если включено ограничение по плоскости (Plane Constraint).
- Get Plane Constraint Origin — возвращает точку-начало (Origin) плоскости, к которой ограничено движение компонента, если включено ограничение по плоскости (Plane Constraint).
- Get Gravity Z — возвращает силу тяжести (силу гравитации), влияющую на этот компонент.
- Get Max Speed — возвращает максимальную скорость компонента в текущем режиме движения (например, при ходьбе, беге, плавании).
- Get Physics Volume — возвращает указатель на Physics Volume, в котором находится компонент. Если компонент не находится ни в одном Physics Volume, возвращается Physics Volume по умолчанию для мира.
- Is Exceeding Max Speed — возвращает значение True, если текущая скорость компонента превышает заданную максимальную скорость. Используется для предотвращения слишком быстрого движения компонента.
Управление движением

- Move Updated Component — перемещает Updated Component на вектор Delta и задает новую ориентацию New Rotation. Если Sweep включён, учитывает столкновения, если включён Teleport — телепортирует без столкновений. Возвращает результат столкновения (Hit Result) или None.
- Set Updated Component — устанавливает новый компонент, который будет перемещаться и обновляться.
- Stop Movement Immediately — немедленно останавливает движение компонента, обнуляя скорость и, если есть, ускорение.
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Создается вот так у меня Character программно. Беру схему и создаю
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ACharacter* NewActor_ = GetWorld()->SpawnActor(
CharacterClass,
FVector(1690, 1120, 88),
FRotator(0, 0, 0)
);
В самом Character задается через таймер движение
void ATestProjectCharacter::BeginPlay()
{
Super::BeginPlay();
GetWorldTimerManager().SetTimer(
MoveCheckTimerHandle,
this,
&ATestProjectCharacter::UpdateMovementState,
1.0f,
true
);
}
void ATestProjectCharacter::UpdateMovementState()
{
FVector ForwardDirection = FVector(1.0f, 0.f, 0.f);
FVector RightDirection = FVector(0.f, 1.0f, 0.f);
FVector2D MovementVector = FVector2D(-1.0, 0.0f);
UCharacterMovementComponent* Movement = GetCharacterMovement();
Movement->Velocity = ForwardDirection + 300;
}
То в таком случаи компонент Movement работает исключительно если взять и переместить схему в игровое пространство, при процедурной генерации кодом, movement не работает. Пока не получилось
Так по кусочкам кода трудно что-то дельное сказать, но в целом, если движение работает при ручном размещении в мире и не работает при программном спавне, то напрашивается вывод, что проблемы с инициализацией.
Когда схема размещена в мире, то движок при старте игры стандартным образом перебирает все Акторы в мире и инициализирует их, только потом уже запускает игру. Соответственно, Ваша схема в этом варианте успевает проинициализироваться и работает.
При программном спавне во время игры, вероятно, что-то не успевает проинициализироваться…
После спавна персонажа программно, убедитесь, что:
Также в этой строчке, скорее всего, ошибка: Movement->Velocity = ForwardDirection + 300;
вы складываете вектор и число (ForwardDirection + 300), что некорректно. Вам нужно указать направление движения и скорость (величину) этого движения. Вы уже имеете ForwardDirection (направление), поэтому нужно умножить его на желаемую скорость.
Да, это перегрузка функции. Тем более когда руками размещаешь схему все работает, а процедурная генерация кодом увы нет. Через дебаг смотрел, а там состояния компонента не обновляется. Компонент есть у владельца, который генерируется кодом, и даже задается Velocity, и даже стандартная анимация срабатывает когда меняется состояния Velocity, но вот движение уже Movement не обрабатывает. Да он почему то не зарегистрирован, состояния компонента не обновляется. Если найду детальную причину и решение обязательно напишу
Решение нашлось. Все дело в том, что moment component работает с физикой окружающего мира. И поэтому он должен быть инициализирован в конструкторе GameMode. Если Character создавать после конструктора, то movement не будет работать с физикой окружающей среды. Он будет у Character, но у него не будет таймера обновления. Как привязывать физику к компоненту после конструктора не знаю. Может есть другие ходы, другие решения
Здорово, что решение нашлось, благодарю, что написали его.
Как мы и предполагали с Вами, проблема в инициализации…