Appearance
How to customize Motion movement behavior
Practical examples of frequently requested modifications to Motion's movement system.
Behavior-defining defaults live on component profile assets. For project tuning, duplicate the assigned Motion profile into your project content, edit the duplicate, and assign it back to the component's Profile property. See Component profiles for the complete profile workflow.
Adding Stamina Drain to Sprint
Motion's sprint component includes built-in stamina support. Here's how to enable and customize it.
Enable Stamina System
- Duplicate the assigned sprint profile.
- Set
bUseStaminaSystem = true. - Configure stamina thresholds:
| Property | Description | Recommended |
|---|---|---|
MinStaminaToSprint | Stamina needed to START | 1.5 |
MinStaminaToStopSprinting | Stamina to CONTINUE (hysteresis) | 0.25 |
RegenDelayDuration | Seconds before regen after exhaustion | 2.0 |
Configure Stamina Effects
Assign these GameplayEffects on the sprint profile:
SprintStaminaDrainEffect = GE_Motion_SprintStaminaDrain
StaminaRegenEffect = GE_Motion_SprintStaminaRegen
StaminaRegenDelayEffect = GE_Motion_SprintStaminaRegenDelayCustom Drain Rate
Create a custom GameplayEffect Blueprint:
- Duplicate
GE_Motion_SprintStaminaDrain - Modify the periodic effect magnitude
- Assign your custom effect to the sprint profile
Blueprint: React to Exhaustion
text
Event OnSprintStaminaDepleted
├── Play Sound (Exhaustion_SFX)
├── Play Camera Shake (Exhaustion_Shake)
└── Show UI WarningModifying Jump Behavior
Add Multi-Jump
Duplicate the assigned jump profile, then:
- Set
bEnableMultiJump = true. - Set
MaxAdditionalJumps = 1for double jump, or more for triple jump. - Optionally set
AdditionalJumpVelocityMultiplier = 0.8, or lower for weaker subsequent jumps.
Adjust Jump Height
Method 1: Jump profile values
JumpVelocityMultiplier = 1.2 // Multiply base jump velocity by 1.2
// OR
JumpVelocityModifier = 200.0 // Add 200 units to jump velocityMethod 2: GAS Attribute (dynamic)
text
// Create a GameplayEffect that modifies JumpVelocity attribute
// Apply the effect for temporary jump boostsAdd Coyote Time
On the assigned jump profile:
- Set
CoyoteTime = 0.15seconds after leaving ground, or0to disable.
Add Jump Buffer
On the assigned jump profile:
- Set
JumpBufferTime = 0.2seconds before landing, or0to disable.
Adding Movement Speed Buffs/Debuffs
Create Speed Modifier Effect
- Create new GameplayEffect Blueprint
- Configure:
- Duration: Duration or Infinite
- Modifier: Attribute = WalkSpeed, Op = Additive or Multiplicative
- Magnitude: Your speed change value
Apply from Blueprint
text
Get Ability System Component
├── Make Outgoing Spec (YourSpeedEffect, Level 1)
└── Apply Gameplay Effect Spec to Self
└── Store Handle (for later removal)Apply from C++
cpp
// Apply speed buff
void ApplySpeedBuff(float SpeedBonus, float Duration)
{
if (UAbilitySystemComponent* ASC = UMotionAbilitySystemHelper::GetAbilitySystemComponentFromActor(Character))
{
FGameplayEffectContextHandle Context = ASC->MakeEffectContext();
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(SpeedBuffEffect, 1.0f, Context);
// Set magnitude via SetByCaller
Spec.Data->SetSetByCallerMagnitude(SpeedMagnitudeTag, SpeedBonus);
SpeedBuffHandle = ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get());
}
}Remove the stored SpeedBuffHandle later with RemoveActiveGameplayEffect after checking that the handle is valid.
Creating Custom Movement States
Add a New State Tag
Define your tag in your project's GameplayTags:
Motion.State.Sliding Motion.State.WallRunning Motion.State.SwimmingCreate a GameplayEffect to grant the tag:
- Duration: Infinite
- Granted Tags: Your new state tag
React to Custom State
In Animation Blueprint
Add to GameplayTagPropertyMap:
Tag: Motion.State.Sliding
Property: bIsSliding (Bool)In Other Components
cpp
bool bIsSliding = UMotionAbilitySystemHelper::ActorHasGameplayTag(
Character,
FGameplayTag::RequestGameplayTag(TEXT("Motion.State.Sliding"))
);Block Other States
Use tag blocking in your GameplayEffect:
Blocked Tags:
- Motion.State.Sprinting
- Motion.State.JumpingThis prevents sprinting or jumping while in your custom state.
Integrating with Ability Cooldowns
Sprint with Cooldown
Override CanStartSprinting() in a C++ child class (Blueprint override not supported):
cpp
// In your C++ child class
class UMySprintComponent : public UMotionSprintingComponent
{
protected:
virtual bool CanStartSprinting() const override
{
if (UAbilitySystemComponent* ASC = GetASC())
{
if (ASC->HasMatchingGameplayTag(FGameplayTag::RequestGameplayTag("Ability.Cooldown.Sprint")))
{
return false;
}
}
return Super::CanStartSprinting();
}
};Jump with Cooldown
Override CanPerformJump() in a C++ child class (Blueprint override not supported):
cpp
// In your C++ child class
class UMyJumpComponent : public UMotionJumpComponent
{
protected:
virtual bool CanPerformJump() const override
{
if (UAbilitySystemComponent* ASC = GetASC())
{
if (ASC->HasMatchingGameplayTag(FGameplayTag::RequestGameplayTag("Ability.Cooldown.Jump")))
{
return false;
}
}
return Super::CanPerformJump();
}
};Note: For Blueprint-accessible cooldown logic, use GAS tag blocking instead.
Apply Cooldown After Action
cpp
void ApplyCooldown(TSubclassOf<UGameplayEffect> CooldownEffect)
{
if (UAbilitySystemComponent* ASC = GetASC())
{
FGameplayEffectContextHandle Context = ASC->MakeEffectContext();
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(CooldownEffect, 1.0f, Context);
ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get());
}
}Adjusting Crouch Speed
Change Speed Modifier
On the assigned crouch profile:
CrouchWalkSpeedModifier = -200.0 (negative to slow down)Variable Crouch Speed
Create a custom GameplayEffect with SetByCaller magnitude:
cpp
// Apply variable crouch speed
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(CrouchSpeedEffect, 1.0f, Context);
Spec.Data->SetSetByCallerMagnitude(
MotionGameplayTags::SetByCaller_Magnitude_CrouchSpeed,
CalculatedSpeedModifier
);
ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get());Adding Camera Effects to Movement
Sprint Camera Shake
On the assigned sprint profile:
- Set
bApplyCameraShake = true. - Configure the
SprintCameraShakecurve.
Landing Camera Impact
The MotionJumpComponent already broadcasts landing events. Subscribe in Blueprint:
text
Event OnLanded
├── Get Character Movement Component
├── Get Last Update Velocity → Calculate Impact from Z velocity
├── Create Landing Camera Curve
└── Broadcast to Event Bus (Add)Extending Component Behavior
Blueprint Child Class
- Create Blueprint child of any Motion component
- Override virtual functions:
CanStartSprinting()- Add custom conditions (C++ only)OnSprintStateChanged()- React to state changes (Blueprint event)UpdateSprintingState()- Modify update logic (C++ only, protected)
C++ Child Class
cpp
UCLASS()
class UMySprintComponent : public UMotionSprintingComponent
{
GENERATED_BODY()
protected:
virtual bool CanStartSprinting() const override
{
// Add custom logic
if (!Super::CanStartSprinting())
return false;
// Your conditions here
return bCanSprintBasedOnEquipment;
}
virtual void OnSprintStateChanged_Implementation(bool bIsSprinting) override
{
Super::OnSprintStateChanged_Implementation(bIsSprinting);
// Your custom handling
if (bIsSprinting)
{
PlaySprintStartSound();
}
}
};Next steps
Use the reference pages when a customization needs exact API or GAS details.