Unreal Engine 5.7 — Input Module Reference
Unreal Engine 5.7 — Input Module Reference
Last verified: 2026-02-13 Knowledge Gap: UE 5.7 uses Enhanced Input as default (legacy input deprecated)
Overview
UE 5.7 input systems:
- Enhanced Input (RECOMMENDED, default in UE5): Modular, rebindable, context-based
- Legacy Input: Deprecated, avoid for new projects
Enhanced Input System
Setup Enhanced Input
- Enable Plugin:
Edit > Plugins > Enhanced Input(enabled by default in UE5) - Project Settings:
Engine > Input > Default Classes > Default Player Input Class = EnhancedPlayerInput
Create Input Actions
- Content Browser > Input > Input Action
- Name it (e.g.,
IA_Jump,IA_Move) - Configure:
- Value Type: Digital (bool), Axis1D (float), Axis2D (Vector2D), Axis3D (Vector)
Example Input Actions:
IA_Jump: Digital (bool)IA_Move: Axis2D (Vector2D)IA_Look: Axis2D (Vector2D)IA_Fire: Digital (bool)
Create Input Mapping Context
- Content Browser > Input > Input Mapping Context
- Name it (e.g.,
IMC_Default) - Add mappings:
IA_Jump→ Space BarIA_Move→ W/A/S/D keys (combine X/Y)IA_Look→ Mouse XYIA_Fire→ Left Mouse Button
Bind Input in C++
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputActionValue.h"
class AMyCharacter : public ACharacter {
public:
// Input Actions (assign in Blueprint)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
TObjectPtr<UInputAction> MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
TObjectPtr<UInputAction> LookAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
TObjectPtr<UInputAction> JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
TObjectPtr<UInputMappingContext> DefaultMappingContext;
protected:
virtual void BeginPlay() override {
Super::BeginPlay();
// Add Input Mapping Context
if (APlayerController* PC = Cast<APlayerController>(Controller)) {
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer())) {
Subsystem->AddMappingContext(DefaultMappingContext, 0);
}
}
}
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override {
Super::SetupPlayerInputComponent(PlayerInputComponent);
UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (EIC) {
// Bind actions
EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EIC->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EIC->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
}
}
void Move(const FInputActionValue& Value) {
FVector2D MoveVector = Value.Get<FVector2D>();
if (Controller) {
AddMovementInput(GetActorForwardVector(), MoveVector.Y);
AddMovementInput(GetActorRightVector(), MoveVector.X);
}
}
void Look(const FInputActionValue& Value) {
FVector2D LookVector = Value.Get<FVector2D>();
if (Controller) {
AddControllerYawInput(LookVector.X);
AddControllerPitchInput(LookVector.Y);
}
}
};
Input Triggers
Trigger Types
Input Actions can have triggers to control when they fire:
- Pressed: When input starts
- Released: When input ends
- Hold: Hold for duration
- Tap: Quick press
- Pulse: Repeated firing while held
Add Trigger in Editor
- Open Input Action asset
- Triggers > Add > Select trigger type (e.g.,
Hold) - Configure (e.g., Hold Time = 0.5s)
Input Modifiers
Modifier Types
Modifiers transform input values:
- Negate: Flip sign (-1 ↔ 1)
- Dead Zone: Ignore small inputs
- Scalar: Multiply by value
- Smooth: Smoothing over time
Add Modifier in Editor
- Open Input Action asset
- Modifiers > Add > Select modifier (e.g.,
Negate) - Configure
Input Mapping Contexts (Context Switching)
Multiple Contexts
// Define contexts
UPROPERTY(EditAnywhere, Category = "Input")
TObjectPtr<UInputMappingContext> DefaultContext;
UPROPERTY(EditAnywhere, Category = "Input")
TObjectPtr<UInputMappingContext> VehicleContext;
// Switch context
void EnterVehicle() {
if (APlayerController* PC = Cast<APlayerController>(Controller)) {
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer())) {
Subsystem->RemoveMappingContext(DefaultContext);
Subsystem->AddMappingContext(VehicleContext, 0);
}
}
}
Legacy Input (Deprecated)
Legacy Input Bindings
// ❌ DEPRECATED: Do not use for new projects
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) {
// Legacy action binding
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
// Legacy axis binding
PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
}
void MoveForward(float Value) {
AddMovementInput(GetActorForwardVector(), Value);
}
Migration: Use Enhanced Input instead.
Gamepad Input
Gamepad with Enhanced Input
// Input Mapping Context:
// - IA_Move → Gamepad Left Thumbstick
// - IA_Look → Gamepad Right Thumbstick
// - IA_Jump → Gamepad Face Button Bottom (A/Cross)
// No code changes needed, just add gamepad mappings to Input Mapping Context
Touch Input (Mobile)
Touch Input with Enhanced Input
// Input Mapping Context:
// - IA_Move → Touch (virtual thumbstick)
// - IA_Look → Touch (swipe)
// Use Touch Interface asset for virtual controls
Rebinding Input at Runtime
Change Key Mapping
#include "PlayerMappableInputConfig.h"
// Get subsystem
UEnhancedInputLocalPlayerSubsystem* Subsystem = /* Get subsystem */;
// Get player mappable keys
FPlayerMappableKeySlot KeySlot = FPlayerMappableKeySlot(/*..*/);
FKey NewKey = EKeys::F; // Rebind to F key
// Apply new mapping
Subsystem->AddPlayerMappedKey(/*..*/);
Input Debugging
Debug Input
// Console commands:
// showdebug input - Show input debug info
// Log input values:
UE_LOG(LogTemp, Warning, TEXT("Move Input: %s"), *MoveVector.ToString());
Common Patterns
Check if Key Pressed (Quick & Dirty)
// For debugging only (not recommended for gameplay)
if (GetWorld()->GetFirstPlayerController()->IsInputKeyDown(EKeys::SpaceBar)) {
// Space bar is down
}