MotionJumpComponent
Manages jump mechanics including multi-jump, coyote time, jump buffering, and camera effects during jumping and landing. Features server-authoritative jump validation with client prediction and comprehensive visual/audio feedback.
Requirements
- Character with standard
UCharacterMovementComponent - MotionPlayerState configured in GameMode
- Gameplay Ability System (GAS) initialized
- Enhanced Input System configured
- Gameplay Effects:
GE_Motion_WantsToJump- Grants wants to jump tagGE_Motion_Jumping- Grants jumping state tag
- Gameplay Tags:
Motion.State.WantsToJump- Player input to jumpMotion.State.Jumping- Active jumping/falling state
Installation
- Add
UMotionJumpComponentto your Character Blueprint or C++ class - Configure the component properties in the Details panel
- Set the
JumpingTagEffecttoGE_Motion_Jumping - Set the
WantsToJumpTagEffecttoGE_Motion_WantsToJump - Configure jump parameters:
- Set
JumpVelocityMultiplierfor jump height - Configure
MaxAdditionalJumpsfor multi-jump - Set
CoyoteTimeandJumpBufferTimefor forgiving controls
- Set
- Bind jump input action in Enhanced Input or through component


Functionality
Jump State Machine
Jump Validation Flow
Update Cycle
Expandability
The MotionJumpComponent provides extensive virtual functions for customization:
Core Jump Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
SetWantsToJump() | bool bWantsToJump | void | • Add stamina cost • Check prerequisites |
GetWantsToJump() | None | bool | • Query jump intent • UI state display |
IsCurrentlyJumping() | None | bool | • Check air state • Animation triggers |
CanJump() | None | bool | • Add conditions • Equipment checks |
TriggerJump() | bool bIsAdditionalJump | bool | • Manual jump • Ability trigger |
Jump State Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
CanPerformJump() | None | bool | • Validate conditions • Check resources |
PerformJump() | bool bIsAdditionalJump | bool | • Execute jump • Apply modifiers |
ResetJumpCount() | None | void | • Landing reset • Ability refresh |
GetRemainingJumps() | None | int32 | • UI display • Ability checks |
HandleLanding() | None | void | • Landing logic • Fall damage |
Timer System Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
UpdateCoyoteTime() | float DeltaTime | void | • Grace period • Platform forgiveness |
UpdateJumpBuffer() | float DeltaTime | void | • Input queue • Responsive controls |
IsInCoyoteTime() | None | bool | • Check grace • Allow late jump |
IsJumpBuffered() | None | bool | • Check buffer • Process queue |
State Management Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
UpdateJumpingState() | float DeltaTime | void | • Core update • State machine |
InitializeComponent() | None | void | • Setup refs • Cache values |
OnAbilitySystemComponentReady() | None | void | • GAS setup • Grant abilities |
GrantJumpAbilityTag() | None | void | • Add tags • Enable jump |
Velocity Modification Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
ApplyDirectJumpVelocity() | bool bIsAdditionalJump | void | • Direct control • Custom physics |
Camera Effect Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
StartJumpCameraEffects() | None | void | • Jump shake • FOV change |
StopJumpCameraEffects() | None | void | • End shake • Reset view |
StartLandingCameraEffects() | None | void | • Impact shake • Landing feel |
StopLandingCameraEffects() | None | void | • End effects • Smooth reset |
StartCameraShake() | FStructMotionCurve&, int32& | void | • Generic shake • Reusable effect |
StopCameraShake() | FString&, int32& | void | • Stop by ID • Clean up |
Input System Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
OnInputStarted() | FInputActionValue& | void | • Jump press • Buffer input |
OnInputCompleted() | FInputActionValue& | void | • Release • Variable height |
HandleJumpInputStateChange() | bool bPressed | void | • Process input • State change |
BindJumpInput() | UInputAction* | bool | • Bind action • Setup input |
BindJumpInputWithComponent() | UInputAction*, UEnhancedInputComponent* | bool | • Explicit bind • Custom comp |
Utility Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
PrintDebugInformation() | None | void | • Debug display • State logging |
Blueprint Events
| Event | Parameters | Use Case Examples |
|---|---|---|
OnJumpStateChanged | bool bIsJumping | • Animation triggers • State UI |
OnJumpPerformed | bool bIsAdditionalJump, int32 JumpNumber | • Jump VFX • Sound variation |
OnLanded | None | • Landing animation • Fall damage |
OnCoyoteTimeExpired | None | • Grace ended • UI indicator |
OnJumpBufferExpired | None | • Buffer cleared • Input feedback |
Network Functions
| Function | Parameters | Returns | Use Case Examples |
|---|---|---|---|
ServerRequestJump() | bool bWantsToJump | void (RPC) | • Server validation • Authority check |
MulticastJumpFeedback() | bool bJumped, int32 JumpNumber | void (RPC) | • Visual sync • Other clients |
MulticastLandingFeedback() | None | void (RPC) | • Landing sync • Effects broadcast |
Configuration
Jump Settings
| Property | Type | Default | Description | Range |
|---|---|---|---|---|
| JumpVelocityMultiplier | float | 1.0 | Jump velocity multiplier (1.0 = default UE behavior) | 0.1 - 5.0 |
| JumpVelocityModifier | float | 0.0 | Absolute jump velocity to add | - |
| bEnableMultiJump | bool | false | Whether to enable multi-jump functionality | - |
| MaxAdditionalJumps | int32 | 1 | Maximum number of additional jumps after initial | 0 - 10 |
| AdditionalJumpVelocityMultiplier | float | 0.8 | Velocity multiplier for additional jumps | 0.1 - 2.0 |
Advanced Features
| Property | Type | Default | Description | Range |
|---|---|---|---|---|
| CoyoteTime | float | 0.15 | Grace period to jump after leaving ground (seconds) | 0.0 - 1.0 |
| JumpBufferTime | float | 0.2 | Allow jump input buffering when not grounded (seconds) | 0.0 - 1.0 |
Camera Effects
| Property | Type | Default | Description |
|---|---|---|---|
| JumpCameraShake | FStructMotionCurve | - | Camera shake curve during jumping |
| LandingCameraShake | FStructMotionCurve | - | Camera shake curve when landing |
| bApplyCameraShake | bool | true | Whether to apply camera shake |
Sound
| Property | Type | Default | Description | Range |
|---|---|---|---|---|
| bAutoTriggerLandingSound | bool | true | Auto-trigger landing sounds vs Animation Notifies | - |
GAS Integration
| Property | Type | Description |
|---|---|---|
| WantsToJumpTagEffect | TSubclassOf<UGameplayEffect> | Grants wants to jump tag |
| JumpingTagEffect | TSubclassOf<UGameplayEffect> | Grants jumping state tag |
State Tracking (Read-Only)
| Property | Type | Description | Range |
|---|---|---|---|
| JumpCameraShakeIdentifier | FString | Unique identifier for jump camera shake | |
| LandingCameraShakeIdentifier | FString | Unique identifier for landing camera shake | |
| CachedMovementSoundComponent | UMotionMovementSoundComponent* | Reference to sound component | |
| MotionJumpCount | int32 | Reliable jump counter |
Internal State Tracking (Read-Only)
| Property | Type | Description | Range |
|---|---|---|---|
| LastGroundedTime | float | Time when character last left ground (for coyote time) | |
| LastJumpInputTime | float | Time when jump input was last pressed (for buffering) | |
| OriginalJumpZVelocity | float | Original jump Z velocity cached at BeginPlay | |
| bWasGroundedLastFrame | bool | Previous frame's grounded state | |
| bWasJumpingLastFrame | bool Previous frame's jumping state | ||
| bActuallyJumped | bool | Track if we performed a jump (not just falling) | |
| bUsedCoyoteJump | bool | Track if coyote jump was used | |
| bCoyoteExpiredLastFrame | bool | Track coyote time expiration event | |
| bBufferExpiredLastFrame | bool | Track buffer expiration event |
Debug
| Property | Type | Default | Description |
|---|---|---|---|
| bShowDebugInformation | bool | false | Debug information display |
Input Binding
The component provides multiple ways to bind jump input:
// Blueprint binding
BindJumpInput(JumpInputAction);
// C++ with explicit component
BindJumpInputWithComponent(JumpAction, EnhancedInputComponent);
// Manual jump trigger (bypasses input)
TriggerJump(bIsAdditionalJump);Jump State Access
Query jump state for gameplay logic:
- GetWantsToJump() - Check if player wants to jump (input pressed)
- IsCurrentlyJumping() - Check if character is jumping or falling
- GetRemainingJumps() - Get remaining jumps available
- IsInCoyoteTime() - Check if within coyote time window
- IsJumpBuffered() - Check if jump input is buffered
- CanJump() - Check if character can perform another jump
Coyote Time & Jump Buffering
Coyote Time Visualization
Coyote Time: Grace period after leaving a platform where jumping is still allowed
- Prevents frustration from barely missing platform edges
- Only applies to first jump (not multi-jumps)
- Tracked via
LastGroundedTimeandbUsedCoyoteJump
Jump Buffering: Input queuing system for responsive controls
- Stores jump input when pressed before landing
- Automatically executes when landing occurs
- Makes precise platforming more forgiving
Multi-Jump System
Motion implements a custom counter, because the built-in one tends to count incorrectly due to a bug of Unreal Engine.
Multi-Jump Flow
When enabled, allows additional jumps while airborne:
- Jump Count tracked via
MotionJumpCount(reliable counter) - Server Validation via server-side
CanPerformJump()validation - Velocity Reduction per additional jump for balance
- Dynamic Upgrades by modifying
MaxAdditionalJumpsat runtime
Networking
The component handles multiplayer through:
- Server RPCs -
ServerRequestJump()for validation - Multicast Events - Visual feedback to all clients
- Server Validation - Jump conditions checked on authority
- Client Prediction - Immediate local response
- State Reconciliation - Authority-based validation