# 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 1. **Enable Plugin**: `Edit > Plugins > Enhanced Input` (enabled by default in UE5) 2. **Project Settings**: `Engine > Input > Default Classes > Default Player Input Class = EnhancedPlayerInput` --- ### Create Input Actions 1. Content Browser > Input > Input Action 2. Name it (e.g., `IA_Jump`, `IA_Move`) 3. 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 1. Content Browser > Input > Input Mapping Context 2. Name it (e.g., `IMC_Default`) 3. Add mappings: - `IA_Jump` → Space Bar - `IA_Move` → W/A/S/D keys (combine X/Y) - `IA_Look` → Mouse XY - `IA_Fire` → Left Mouse Button --- ### Bind Input in C++ ```cpp #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 MoveAction; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input") TObjectPtr LookAction; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input") TObjectPtr JumpAction; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input") TObjectPtr DefaultMappingContext; protected: virtual void BeginPlay() override { Super::BeginPlay(); // Add Input Mapping Context if (APlayerController* PC = Cast(Controller)) { if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(PC->GetLocalPlayer())) { Subsystem->AddMappingContext(DefaultMappingContext, 0); } } } virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override { Super::SetupPlayerInputComponent(PlayerInputComponent); UEnhancedInputComponent* EIC = Cast(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(); if (Controller) { AddMovementInput(GetActorForwardVector(), MoveVector.Y); AddMovementInput(GetActorRightVector(), MoveVector.X); } } void Look(const FInputActionValue& Value) { FVector2D LookVector = Value.Get(); 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 1. Open Input Action asset 2. Triggers > Add > Select trigger type (e.g., `Hold`) 3. 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 1. Open Input Action asset 2. Modifiers > Add > Select modifier (e.g., `Negate`) 3. Configure --- ## Input Mapping Contexts (Context Switching) ### Multiple Contexts ```cpp // Define contexts UPROPERTY(EditAnywhere, Category = "Input") TObjectPtr DefaultContext; UPROPERTY(EditAnywhere, Category = "Input") TObjectPtr VehicleContext; // Switch context void EnterVehicle() { if (APlayerController* PC = Cast(Controller)) { if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(PC->GetLocalPlayer())) { Subsystem->RemoveMappingContext(DefaultContext); Subsystem->AddMappingContext(VehicleContext, 0); } } } ``` --- ## Legacy Input (Deprecated) ### Legacy Input Bindings ```cpp // ❌ 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 ```cpp // 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 ```cpp // 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 ```cpp #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 ```cpp // 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) ```cpp // For debugging only (not recommended for gameplay) if (GetWorld()->GetFirstPlayerController()->IsInputKeyDown(EKeys::SpaceBar)) { // Space bar is down } ``` --- ## Sources - https://docs.unrealengine.com/5.7/en-US/enhanced-input-in-unreal-engine/ - https://docs.unrealengine.com/5.7/en-US/enhanced-input-action-and-input-mapping-context-in-unreal-engine/