Tag-driven Enhanced Input: bind GAS abilities, rebind chords per player, and drive CommonUI from one config.
Free · Input · Unreal Engine 5
Bind input by tag, not by pointer.
One UCrimsonInputConfig pairs every Enhanced Input action with a gameplay tag (native, ability and UI), so game code never holds a raw UInputAction*. Per-player modifier-key chords, settings-driven modifiers, gamepad sensitivity presets and a tap/hold trigger come with it, and ability input never depends on a specific GAS layer.
Why CrimsonInput
Everything Enhanced Input was missing for ability games: tags as the API, rebindable chords, and CommonUI in one place.
Tags are the API
One UCrimsonInputConfig data asset maps each UInputAction to an FGameplayTag across three lists: native, ability and UI. Game code references actions by tag and never holds a raw UInputAction*. Ship a different config per character and the tag-facing code never changes.
GAS input, zero coupling
BindAbilityActions bulk-binds the config's ability list and hands your callback nothing but the FGameplayTag: press on Triggered, release on Completed and Canceled. You forward that tag to whatever ASC your pawn exposes through IAbilitySystemInterface; CrimsonInput has no dependency on CrimsonAbilitySystem.
Per-player chord rebinding
UInputTriggerCrimsonDynamicChord adds Shift / Ctrl / Alt requirements with exact-match semantics, authored on the IMC mapping or injected for you. Player overrides persist through UCrimsonInputUserSettings (a SaveGame UEnhancedInputUserSettings), and FindChordConflict validates a rebind before you commit it.
Settings-driven modifiers
Four UInputModifiers (deadzone, gamepad sensitivity, aim inversion and a reflection-based setting scalar) read their values from an ICrimsonInputSettingsProvider on the local player. No concrete settings class is ever imported, and with no provider present each modifier passes input through unchanged.
CommonUI input, UE 5.8+
A UIInputActions list lets widgets bind CommonUI actions from real UInputAction assets. CommonUI's action router resolves the live key from the player's IMC, so button glyphs auto-update on rebind. Two caveats: that binding is C++, and it needs bEnableEnhancedInputSupport=True or it silently does nothing.
Aim sensitivity presets
Ten named presets (ECrimsonGamepadSensitivity, Slow → Insane) map to float scalars through a UCrimsonAimSensitivityData asset. Normal and ADS each read their own preset, and AimingStateTag switches one look action to the aim preset for as long as the pawn's ability system owns that tag.
Tap and hold on one action
UInputTriggerCrimsonPressAndHold drops onto a UInputAction's Triggers array with nothing to configure: Triggered once on actuation, Ongoing while held, Completed only on a real release. Tap and hold stay distinguishable on the same key, and an ability binding's release still fires.
Input Clash Analyzer
An editor tool that replays Enhanced Input's mapping rebuild without pressing Play. It finds actions a higher-priority context silently hides, keys two contexts fight over and chords that can never fire, then repairs them from one Review page in a single Undo step.
A closer look
Bind your whole pawn in one place
Point the project at UCrimsonInputComponent once. In SetupPlayerInputComponent, BindNativeAction wires a tagged action to a C++ function and BindAbilityActions bulk-binds the ability list. The config is the single source of truth: add an action in the asset, not in bind code.
DefaultInputComponentClassinConfig/DefaultInput.inicovers every controller with no per-pawn code- Or set
InputComponentClassin a single pawn's constructor when you only want it there RemoveBindstears the handles down again on unpossess
Rebindable chords without the boilerplate
UCrimsonInputHelpers::AddMappingContextWithChordTriggers applies a transient copy of your IMC with a chord trigger injected onto every mapping whose action uses UCrimsonPlayerMappableKeySettings; your asset is never modified. GetActionDisplayText turns the applied mapping, device and chord into a key hint that reads "Shift+E" in one call.
- An action some other system already chord-gates opts out by unticking Apply Dynamic Chord Trigger
UCrimsonInputDisplayStatics::GetActionDisplayTextis a BlueprintPure node
Decoupled by design
CrimsonInput depends on no other Crimson plugin. It owns its chord types, modifier registry, display statics and ECrimsonGamepadSensitivity, and binds GAS through the engine's IAbilitySystemInterface. With CrimsonCore, chord glyphs, combo modifiers and settings-screen chord capture wire themselves.
ICrimsonInputSettingsProvideron the local player is yours to implement: the plugin ships no settings backend- Until you supply a provider, the modifiers no-op rather than fail
Find input clashes before you press Play
Open Tools → Crimson Input → Input Clash Analyzer, press Discover, and it finds every context your assets apply and at what priority. Analyze a scenario, then fix what it flags: certain fixes apply in bulk, the rest are proposals you review first.
- Works on ordinary Enhanced Input assets: nothing in it needs a Crimson type
- Scenarios save to
DefaultEditor.ini, so the whole team shares them - Console commands report and apply fixes from a scripted editor run
Technical details
- Engine
- UE 5.8
- Tested platforms
- Windows
- Blueprint-ready
- Yes
- C++ required
- Yes
- Network replicated
- No
- Dependencies
- EnhancedInput, GameplayAbilities, CommonUI, CommonInput, GameFeatures, ModularGameplay, InputCore, GameplayTags, DeveloperSettings
Frequently asked questions
Do I need C++ to use it?
Find…InputActionForTag lookups, native input through the standard Enhanced Input Action events, chords, per-player rebinding and conflict checks, key profiles, the key + chord display node, the modifiers and the sensitivity data asset. C++ is needed for three things: the bulk binders BindNativeAction / BindAbilityActions (they are templates), a true release edge on ability input (GAS exposes no Blueprint release-by-tag, so you route Completed and Canceled into a small BlueprintCallable forwarder of your own), and CommonUI action binding, because Unreal ships no Blueprint node for FBindUIActionArgs(UInputAction*, …).Does it depend on other Crimson plugins?
IAbilitySystemInterface. CrimsonCore, the free integration layer from the Crimson Discord, joins it to the rest of the suite: chord glyphs in CrimsonUI, combo modifier tags in CrimsonAbilitySystem, chord-aware key text in CrimsonActionBar, and chord capture in the CrimsonSettings screen. Without Core, call the same public API (UCrimsonInputDisplayStatics, ICrimsonInputBindingProvider) from your own code.Is it free?
Does it integrate with the Gameplay Ability System?
BindAbilityActions bulk-binds the config's ability list and hands your callback the action's FGameplayTag; you forward it to whatever ASC your pawn or player state exposes, resolved through the engine's IAbilitySystemInterface. Grant the ability with the same input tag on its spec (and on its Asset Tags if you take the Blueprint Try Activate Abilities By Tag route) and the two meet. For a combo-capable character, BindAbilityActionsWithAction passes the UInputAction* alongside the tag, so a combo router can identify the press and fall through when it does not consume it.Can players rebind their modifier chords?
CrimsonPlayerMappableKeySettings and give it a Name; per-player chord overrides persist under that name through UCrimsonInputUserSettings, which is a UEnhancedInputUserSettings subclass, so ordinary Enhanced Input key rebinding comes along with it. FindChordConflict warns before two actions land on the same key with the same chord, gamepad input bypasses chord checks entirely, and chords are exact-match: an action requiring no modifiers is blocked while any modifier is held. One gotcha the docs are blunt about: Enable User Settings and User Settings Class must both be set under Project Settings → Engine → Enhanced Input, or GetUserSettings() returns null and chord persistence silently does nothing.Does any of it replicate?
Wire up tag-driven input in minutes
Enable CrimsonInput, point the project at UCrimsonInputComponent, build one config, and bind by tag. Per-player chords, settings-driven modifiers, and CommonUI navigation come along for the ride.
Ready for more? Add a premium system
Every premium system runs on its own, so add only the ones your game needs.
A full Gameplay Ability System layer for UE5.
- Custom ASC & Abilities
- Slot-Based Augments
- Modifiers & Phases
- Graph-Based Combos
Equipment slots that grant abilities and spawn gear.
- Slot-Based Equipping
- Grants Abilities & Effects
- Spawns Visual Actors
- Interface-Decoupled
Data-driven settings framework with a ready-made CommonUI screen.
- Data-Driven Options
- Zero-Glue Persistence
- CommonUI Screen
- Presets & Profiles
- Live Preview