Quick Start
Wire up Gameplay Moveset System and ship your first combo in nine steps
This guide takes you from "plugin enabled" to "first attack on screen" in nine concrete steps. Each step describes the asset to author, the exact menu path, and the wiring rule the runtime expects.
Prerequisites
- Unreal Engine 5.7
- A character Blueprint with a
USkeletalMeshComponent - Basic familiarity with Enhanced Input (Input Actions, Input Mapping Contexts)
The plugin's required engine plugins (Enhanced Input, Gameplay Tags, Chooser) are auto-enabled when you enable the moveset plugin itself.
1. Enable the plugin
Edit → Plugins → Gameplay Moveset System → enable, restart the editor. Required dependencies are toggled on automatically.
2. Create your gameplay tags
In Project Settings → Gameplay Tags, add tags for your attacks. The Moveset. namespace is convention only — pick whatever scheme fits your project:
Moveset.Attack.Primary.A
Moveset.Attack.Primary.B
Moveset.Attack.Primary.C
Moveset.Attack.Secondary.A
The plugin already declares structural roots (Moveset.Attack, Moveset.State, Moveset.Mode.*, Moveset.MeshSlot.*, Moveset.Event.*) as native tags. You only add subtags under those.
3. Add MovesetComponent to your character
Open your Character Blueprint → Add Component → MovesetComponent. In Details → Replication, leave Component Replicates = true (default).
Why this matters. A runtime-created replicated sub-object causes
ContentBlockHeaderInvalidCreatedisconnects when both authority and an autonomous proxy create it locally. A CDO/BP-added stably-named component sidesteps that entirely.Apply Movesetonly initialises an existing component — it does NOT spawn one.
For multiplayer, set the character mesh's VisibilityBasedAnimTickOption to Always Tick Pose, Refresh Bones. Otherwise the server's pose tick doesn't fire AnimNotifyState NotifyBegin for off-screen actors and authority-side hit detection silently breaks.
4. Create a Combo Graph
Content Browser → Add → Gameplay → Moveset → Combo Graph.
In the graph editor:
- Drop Attack Nodes for each step (
Moveset.Attack.Primary.A,.B,.C). - Connect them — transition edges are created automatically.
- Click each transition and configure:
RequiredInput.RequiredAction— theUInputActionthat must fire (auto-binding listens to it).RequiredInput.RequiredTriggerEvent—Started,Triggered,Completed, orCanceled(defaultStarted).RequiredInput.RouteTag— optional gameplay-tag route, when the same action drives multiple paths.Conditions—FGameplayTagQueryfor conditional branching (e.g. requireState.Dodging).Priority— higher-priority transitions are checked first.
- (Optional) Drop a Reset Combo Node at the end of a chain. Transitions into it return the cursor to the root WITHOUT terminating the moveset.
- Auto-compiles on every property edit and on asset load. Compile in the toolbar forces a recompile.
See Combo Graph for the full node + transition reference.
5. Create animation montages
Make a UAnimMontage per attack. On each timeline, place:
- Moveset: Combo Window (AnimNotifyState) — the range where a press should queue the next attack. Queued input resolves the moment the window ends.
- Moveset: Hitbox (AnimNotifyState) — places a sweep window. Set
MeshSourceSlotandAttackTag. - Moveset: Combo Point (AnimNotify, optional) — UI / feedback hook.
Geometry / channel / filters for the hitbox come from the active Definition's FMovesetModeData::Hitbox, NOT from the ANS itself. The same montage drives different hitbox shapes / sockets across different weapons or modes.
6. Create an Animation Chooser
Content Browser → Add → Gameplay → Moveset → Moveset Animation Chooser.
The factory pre-configures the chooser:
- Output type:
UAnimMontage. - ContextData:
[0] Actor,[1] FGameplayTagContainer. - One
GameplayTagcolumn bound to ContextIndex 1.
Add rows mapping each attack tag to its montage:
| GameplayTag | Result (AnimMontage) |
|---|---|
| Moveset.Attack.Primary.A | AM_Sword_Slash_A |
| Moveset.Attack.Primary.B | AM_Sword_Slash_B |
| Moveset.Attack.Primary.C | AM_Sword_Slash_C |
Different weapons → different chooser tables, referenced per Mode in the Definition.
7. Create a Moveset Definition
Content Browser → Add → Gameplay → Moveset → Moveset Definition.
A Moveset Definition holds the data for ONE weapon TYPE — every grip / stance lives inside as separate Modes. Two top-level fields:
DefaultMode—FMovesetModeDataused when the active Mode tag is empty (single-mode weapons fill out only this).AlternateModes—TMap<FGameplayTag, FMovesetModeData>for the multi-mode case (Moveset.Mode.TwoHanded,Moveset.Mode.DualWield, custom).
Each FMovesetModeData carries:
ComboGraph— theUComboGraphAssetfrom step 4.AnimationChooser— theUChooserTablefrom step 6.Hitbox—FMovesetHitboxData(geometry + filters).Config— overrides for input buffer / combo timeouts.
Sharing the same ComboGraph asset across two Definitions is what makes cross-weapon combo continuity work. See Modes.
8. Apply in gameplay (Blueprint)
Use the Apply Moveset async-action node. Apply Moveset is safe on any side — server-only, client-only, or both in parallel — and is fully idempotent on first call.
Apply Moveset
Target Actor: Self
Moveset Asset: DA_SwordMoveset
Mode: (empty for single-mode, or e.g. Moveset.Mode.TwoHanded)
Initial Input: IA_PrimaryAttack (optional — TryComboAdvance fires with this
once the moveset is ready, so the press
that opened the chain plays immediately)
→ On Moveset Event (Payload)
Switch on Payload.EventTag:
Moveset.Event.Ready → moveset initialised
Moveset.Event.AttackStarted → Payload.AttackTag began playing
Moveset.Event.AttackEnded → Payload.AttackTag finished naturally
Moveset.Event.Hit → Payload.AttackTag, Payload.HitResult
Moveset.Event.ComboAdvanced → Payload.PreviousAttackTag → Payload.AttackTag
Moveset.Event.ComboDropped → chain ended (timeout / cancel / reset)
Moveset.Event.ComboPoint → Combo Point notify fired
Moveset.Event.Failed → initialisation failed
If you prefer separate delegates instead of the unified pin, bind directly to the component's events:
UMovesetComponent* M = Actor->FindComponentByClass<UMovesetComponent>();
M->OnReady.AddDynamic(this, &AMyChar::HandleReady);
M->OnAttackStarted.AddDynamic(this, &AMyChar::HandleAttackStarted);
M->OnHit.AddDynamic(this, &AMyChar::HandleHit);
M->OnComboAdvanced.AddDynamic(this, &AMyChar::HandleComboAdvanced);
M->OnComboDropped.AddDynamic(this, &AMyChar::HandleComboDropped);
9. Trigger attacks
Two paths.
Auto-bind (recommended). Once Apply Moveset ran and Moveset.Event.Ready fired, the current combo node's outgoing transitions are bound to your Input Actions through Enhanced Input. A press fires TryComboAdvance automatically.
Manual.
UMovesetComponent* Moveset = Actor->FindComponentByClass<UMovesetComponent>();
// Direct attack by tag (works when idle)
Moveset->TryActivateAttack(FGameplayTag::RequestGameplayTag("Moveset.Attack.Primary.A"));
// Combo advance (the standard combo path)
FMovesetInputCommand Cmd;
Cmd.RequiredAction = IA_PrimaryAttack;
Moveset->TryComboAdvance(Cmd);
What's NOT included
The plugin is intentionally agnostic about cosmetic / numerical layers:
- No damage calculation. Listen to
OnHit(or attach anMoveset.Event.HitAction Module) and run your own damage pipeline. - No VFX or sound. Use standard UE animation notifies on the montage.
- No movement / dashes / camera shake. Events are exposed; the policy is yours.
Next steps
- Architecture — how the runtime processes inputs and dispatches hits.
- Combo Graph — node + transition reference, conditions, Reset Combo, motion inputs.
- Action Modules — per-node Blueprint logic with NetMode gating.
- Modes — multi-grip weapons, runtime swap, cross-weapon combo continuity.