Wenn du UE vor Kurzem angefangen hast, hast du vielleicht ein Project Settings → Input → Action Mapping aufgesetzt und dich gefragt warum der Editor warnt dass es deprecated ist. Oder du hast versucht einem Enhanced-Input-Tutorial zu folgen und dich zwischen „Input Actions", „Input Mapping Contexts", „Modifiers" und „Triggers" verlaufen — vier Dinge die alle nach dem Gleichen klingen.

Das Enhanced Input System ist wirklich besser als das alte, sobald du das Denkmodell siehst. Der Trick ist zu verstehen warum vier Konzepte.

Das 30-Sekunden-Denkmodell

Stell dir vor du beschreibst ein Steuerungs-Schema einem Designer:

„Es gibt eine Action namens Jump. Auf Gamepad ist es der A-Button. Auf Tastatur ist es Space. Halt sie länger als 0,3 Sekunden, dann ist es ein Charged Jump."

Dieser Satz enthält vier verschiedene Dinge:

  • Input Action: „Jump" — das abstrakte Ding das du tun willst.
  • Input Mapping Context: „Auf Gamepad / auf Tastatur" — welche physische Taste daran bindet, in diesem Layer.
  • Trigger: „länger als 0,3 Sekunden" — wann die Action feuert.
  • Modifier: nicht im Satz, aber denk an: „Y-Achse invertieren" — wie der Roh-Input transformiert wird bevor er zum Value der Action wird.

Das alte System hat das alles in einen Topf geworfen: ein Action Mapping pro Taste ohne Context-Awareness, hardcodierter Threshold, keine Value-Transformation. Enhanced Input trennt sie damit du verschiedene Steuerungs-Schemata für verschiedene Game-States ausliefern kannst ohne Input-Code umzuschreiben.

Input Action — das Verb

Eine Input Action ist das abstrakte Verb: „Jump", „Move", „Interact", „OpenInventory".

Sie kennt keine Taste die sie triggert. Sie hat nur einen Value Type: Bool (Button), Axis1D (Trigger / Scroll), Axis2D (Stick / WASD-als-Richtung), Axis3D (selten, 3D-Pad).

Erstellen: Content Browser → Rechtsklick → Input → Input Action. Benennen IA_Jump, IA_Move, etc.

Das war's. Keine Tasten, keine Logik. Nur das Verb.

Input Mapping Context — der Binding-Layer

Ein Input Mapping Context (IMC) ist eine Sammlung von „diese Taste triggert diese Input Action". Der Binding-Layer.

Entscheidend: du kannst mehrere Mapping Contexts gleichzeitig aktiv haben, und sie layern sich mit Prioritäten. Das ist das Killer-Feature.

Beispiel:

  • IMC_Default (Priority 0): Move auf WASD, Jump auf Space, Interact auf E.
  • IMC_Driving (Priority 10): Beschleunigen auf W, Bremsen auf S, Lenken auf A/D.
  • IMC_Menu (Priority 100): nur UI-Navigation — blockiert alles andere.

Wenn der Spieler ins Auto steigt, pushst du IMC_Driving. Wenn er ein Menü öffnet, pushst du IMC_Menu obendrauf. Wenn er's schließt, poppst du es weg. WASD macht jetzt in jedem State das Richtige ohne if (in_menu) { ... } else if (in_car) { ... }-Spaghetti.

Mapping Context aktivieren — der eine merkwürdige Trick

Mapping Contexts aktivieren sich nicht selbst. Du musst sie zum Enhanced Input Subsystem des Local Players hinzufügen. Das Boilerplate:

CB0

Einmal im Character (oder PlayerController) aufsetzen, und deine Default-Bindings sind live. Weitere Contexts zur Laufzeit pushen — Add Mapping Context zum Hinzufügen, Remove Mapping Context zum Wegnehmen.

Die Action im Character lesen

In deinem Character Blueprint kannst du jetzt direkt an die Input Action binden:

CB1

Das Event hat vier Execution-Pins:

  • Triggered — feuert jeden Frame in dem die Action aktiv ist (Bool: solange Button gehalten, Axis: solange Value non-zero).
  • Started — feuert einmal beim Übergang inactive → active.
  • Ongoing — feuert während die Action „versucht" aber den Trigger-Threshold noch nicht erreicht hat.
  • Completed — feuert einmal wenn die Action natürlich endet.
  • Canceled — feuert wenn die Action abnormal endet (z.B. anderer Context hat Priorität übernommen).

Der Output-Pin Action Value ist der typisierte Wert: Bool für Jump, Vector2D für Move, Float für einen Axis-Trigger.

Für eine Move-Action vom Typ Axis2D kriegst du direkt den WASD-Vektor — (1, 0) für D, (-1, 0) für A, etc. Kein if (W) ...; else if (S) ...; else if (A) ... mehr.

Modifier — das unterschätzte Feature

