Skip to content

How-To: Hand-Finish an Ability

last-verified: 2026-07-10 against f9ebdc9a3

The wizard leaves you with a valid but silent ability: it has the right structure and data, but no animation, no hit moment, no visuals or sound. Those are hand-work in the editor, and this page is the checklist. For attack-type abilities the wizard shows a reminder about the first two items when it finishes — this is what that reminder means.

Work top to bottom; each item unblocks the next.

1. Give it a montage

For a skill, the ability owns its montage. Open the new ability Blueprint, go to Class Defaults, and set Skill Montages — a map from hand context to montage. Add one entry; the key only matters if you later want the skill to look different in different grips, and any key works for a weaponless skill. That's the whole step.

If you don't have a final animation yet, wire a placeholder montage now — everything downstream (hit timing, cues, feel) is authored on the montage.

There is no second route for a player skill. SkillMontages is empty or the skill plays nothing — ResolveSkillMontage() returns null and the ability ends immediately.

The other route: a tag-keyed table (enemies, and weapon attacks) **Enemies** resolve every montage against their own montage table, keyed by the ability's **ActionTag** (`Action.Attack.Normal`, `Action.Death`, …). If you are authoring a `UEnemyAbility` or `UEnemyAoeAbility`, set `ActionTag` in Class Defaults — never in the constructor, where the native-tag singleton is still empty — and add a matching row to the enemy's DataTable. See [Combat Animation → DataTable Structure](../03_Combat/06_Combat_Animation.md#datatable-structure) for the row format. **Weapon attacks** (`UMeleeAbility`) resolve theirs from the equipped weapon's combo configs and native input tags, because the montage is the weapon's identity and varies by combo step. They own no `ActionTag` and need no hand-finishing here. Player skills have neither. `ActionTag` does not exist on `UPlayerCombatAbility`.

The validator checks that the montage is named, not that it plays. SkillMontages is on the CDO, so a player skill with no entry warns (or errors, if it is an AOE skill that also cannot spawn). For an enemy it can only confirm an ActionTag key exists — whether a row answers that key is invisible, because the table belongs to the character, not the ability. A missing row plays nothing in-game. Confirm in PIE. See Montage Resolution.

Until 2026-07-08 the check passed on any non-None ActionTag, even one no row answered, and fifteen melee attacks satisfied it with dead tags. That is why the player route is now a single, CDO-visible map.

2. Place the hit moment on the montage

The montage decides when the ability connects. Open your montage asset — notifies are added by right-clicking a notify track in the montage timeline. There are two flavors:

  • Skill-style abilities (the damage fires at one moment): add a Send Gameplay Event notify on the frame where the hit should land, and set its event tag to the ability's HitEventTag (copied from Class Defaults, above). The ability is waiting for exactly that event — no notify, no damage, ever. This is the "hit-event notify" the wizard's reminder and the validator talk about.
  • Melee combo attacks (the weapon sweep does the hitting): add a ComboHitWindow notify state spanning the frames where the weapon should trace for targets. See Combat Animation → Animation Notifies for the full notify vocabulary (input windows, i-frames, feel notifies).

3. Wire the presentation cues

Your one-pager's Presentation axis lists a cue tag per phase (windup, impact, …). Each GameplayCue.* tag needs a cue notify asset that actually plays the VFX/sound — a cue tag with no handler plays nothing, and the validator flags it as an error for exactly that reason. See Gameplay Cue Visuals for how cues resolve to notify assets and where they live. If the cue tag itself doesn't exist yet, register it first (How-To: Register a Gameplay Tag).

4. Author the curves and feel values

Numbers you typed in the wizard's Tuning section were stamped as flat values. In Class Defaults, replace any that should be curve-driven with a curve reference (the one-pager's Effects axis says which). Feel-related numbers — timings, distances, impulses — are yours to iterate in PIE; see How-To: Feel-Test Your Ability.

Area-ability trap: in the shape config, the area an AOE covers is the Range field. Radius is not the size of the circle — it is the thickness of the detection trace. An AOE with Range = 0 hits nothing, silently. (This shipped once; the templates are fixed, but if you resize an area, resize Range.)

5. Save and go green

Saving the asset runs the validator. Fix anything red — the messages name the missing piece (unset tag, unhandled cue, …). Remember the montage row itself is outside the validator's sight (see step 1), so also confirm in PIE that the animation actually plays. When the save is clean and the montage plays, the ability is ready for kit composition (Step 6 of the tutorial).

You can ignore: anything the validator or other docs say about CDOs, authority, replication, or latches. Those are engine/engineering concerns; the tools enforce them for you.