// docs/gameplay-moveset-system/quick-start.md
READ

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 ContentBlockHeaderInvalidCreate disconnects when both authority and an autonomous proxy create it locally. A CDO/BP-added stably-named component sidesteps that entirely. Apply Moveset only 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:

  1. Drop Attack Nodes for each step (Moveset.Attack.Primary.A, .B, .C).
  2. Connect them — transition edges are created automatically.
  3. Click each transition and configure:
    • RequiredInput.RequiredAction — the UInputAction that must fire (auto-binding listens to it).
    • RequiredInput.RequiredTriggerEventStarted, Triggered, Completed, or Canceled (default Started).
    • RequiredInput.RouteTag — optional gameplay-tag route, when the same action drives multiple paths.
    • ConditionsFGameplayTagQuery for conditional branching (e.g. require State.Dodging).
    • Priority — higher-priority transitions are checked first.
  4. (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.
  5. 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 MeshSourceSlot and AttackTag.
  • 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 GameplayTag column 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:

  • DefaultModeFMovesetModeData used when the active Mode tag is empty (single-mode weapons fill out only this).
  • AlternateModesTMap<FGameplayTag, FMovesetModeData> for the multi-mode case (Moveset.Mode.TwoHanded, Moveset.Mode.DualWield, custom).

Each FMovesetModeData carries:

  • ComboGraph — the UComboGraphAsset from step 4.
  • AnimationChooser — the UChooserTable from step 6.
  • HitboxFMovesetHitboxData (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 an Moveset.Event.Hit Action 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.