ai-behavior-trees-util…
Engine-neutral behavior tree and utility AI code for NPCs in any language: Blackboard, reactive composites, decorators and…
Unreal Engine 5 (UE 5.8) player input with Enhanced Input: Input Actions (IA_), Mapping Contexts (IMC_), ETriggerEvent bindings and remappable keys. Use when wiring move, look or fire, building a rebind menu, or input does nothing, stops after respawn or fires every frame. Not
Claude Code
$ npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input --agent claude-code
Codex
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a codex -y
Cursor
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a cursor -y
Gemini CLI
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a gemini-cli -y
GitHub Copilot
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a github-copilot -y
OpenCode
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a opencode -y
Windsurf
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input -a windsurf -y
name: unreal-enhanced-input description: > Unreal Engine 5 (UE 5.8) player input with Enhanced Input: Input Actions (IA_), Mapping Contexts (IMC_), ETriggerEvent bindings and remappable keys. Use when wiring move, look or fire, building a rebind menu, or input does nothing, stops after respawn or fires every frame. Not for engine-neutral input design (`input-systems`) or the Character class (`unreal-cpp-gameplay`).
Wire UE5 player input with data assets: Input Actions say *what* the player wants, Mapping Contexts say *which keys* produce it, modifiers shape the value and triggers decide *when* it fires. Targets **UE 5.8**, where Enhanced Input is the default and legacy axis/action mappings are deprecated.
modifiers and triggers; adding or swapping mapping contexts at runtime.
**When *not* to use:** engine-neutral input architecture, buffering and rebinding policy → `input-systems`. The Pawn or Character class and module setup → `unreal-cpp-gameplay`. Coyote time and jump buffering → `platformer`.
1. **Read the project.** Check `EngineAssociation`, find existing `IA_*`/`IMC_*` assets, and `grep -rn "AddMappingContext\|BindAction\|InputComponent" Source` to see where input is already set up. Extend that path rather than adding a second one. C++ binding needs `"EnhancedInput"` in the module's `*.Build.cs`. 2. **One Input Action per intent** with the right Value Type: `Digital (bool)` for buttons, `Axis1D (float)` for triggers or throttle, `Axis2D (Vector2D)` for move and look. 3. **Map keys in an IMC.** For WASD into one Axis2D action: W plain, S with Negate, D plain, A with Negate, and Swizzle Input Axis Values on W and S so they drive Y. Add Dead Zone on sticks. Triggers (Pressed, Released, Hold, Tap) go on the action or on one mapping. 4. **Add the context for the local player** through `UEnhancedInputLocalPlayerSubsystem:: AddMappingContext(IMC, Priority)` at a point where the pawn is possessed on the owning client: `PawnClientRestart` on the pawn, or the PlayerController. 5. **Bind by trigger event.** `Triggered` for continuous values (move, look), `Started` and `Completed` for press and release (jump). Read the value with the `Get<T>()` that matches the Value Type. 6. **Remapping:** enable User Settings and give each remappable mapping a Player Mappable Key Settings name; details in the reference. 7. **Check it (see Verify).**
void AMyCharacter::PawnClientRestart()
{
Super::PawnClientRestart(); // runs on the owning client after possession
if (APlayerController* PC = Cast<APlayerController>(GetController()))
if (ULocalPlayer* LP = PC->GetLocalPlayer())
if (auto* Subsystem = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
Subsystem->AddMappingContext(DefaultMappingContext, /*Priority*/ 0);
}
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// Don't name the parameter InputComponent: that shadows AActor::InputComponent.
if (auto* EIC = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EIC->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
}
}
void AMyCharacter::Move(const FInputActionValue& Value)
{
const FVector2D Axis = Value.Get<FVector2D>(); // IA_Move is Axis2D
AddMovementInput(GetActorForwardVector(), Axis.Y);
AddMovementInput(GetActorRightVector(), Axis.X);
}Event Possessed (or the PlayerController's BeginPlay) -> Get Controller -> Cast To PlayerController -> Get Local Player -> Enhanced Input Local Player Subsystem -> Add Mapping Context (IMC_Default, 0) EnhancedInputAction IA_Move (Triggered) -> Action Value X/Y -> Add Movement Input
Say which of these you ran.
1. **Compile** the module (`Build.bat`/`Build.sh` as in `unreal-cpp-gameplay`) and fix errors; a missing `EnhancedInput` dependency shows up here as unresolved symbols. 2. **Validate assets:** `UnrealEditor-Cmd <Project>.uproject -run=DataValidation -unattended`. 3. **Regression test (optional but cheap once written):** a functional test in a test map can inject an action with the subsystem's input injection functions (for example `InjectInputForAction`) and assert the pawn moved. Run it with `UnrealEditor-Cmd <Project>.uproject -ExecCmds="Automation RunTest Project.Functional Tests;Quit" -unattended -nullrhi -ReportExportPath="<dir>"` (swap `-nullrhi` for `-RenderOffscreen` if the map needs a renderer). 4. **Ask the user** to start PIE, open the console, run `showdebug enhancedinput`, press the keys in question and report which contexts are active, their priorities and the action values. `Input.+key <Key>` injects a key press from the console when no device is handy. For multiplayer bugs, ask them to repeat it on a client window.
player, or a UI-only input mode is set (`SetInputMode` with UI only).
`BeginPlay` before possession, so `GetController()` was null. Add it in `PawnClientRestart` or the PlayerController.
<img src="docs/assets/awesome-gamedev-agent-skills-banner.png" width="820" alt="awesome-gamedev-agent-skills — game-dev skills for AI coding agents.
Engine-neutral behavior tree and utility AI code for NPCs in any language: Blackboard, reactive composites, decorators and…
Engine-neutral game audio technique: bus layout, volume sliders in decibels, loudness, ducking music under dialogue, adaptive…
Builds and tunes game cameras, engine-neutral with Godot and Cinemachine 3 mappings: 2D follow with deadzone and look-ahead,…
Plans, generates or sources, and validates consistent game art: style guides, sprites, pixel art, tilesets, icons and textures,…
Builds engine-neutral branching dialogue with Ink, Yarn Spinner or a small JSON graph runner: lines, choices, conditions,…
Designs engine-neutral enemy and NPC AI: picks FSM, behavior tree, utility or GOAP, and builds perception, steering and A*…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.