Modifier transformieren den Roh-Input bevor die Action feuert. Sie leben auf dem Binding innerhalb eines Mapping Contexts. Die nützlichsten:

  • Negate: dreht das Vorzeichen um. Für „S" auf „Move backward" schreibst du keine eigene Action — du bindest S an IA_Move mit Negate (Y) Modifier.
  • Swizzle Input Axis Values: ordnet XYZ um. Nützlich wenn ein 1D-Axis zum X (oder Y) eines 2D-Vektors werden soll.
  • Dead Zone: ignoriert winzige Stick-Wackler um die Mitte. Auf Gamepad-Bindings setzen.
  • Scalar: multiplizieren. Für Accessibility: ein „Slow Movement"-Modus multipliziert den Move-Vektor mit 0,5.
  • Smooth: exponentielle Glättung. Camera Look profitiert von einem kleinen.

Setz sie im Mapping-Context-Eintrag, nicht in der Input Action. Die gleiche Input Action kann pro Mapping Context verschiedene Modifier haben.

Trigger — wann die Action feuert

Triggers sind die Regeln wann eine Action als aktiv gemeldet wird.

  • Down (Default für Bool): aktiv solange Button gehalten.
  • Pressed: feuert einmal beim Drücken.
  • Released: feuert einmal beim Loslassen.
  • Hold: feuert nach N Sekunden Halten.
  • Tap: feuert wenn innerhalb N Sekunden gedrückt und losgelassen.
  • Pulse: feuert in einer Rate solange gehalten (z.B. für Auto-Fire).
  • Chorded Action: feuert nur wenn eine andere Action ebenfalls aktiv ist (z.B. Shift+W für Sprint).

Stack Triggers auf einem einzigen Binding wenn du brauchst „Tap und Hold sollen auf derselben Taste verschieden funktionieren". Zwei separate Triggers in der Liste → zwei separate Execution-Pfade vom selben Input-Action-Event.


Plugin-Tipp
Enhanced Input deckt die Basics ab — Action / Context / Trigger / Modifier. Was nicht dabei ist: Input-Buffer (einen Jump kurz vor der Landung vormerken), Gesture-Erkennung (Kreis, Double-Tap, Swipe), oder Combo-Fenster für Fighting Games. FoxInput layert genau das obendrauf — Buffer, Gestures, Combos, Context-Stacking-Helper — ohne Enhanced Input zu ersetzen. Optional, aber wenn dein Spiel sowas braucht spart's eine Woche.

Typische Fehler

  • Mapping Context nicht hinzugefügt. Du verkabelst das IA-Event im Character und nichts passiert. Check: ruft BeginPlay wirklich Add Mapping Context auf?
  • Bool Action mit negativem Wert. Eine Bool Action ignoriert Vorzeichen. Wenn du S an eine Bool IA mit Negate bindest, wird S als „active" behandelt. Nutz stattdessen Axis1D + Negate.
  • Verwirrung über Mapping-Context-Priorität. Höhere Zahl = höhere Priorität = wird zuerst konsumiert. Default-Contexts bei 0, Overlays bei 10+, Menüs bei 100+.
  • Tap und Down auf derselben Taste. Down feuert jeden Frame während gehalten; Tap feuert einmal beim Loslassen wenn schnell genug. Beide auf einem Binding zu stacken führt dazu dass bei einem schnellen Tap beide feuern. Eins wählen.
  • Add Mapping Context auf dem Server in einem Multiplayer-Game. Input ist client-seitig. Nutz das Local Player Subsystem vom korrekten Client-Controller, sonst wunderst du dich warum beim zweiten Spieler nichts reagiert.

Die 30-Sekunden-Zusammenfassung

  • Input Action: das Verb. Keine Tasten, keine Logik.
  • Input Mapping Context: welche Taste → welche Action, gelayert nach Priorität.
  • Modifier: transformiert Roh-Input bevor die Action feuert (Negate, Dead Zone, Scalar, ...).
  • Trigger: wann die Action feuert (Pressed / Hold / Tap / Pulse / Chorded).
  • Aktivieren eines Mapping Contexts via Get Enhanced Input Local Player Subsystem → Add Mapping Context.
  • Binden an Actions im Character mit Enhanced Input Action IA_X Events.

Sobald du es als Verb / Bindings / Transform / Timing denkst statt „äh, vier Dinge die alle ähnlich klingen", ist es viel sauberer als die alte if input == "W"-Kette.

Nächste Woche: Blueprint oder C++? Ein pragmatischer Leitfaden. Jetzt wo du einen Character bewegen kannst kommt unvermeidlich die Frage die jeder UE-Dev irgendwann trifft. Spoiler: die Antwort ist nicht „C++ für Performance, Blueprint für Prototyping" — es ist interessanter als das, und die falsche Entscheidung früh kostet Monate später.

— Marco