Appearance
Motion 2.0
Motion 2.0 is a full architectural rewrite of Motion for Unreal Engine 5.6, 5.7, and 5.8. It replaces the Motion-specific character inheritance stack from Motion 1.x with standard Unreal Engine character, movement, GAS, Enhanced Input, animation, and content workflows.
The result is a component-based first-person controller that can be added to your own characters, PlayerStates, AttributeSets, input bindings, animation blueprints, and first-person item systems.
Breaking release
Motion 2.0 is not an in-place upgrade from Motion 1.x.
Treat Motion 2.0 as a new integration. Remove Motion 1.x classes and Blueprint components. Add Motion 2.0 components to the project character. Connect project GAS and input. Move settings to component profile assets.
Highlights
- Motion 2.0 does not use
AMotionCharacteror other Motion-specific framework base classes. - Motion components work with all
ACharacter-based pawns when the project supplies the expected Unreal Engine systems. - GAS integration uses interface-first
UAbilitySystemComponentdiscovery plus documented component lookup fallbacks. - GAS is necessary for the supported Motion 2.0 component path. Motion does not provide a CharacterMovement-only architecture.
- Motion 2.0 movement tuning lives in versioned component profile DataAssets.
- Walk, sprint, crouch, jump, breathing, camera, movement sound, animation, and first-person item visuals are implemented as C++ components and runtime systems.
- Multiplayer behavior has been rebuilt around server-owned state, local prediction, GameplayEffect-backed state, validation, and rate limiting.
- Motion 2.0 supports first-person held-item presentation through native item configs, carry postures, hand IK, linked animation layers, and an upper-body overlay animation node.
Breaking changes
Motion-specific base classes removed
Motion 2.0 replaces the inheritance-first Motion 1.x architecture. Projects must own their gameplay framework classes and add Motion as components.
| Removed or replaced | Use in Motion 2.0 |
|---|---|
AMotionCharacter | Your own ACharacter subclass with Motion components added |
UMotionCharacterMovementComponent | Standard UCharacterMovementComponent |
UMotionAbilitySystemComponent | Standard UAbilitySystemComponent or your own subclass |
AMotionPlayerController | Your own APlayerController |
AMotionGameMode C++ class | Your own GameMode |
AMotionPlayerState C++ class | Your own PlayerState implementing IAbilitySystemInterface |
UMotionInputComponent / UMotionInputConfig | Project-owned Enhanced Input bindings |
UMotionCurveManager | UMotionCameraComponent integrated curve evaluation |
MotionComponentFunctionLibrary | Direct component APIs and supported helper APIs |
MotionGameplayEffectData | Profile and GameplayEffect asset configuration |
Motion 1.x Blueprint movement components such as BPC_BreathComponent, BPC_CrouchComponent, BPC_JumpComponent, BPC_MovementSoundComponent, BPC_SprintComponent, and BPC_WalkComponent are replaced by C++ components and profile-driven setup.
PlayerState and ASC discovery changed
Motion 1.x AMotionPlayerState is not part of Motion 2.0. Motion discovers the Ability System Component through IAbilitySystemInterface first, then supported actor and PlayerState component lookup fallbacks.
Projects must provide a GAS-enabled PlayerState that implements IAbilitySystemInterface. Configure the project GameMode to use this PlayerState class.
Motion components use event-driven ASC initialization through APawn::ReceiveControllerChangedDelegate, with fallback retry timers for multiplayer cases where Controller or PlayerState replication is delayed.
Attribute discovery changed
Motion 2.0 does not depend on UMotionAttributeSet. The class is available as a reference implementation.
Motion discovers expected attributes by name. The Motion 2.0 movement contracts are:
| Component | Expected attributes |
|---|---|
UMotionWalkComponent | WalkSpeed |
UMotionSprintingComponent | WalkSpeed, Stamina, MaxStamina, StaminaRegenRate, StaminaDrainRate |
If an expected attribute is missing, the affected feature fails closed and reports the missing contract. Other correctly configured Motion features can continue to operate.
At runtime, Motion components seed UMotionAttributeSet on authority when it is absent. Projects that route movement through same-named attributes on another set must retarget the relevant GameplayEffects and provide equivalent CharacterMovementComponent synchronization.
Motion 1.x SprintSpeed is not part of the Motion 2.0 attribute surface. Sprinting uses the walk-speed contract, sprint effects, and component/profile configuration.
Input ownership changed
Motion 2.0 does not provide a shared Motion input-binding layer.
Connect input in your Character or PlayerController with Enhanced Input. Then, call the applicable Motion component input handlers directly.
Motion 1.x tag groups not included in Motion 2.0 are:
Motion.Input.*Motion.Control.*Motion.Camera.DisableCollision
Define equivalent project tags in DefaultGameplayTags.ini if applicable.
Component tuning moved to profiles
Motion 2.0 walk, sprint, crouch, jump, breathing, movement sound, and camera defaults live in versioned component profile DataAssets.
Default Motion profiles are in:
text
/MotionCore/Motion/Profiles/v2_0_0Included defaults:
DA_MotionWalkProfile_Default_v2_0_0DA_MotionSprintProfile_Default_v2_0_0DA_MotionCrouchProfile_Default_v2_0_0DA_MotionJumpProfile_Default_v2_0_0DA_MotionBreathingProfile_Default_v2_0_0DA_MotionMovementSoundProfile_Default_v2_0_0DA_MotionCameraProfile_Default_v2_0_0
Duplicate Motion profiles into your project content before customizing them.
Profiles expose the settings projects are expected to tune, while runtime-only state stays inside the components.
Camera curve API changed
Motion 1.x UMotionCurveManager is not part of Motion 2.0. UMotionCameraComponent owns camera curve registration, evaluation, and blending.
Motion 2.0 camera effects use UCurveVector assets instead of inline FRuntimeVectorCurve data, and curve identifiers use FName rather than FString.
Motion 1.x FStructMotionCurve is FMotionCurve in Motion 2.0.
Logging macro signature changed
Motion 2.0 MOTION_LOG must have the component as the first argument.
cpp
// Motion 1.x
MOTION_LOG(LogMotionSprinting, Log, TEXT("Sprint started"));
// Motion 2.0
MOTION_LOG(this, LogMotionSprinting, Log, TEXT("Sprint started"));Motion 2.0 logging adds network-role and component context, and it compiles out in Shipping builds.
Movement sound configuration changed
UMotionMovementSoundComponent does not use the Motion 1.x sound arrays.
Motion 2.0 movement sound setup must have SurfaceSoundDataTable, FMotionSurfaceSoundDataRow rows, and MetaSound assets. Motion 1.x sound configuration is not supported.
A single footstep path routes walk, sprint, and crouch sounds based on movement state.
Major features
Universal component architecture
Motion 2.0 uses component composition. Add the applicable Motion components to a project ACharacter subclass. Do not inherit from a Motion character class.
Core runtime types include:
UMotionComponentBaseUMotionWalkComponentUMotionSprintingComponentUMotionCrouchingComponentUMotionJumpComponentUMotionBreathingComponentUMotionMovementSoundComponentUMotionCameraComponentUMotionHeldItemComponentUMotionAnimInstance
UMotionComponentBase centralizes shared behavior such as character/component discovery, ASC initialization, cached-component validation, local prediction state, and debug support. Derived components own their request-specific network validation.
GAS-first movement state
Motion 2.0 uses GAS for replicated movement state, attributes, and GameplayEffect-driven modifiers.
Included GameplayEffect assets support common movement and stamina states, including:
GE_Motion_WalkSpeedGE_Motion_SprintSpeedGE_Motion_CrouchSpeedGE_Motion_JumpVelocityGE_Motion_WalkingGE_Motion_SprintingGE_Motion_CrouchingGE_Motion_JumpingGE_Motion_WantsToSprintGE_Motion_WantsToCrouchGE_Motion_WantsToJumpGE_Motion_BreathingActiveGE_Motion_SprintStaminaDrainGE_Motion_SprintStaminaRegenGE_Motion_SprintStaminaRegenDelay
UMotionAttributeSet synchronizes key movement attributes to UCharacterMovementComponent properties, including WalkSpeed to MaxWalkSpeed and JumpVelocity to JumpZVelocity.
Walk
UMotionWalkComponent handles base walking behavior, directional speed handling, and walk-speed synchronization.
Walking initializes and synchronizes speed consistently with GAS attributes and directional movement, so startup speed and strafe/forward transitions stay in sync.
Sprint and stamina
UMotionSprintingComponent supports GAS-backed sprinting with stamina drain, regeneration, cooldown behavior, authority validation, local prediction, and movement-gated active sprinting.
Notable behavior:
- Sprint intent can remain held while idle.
- Active sprint state, stamina drain, and local sprint feedback start only once movement passes the configured threshold.
- Server-side decisions prevent multiplayer sprint cycling.
- Stamina comparisons use consistent raw values.
- Hysteresis prevents start and stop flicker near the stamina threshold.
- Sprint/crouch conflicts are resolved through Motion state handling.
Crouch
UMotionCrouchingComponent uses native Unreal crouch behavior, server validation, and smooth first-person camera interpolation.
Important behavior:
- Crouch uses native state as the public contract.
- Capsule resizing uses
Character->Crouch()andCharacter->UnCrouch()where appropriate. - Client visual capsule changes and remote synchronization work in multiplayer.
- Native crouch replication plus camera height interpolation reduces crouch jitter.
- Ground-based camera positioning prevents camera jumps during capsule height changes.
- Crouch speed validation uses proportional speed handling.
Jump
UMotionJumpComponent supports multiplayer-safe jump requests, coyote time, multi-jump budgeting, server-side validation, local prediction, and jump-input release handling.
Important behavior:
- Coyote time participates correctly in the multi-jump budget.
- Server jump counts are validated to prevent infinite jump exploits.
- Client and server use synchronized landing detection.
- Air jumps use character velocity for direction.
- Native
ACharacter::Jump()preserves horizontal momentum while Motion applies profile-driven jump velocity.
Breathing
UMotionBreathingComponent participates in the Motion component base initialization flow and uses Motion.Camera.BreathingActive as the public active-state contract.
The breathing path preserves camera curve recovery when a paused or resumed breathing curve is missing.
Camera
UMotionCameraComponent owns first-person camera curve evaluation, camera height interpolation, collision handling, additive camera effects, and item-facing camera/framing work.
Major capabilities include:
- Built-in location and rotation curve evaluation.
UCurveVectorcamera effects.FNamecurve identifiers.- Smooth crouch camera interpolation independent of capsule resizing.
- Ground-relative camera positioning for stable crouch transitions.
- Collision and framing support for first-person item visuals.
- Profile-driven setup with project-facing camera settings.
Movement sound
UMotionMovementSoundComponent uses DataTable-driven surface sound configuration and MetaSound-based variation.
Important behavior:
SurfaceSoundDataTableis necessary.- Movement sound data is cached for runtime lookup.
- Footstep routing handles walk, sprint, and crouch through a consolidated path.
- Landing sounds can be triggered directly from the jump component.
- Surface row contracts are validated so invalid rows fail predictably.
- Surface detection is event-based rather than tick-based.
First-person held items
Motion 2.0 adds native first-person held-item presentation.
The first-person item system includes:
UMotionHeldItemComponentUMotionNativeFirstPersonItemConfigFAnimNode_MotionFirstPersonItemUpperBodyOverlay- Config-driven carry postures
- Optional linked animation layers
- Native upper-body overlay blending
- Distributed pitch solve
- Hand IK
- Cross-faded automatic carry animations
- Config-authored presentation actions
- One-shot held-item visual actions with request and lifecycle-event flow
The first-person item system supports stable hand position, item collision, custom overlay persistence, remote aim pitch replication, and simulated proxy routing.
Animation
UMotionAnimInstance supports robust GAS discovery and first-person item overlay integration.
Motion 2.0 animation support includes:
- Generic ASC discovery through PlayerState and
IAbilitySystemInterfacepatterns. - Cached
GroundDistancestate with throttled airborne traces. - Runtime first-person item upper-body overlay support.
- Graph-safe accessors for Motion animation state.
- Multi-threaded animation support.
- Documented first-person pitch conventions.
Debugging and validation
Motion 2.0 adds a dedicated Motion Gameplay Debugger category and expanded logging support.
Debugging support includes:
- Context-aware
MOTION_LOGprefixes with network role and component name. - Gameplay Debugger output for component state, movement speed, stamina, GameplayEffects, GameplayTags, and camera curves.
- Initialization timeout messaging for delayed ASC discovery.
- Targeted log levels for normal operation.
Improvements
Performance
- Movement sound surface detection is event-driven.
- Breathing prevents unnecessary tick fallback paths.
- Ground traces in animation are throttled.
- Runtime-cached pointers are marked
Transientwhere appropriate. - ASC lookup uses
IAbilitySystemInterfacefirst. - Logged actor eviction is bounded.
- Operational logs use lower verbosity where appropriate.
Networking
- Movement actions use server validation with local prediction where appropriate.
- GameplayEffect-backed tags replicate movement state.
- Request validation applies to networked movement paths. Sprint and jump requests also have explicit rate limits.
- Local loose intent tags track crouch, sprint, and jump requests while authoritative active-state tags replicate from the server.
Documentation
Motion 2.0 documentation includes these starting points:
Important starting points:
- Quick start
- Add Motion to a character
- Verify multiplayer
- Component profiles
- Use GAS patterns
- Configure movement sounds
- Create camera curves
- Set up MotionAnimInstance
- First-person item configs
- First-person item API
- Networking commands
- MotionAbilitySystemHelper
- Known issues
- Supported versions
Migration notes
Fresh integration recommended
Do not attempt to migrate by keeping Motion 1.x classes in place.
- Remove Motion 1.x dependencies.
- Make your character inherit from
ACharacteror your own existing character base. - Use the standard
UCharacterMovementComponent. - Add the applicable Motion components.
- Provide a project PlayerState that owns or exposes the ASC and implements
IAbilitySystemInterface. - Provide attributes named for the Motion features you want to use, or use
UMotionAttributeSetas a reference implementation. - Wire Enhanced Input in your project code and call Motion component input handlers directly.
- Configure GameplayEffects for the movement-state and stamina paths you use.
UMotionAttributeSetalso supports optional speed and jump-velocity effects. - Duplicate Motion profile assets into your project before customizing movement, camera, sound, or effect defaults.
- Replace Motion 1.x movement sound arrays with
SurfaceSoundDataTablerows and MetaSound assets. - Update camera curves to
UCurveVectorassets and useFNameidentifiers. - Update all
MOTION_LOGcalls to pass the component as the first argument. - Rebuild first-person item setup around
UMotionHeldItemComponent, native item configs, and the upper-body overlay node if your project uses held items. - Validate multiplayer behavior with the project abilities, tags, AttributeSets, input, animation graphs, and network settings.
Known limitations and integration responsibilities
- Full replicated behavior depends on a correctly configured project GAS setup.
- Motion does not own your PlayerState, GameMode, PlayerController, ASC subclass, or input component.
- Missing necessary attributes disable the affected feature until the project supplies its GAS contract.
- Component profile migration is not automatic. Motion 1.x inline component edits are not converted into project-local profile assets.
- Movement sound must have a valid
SurfaceSoundDataTableand MetaSound setup. Motion 1.x array-based sound configuration is not supported. - Native first-person item visuals are optional. They must have compatible item configs and valid presentation assets.
- Motion includes workarounds and validation for Unreal jump-count behavior in UE 5.3-5.6. Custom jump logic must preserve Motion jump-count and input-release behavior.