🌟 What's New in v1.4 Professional

Major update — AI, Cinematic tools, and much more!

🤖 AI Behavior Tree

Full BT integration! AI can execute paired animations with task nodes and decorators.

🎬 Sequencer Tracks

Use paired animations in Level Sequences for cinematics and cutscenes!

🔗 Chain Animations

Create combo systems with auto-chaining sequences.

🎯 Smart Targeting

8 target modes including health-based, threat-based, and custom!

💥 QTE System

Interactive events with branching animations.

🌍 Environment

Wall slams, prop interaction, context-sensitive kills!

📦 Installation

Get the plugin running in your project.

v1.4 is 100% backward compatible. If you're upgrading from v1.3, your existing animations will work without changes.
1
Copy plugin to your project

Extract the PairedAnimationSystem_UE5_6 folder into your project's Plugins/ folder. If the Plugins folder doesn't exist, create it next to your .uproject file.

YourProject/
├── Content/
├── Plugins/
│   └── PairedAnimationSystem_UE5_6/    ← put it here
│       ├── Source/
│       ├── Resources/
│       └── PairedAnimationSystem.uplugin
└── YourProject.uproject
2
Enable GameplayAbilities in your .uproject

Open your .uproject file in a text editor and add:

{
  "Plugins": [
    { "Name": "GameplayAbilities", "Enabled": true }
  ]
}
If you're using a Blueprint-only project and don't plan to use GAS, this step is still needed because the plugin depends on it internally. Just add it and forget about it.
3
Regenerate project files (C++ projects only)

Right-click your .uproject file → Generate Visual Studio project files, then open and compile.

Blueprint-only projects can skip this — just open the editor and let it compile automatically.
4
Verify in Editor

Open Unreal Editor → Edit → Plugins → search "Paired Animation" → make sure the checkbox is ✅ enabled. Restart the editor if prompted.

🚀 Quick Start — Your First Paired Animation

Step-by-step, from zero to a working paired animation in Blueprints. No C++ or GAS knowledge needed.

This tutorial assumes you have a project with at least 2 characters in a level (for example your player + an enemy). You also need at least 2 animation assets (any animations will work for testing).
1
Add PairedAnimationComponent to BOTH characters

Open your Player Character Blueprint:

  1. Click Add Component (green button, top left)
  2. Search for Paired Animation Component
  3. Click to add it
  4. In the Details panel, make sure Can Initiate Paired Animations = ✅ True

Now do the same for your Enemy Character Blueprint:

  1. Add Paired Animation Component
  2. Make sure Can Receive Paired Animations = ✅ True
A character can have BOTH "Can Initiate" and "Can Receive" enabled — for example if players can execute each other in PvP.
2
Create your Animation Montages

You need 2 Animation Montages — one for the attacker, one for the victim.

If you already have montages — skip to step 3.

If you only have animation assets (clips) — create montages from them:

  1. In Content Browser, find your animation asset
  2. Right-click on it → Create → Create AnimMontage
  3. Name it clearly, for example: AM_Execution_Attacker
  4. Repeat for the second animation: AM_Execution_Victim
An Animation Montage is a special wrapper around an animation that allows it to be played on demand from code or Blueprints. The plugin uses montages (not raw animation clips) because they support blending, notifies, and sections.
Don't have animations yet? For testing, you can use the same animation for both — e.g. the Mannequin idle animation. Once it works, swap in real animations later.
3
Create a PairedAnimationData asset

This is the main asset that tells the plugin which animations to play and how.

  1. In Content Browser → Right-click → Miscellaneous → Data Asset
  2. In the popup, pick PairedAnimationData from the list
  3. Name it: DA_Execution_Sword (or any name you like)
  4. Double-click to open it

Fill in these settings:

SettingValueWhat it does
Animation TagExecution.SwordA unique tag to identify this animation
Display Name"Sword Execution"Human-readable name (optional)
Duration2.5How long the animation lasts in seconds

In the Actor Animations array, add 2 entries:

EntryRoleAnim Montage
Entry 0Initiator (Attacker)AM_Execution_Attacker
Entry 1Receiver (Victim)AM_Execution_Victim

Positioning settings:

SettingRecommended Value
Positioning ModeFace To Face
Actor Distance100
Instant Snap✅ True
4
Add input to trigger the animation

Open your Player Character Blueprint → Event Graph. We'll use a simple keyboard key to trigger it.

// Press F near an enemy → play execution animation

Keyboard Event F ───→ SphereTraceByChannel
    Start: GetActorLocation
    End: GetActorLocation + (GetActorForwardVector × 300)
    Radius: 50

   ↓ (Hit?)

Branch ── True ──→ Break Hit Result Hit Actor

   ↓

Get Paired Animation Component (from Self)

   ↓

Start Paired Animation With Data
    Anim Data: DA_Execution_Sword
    Target: Hit Actor
See Section 5: Adding Input & Triggering for a more detailed breakdown of this Blueprint, including Enhanced Input setup.
5
Test it!
  1. Place your player and an enemy in the level
  2. Press Play
  3. Walk up to the enemy and press F
  4. Both characters should snap into position and play the animation! ✅
That's it! The plugin automatically handles: positioning both characters, playing both animations in sync, blocking input during the animation, and cleaning up when done. All you need to provide is: (1) animation montages, (2) a Data Asset referencing them, and (3) an input event that calls StartPairedAnimationWithData.

🎞️ Preparing Animation Montages

Everything you need to know about setting up your montages for paired animations.

What is an Animation Montage?

An Animation Montage is an Unreal asset that wraps an animation so it can be played on demand. The Paired Animation System uses montages (not raw animation clips) because they support blending, notifies, sections, and runtime control.

Creating a Montage from an Animation

1
Find your animation in Content Browser

This can be any animation — an imported FBX, a Mixamo animation, a Marketplace animation, or a retargeted animation.

2
Create the Montage

Right-click on the animation asset → Create → Create AnimMontage

This creates a new montage asset next to your animation. Rename it with a clear prefix, e.g.:

AM_Execution_Sword_Attacker
AM_Execution_Sword_Victim
AM_Takedown_Front_Attacker
AM_Takedown_Front_Victim
3
Check the Skeleton

Open the montage and verify it's assigned to the correct Skeleton. Both montages must be compatible with the characters that will use them.

If your attacker and victim use different skeletons, that's fine! Each character plays its own montage on its own skeleton. They just need to be synchronized in time.

Tips for Good Paired Animations

TipWhy
Make both animations the same lengthThey play simultaneously — different lengths cause desync
Animate both characters at origin (0,0,0)The plugin handles positioning — don't bake world offsets into animations
Match the contact framesIf the sword hits at frame 30 in the attacker anim, the victim should react at frame 30 too
Use Root Motion if availableThe Data Asset has a bUseRootMotion option per actor
Set the Duration in the Data Asset to match your montage lengthThis ensures proper cleanup timing

Adding AnimNotifies (optional but recommended)

Open the attacker's montage and add notifies for damage, effects, and sounds:

Notify TypeWhere to AddWhat it Does
AnimNotify_PairedDamageAt the impact frameApplies damage to the receiver
AnimNotify_PairedEffectAt impact or any frameSpawns particles / plays sound
AnimNotifyState_PairedCameraDrag across entire animationCamera control during animation

To add them: open your montage → right-click on the timeline → Add Notify → search for "Paired".

See Section 19: AnimNotifies for detailed configuration of each notify type.

🎮 Adding Input & Triggering Animations

How to trigger a paired animation from player input. No GAS required!

The plugin provides the system (sync, positioning, playback, cleanup). You provide the trigger (when should the animation start). This section shows you exactly how to wire that up.

Method A: Simple Keyboard Key (fastest to set up)

Open your Player Character Blueprint → Event Graph:

1
Add a keyboard event

Right-click in Event Graph → search for the key you want (e.g. F) → select "F" keyboard event. The "Pressed" output is your trigger.

2
Find a target

You need a reference to the enemy actor. The simplest method:

SphereTraceByChannel
  Start: GetActorLocation
  End: GetActorLocation + (GetActorForwardVector × 300)
  Radius: 50
  Channel: Visibility



Branch (Return Value = hit?)
  True → Break Hit ResultHit Actor → this is your target!
See Section 6: Finding a Target for all 3 methods in detail.
3
Call StartPairedAnimationWithData

Drag from Self → search Get Paired Animation Component. Then from the component pin, call Start Paired Animation With Data:

Get Paired Animation Component (from Self)



Start Paired Animation With Data
  Anim Data: DA_Execution_Sword (your data asset)
  Target: Hit Actor (from the trace)

↓ Returns: Boolean (true = success, false = failed)
4
Complete Blueprint (copy this!)

Here is the full flow, start to finish:

Keyboard F (Pressed)
   SphereTraceByChannel
    Start: GetActorLocation
    End: GetActorLocation + (Forward × 300)
    Radius: 50
   Branch (hit?)
    True → Get Paired Animation Component (Self)
       Start Paired Animation With Data
        Anim Data: DA_Execution_Sword
        Target: Hit Actor

Method B: Enhanced Input Action (recommended for production)

If your project uses Enhanced Input (UE5 default), here's how to set it up:

1
Create an Input Action asset

Content Browser → Right-click → Input → Input Action → name it IA_Execute

Open it → set Value Type to Digital (bool)

2
Add it to your Input Mapping Context

Open your Input Mapping Context (e.g. IMC_Default) → add a new mapping:

Input ActionKey
IA_ExecuteF (or any key/button you want)
3
Use it in your Blueprint

In your Character Blueprint Event Graph, replace the keyboard event with:

EnhancedInputAction IA_Execute (Triggered)
   ... same trace + StartPairedAnimationWithData as above

Method C: Using GAS Ability (for GAS projects)

If your project already uses Gameplay Ability System, see Section 9: GAS Integration. It lets you trigger paired animations as proper abilities with costs, cooldowns, and effects.


Alternative: Use the Blueprint Library (one-liner)

The plugin includes a Blueprint Function Library with shortcut functions. Instead of getting the component first, you can call a static function directly:

Start Paired Animation Between
  Initiator: Self
  Target: Hit Actor
  Anim Data: DA_Execution_Sword

This does the same thing but in one node — it finds the component internally.

🎯 Finding a Target — 3 Methods

Before you can trigger a paired animation, you need a reference to the other actor (the "target"). Here are 3 ways to get one.

Method 1: Line Trace / Sphere Trace (most common)

Fires a ray from your character forward and checks if it hits an enemy. Best for melee executions where the player is looking at the target.

SphereTraceByChannel
  Start: GetActorLocation
  End: GetActorLocation + (GetActorForwardVector × 300)
  Radius: 50 (wider = more forgiving aim)
  Channel: Visibility

Branch on Return Value
True → Break Hit Result → Hit Actor = your target
Use SphereTrace instead of LineTrace for a wider detection area — the player doesn't have to aim perfectly at the enemy.

Method 2: Find Best Paired Animation Target (built-in!)

The plugin has a built-in function that automatically finds the closest valid target with a PairedAnimationComponent within a search radius:

Find Best Paired Animation Target (from PairedAnimationLibrary)
  Initiator: Self
  Search Radius: 300
  Required Tags: (leave empty or add tags)
  Ignored Actors: (leave empty)

↓ Returns: Actor or null
This is the easiest method — it automatically checks distance, tags, and whether the target has a PairedAnimationComponent. Just check if the result Is Valid before calling StartPairedAnimation.

Method 3: Sphere Overlap (area scan)

Checks for all actors in a sphere around the player, then picks the best one. Best for large-area executions or when the player doesn't need to aim.

SphereOverlapActors
  Position: GetActorLocation
  Radius: 250

For Each Loop → filter for actors with PairedAnimationComponent
pick closest one → use as Target

Which method should I use?

MethodBest ForDifficulty
Find Best Paired Animation TargetMost cases — auto-finds closest valid target⭐ Easiest
Sphere TraceMelee executions where player aims at enemy⭐⭐ Easy
Sphere OverlapArea attacks, grab all nearby, custom scoring⭐⭐⭐ Medium

📋 Data Asset Reference — PairedAnimationData

Complete reference of every field in the PairedAnimationData asset.

Identification

FieldTypeDescription
AnimationTagGameplayTagUnique tag to identify this animation (e.g. Execution.Sword)
DisplayNameTextHuman-readable name (for UI / debugging)
DescriptionTextOptional description

Animation Data (ActorAnimations array)

An array of FPairedActorAnimData — add one entry per actor (typically 2: Initiator + Receiver).

FieldTypeDescription
AnimMontageAnimMontageThe montage this actor plays
RoleEnumInitiator (Attacker), Receiver (Victim), or Support (3rd Actor)
LocationOffsetVectorCustom position offset (only used with Custom positioning mode)
RotationOffsetRotatorCustom rotation offset
bUseRootMotionBoolUse root motion from the montage?
TagsToApplyGameplayTagContainerTags applied to this actor during the animation

Positioning

FieldDefaultDescription
PositioningModeFaceToFaceFace To Face — actors face each other
Behind — initiator behind receiver
Side — side by side
Custom — use LocationOffset from ActorAnimations
ActorDistance100Distance between actors in cm (100–200 typical for melee)
bInstantSnapTrueTrue = characters teleport into position. False = smooth interpolation.
SnapSpeed10.0Interpolation speed (only if InstantSnap = false)
bSwapActorRolesFalseSwap initiator/receiver positioning

Requirements

FieldDefaultDescription
RequiredInitiatorTagsEmptyInitiator must have these tags to start
RequiredReceiverTagsEmptyReceiver must have these tags
MaxActivationDistance200Max distance (cm) between actors to trigger
RequiredFacingAngle45°Max angle (degrees) from facing direction (0 = any angle, 180 = must face directly)

Effects

FieldDescription
CameraShakeCamera shake class to play on initiator at start
CameraShakeScaleIntensity multiplier (0.0 — 1.0)
ImpactEffectNiagara particle system at sync point
StartSoundSound to play when animation starts

Gameplay

FieldDefaultDescription
bMakeInvulnerableTrueBoth actors invulnerable during animation
bDisableInputTrueDisable player input during animation
bCanBeInterruptedFalseCan external systems cancel this animation

Chaining

FieldDescription
bAutoChainToNextEnable combo chaining
NextAnimationsArray of follow-up PairedAnimationData assets
ChainWindowTime window (seconds) to chain after completion
bRequireInputToChainMust player press input to chain? (false = auto)

Camera, Audio, QTE, Environment

See dedicated sections: Camera, Audio, QTE, Environment.

📘 Blueprint Function Reference

All Blueprint-callable functions from PairedAnimationComponent and PairedAnimationLibrary.

Starting & Stopping Animations

FunctionDescription
Start Paired Animation With DataStart animation using a Data Asset reference + Target actor. Returns bool.
Start Paired AnimationStart animation using a Gameplay Tag + Target actor. Looks up Data Asset via Subsystem.
Stop Paired AnimationStop current animation. Optional bInterrupted flag.
Start Paired Animation BetweenLibrary shortcut — one node, pass Initiator + Target + Data Asset. Finds component internally.
Start Paired Animation By TagLibrary shortcut — same but with Gameplay Tag instead of Data Asset.

Checking State

FunctionReturnsDescription
Is In Paired AnimationBoolTrue if in ANY state (positioning, playing, finishing)
Is Playing Paired AnimationBoolTrue only during actual playback (not positioning)
Get Current PartnerActorReturns the other actor, or null if not animating
Can Start Paired AnimationBoolCheck if animation can start (distance, tags, state)
Can Start Paired Animation BetweenBoolLibrary shortcut — validates two actors + data

Finding Targets

FunctionReturnsDescription
Find Best Paired Animation TargetActorAuto-find closest valid target within radius. Filters by tags.
Find All Paired Animation TargetsArray<Actor>Get ALL valid targets in radius.
Are Actors In Range And FacingBoolCheck distance + facing angle between two actors.
Get Distance Between ActorsFloatSimple distance check.
Get Angle To TargetFloatAngle (degrees) from actor's forward to target.

⭐ = From PairedAnimationLibrary (static functions — call from anywhere, no component reference needed)

Tag Helpers

FunctionDescription
Has TagCheck if component has a specific Gameplay Tag
Has All TagsCheck if component has ALL specified tags
Actor Has TagLibrary version — pass actor directly
Add Tag To ActorAdd a tag to actor's PairedAnimationComponent at runtime
Remove Tag From ActorRemove a tag at runtime

Events (bind in Blueprint)

EventParametersWhen it fires
On Paired Animation StartedInitiator, Receiver, AnimDataAnimation playback begins
On Paired Animation FinishedInitiator, Receiver, AnimDataAnimation ends (completed or interrupted)
On State ChangedOldState, NewStateAny state transition (Idle → Positioning → Playing → Finishing → Idle)

⚡ GAS Integration

Trigger paired animations through Gameplay Ability System — with costs, cooldowns, and effects.

GAS is optional. If you don't use Gameplay Ability System, skip this section and trigger animations directly via Section 5.

Quick Setup

1
Create Ability Blueprint

Content Browser → Right-click → Blueprint Class → search for GA_PairedAnimation → Create. Name it GA_Execution_Sword.

2
Configure in Class Defaults
SettingValue
Animation TagExecution.Sword
Target ModeAuto Nearest (or Looking At for precision)
Max Target Distance300
3
Grant ability to character

In your Character's BeginPlay: Ability System Component → Give Ability → pick GA_Execution_Sword.

4
Activate from input
Input Action Try Activate Ability by Class
  Ability Class: GA_Execution_Sword

Target Selection Modes (8 total)

ModeDescription
ManualTarget provided via TargetData (advanced)
Auto NearestClosest valid target within range
Auto Best ScoreScores by distance + angle, picks best
Looking AtTarget inside cone in front of character
Lowest HealthWeakest target in range
Highest HealthStrongest target in range
Highest ThreatMost dangerous target in range
Random ValidRandom valid target in range
CustomOverride CustomTargetSelection in Blueprint

Gameplay Effects

Apply GAS effects automatically on start and on completion:

FieldDescription
Effects To Apply To InitiatorE.g. GE_Invulnerable, GE_MovementLock
Effects To Apply To ReceiverE.g. GE_Stunned, GE_DefenseDown
Effects On CompletionE.g. GE_DamageBonus, GE_HealthRegen

Cost & Cooldown

Use standard GAS Cost/Cooldown GameplayEffects in the ability's Class Defaults — just like any other GAS ability.

The plugin works perfectly with Lyra — just add the component to Lyra characters and grant the ability in the hero data. See GAS_INTEGRATION.md in the plugin Documentation folder for the full Lyra guide.

🔗 Chain Animations

Create combo systems with auto-chaining sequences.

Set bAutoChainToNext = True in your Data Asset, then fill the NextAnimations array with follow-up Data Assets. The system will offer chaining within the ChainWindow time (default 0.5s after completion).

If bRequireInputToChain = True, the player must press the trigger key again within the window. If false, it auto-chains to the first available animation.

DA_Combo_Hit1  →  DA_Combo_Hit2  →  DA_Combo_Finisher
    Chain Window: 0.5s    Chain Window: 0.3s    (end)

🎯 Advanced Targeting

8 target selection modes via the GAS ability. See GAS Integration for the full list.

💥 QTE & Interactive Events

Quick Time Events with branching outcomes.

Add entries to the QTEEvents array in your Data Asset:

QTE TypeDescription
Button PressSingle button press within time window
Button MashingPress button X times within window
Directional InputInput a direction (WASD/stick)
Timing ChallengePress at the exact right moment
Hold ButtonHold for duration

Each QTE can branch to a different animation on Success vs Fail, and apply different GameplayEffects. PerfectTimingMultiplier adds bonus damage for frame-perfect presses.

🌍 Environment Interaction

Wall slams, prop interaction, context-sensitive kills.

Set EnvironmentRequirement in your Data Asset to require specific environment conditions:

ModeDescription
Requires WallMust be near a wall (auto-detected)
Requires PropSpecific actor class nearby (e.g. table, railing)
Requires LedgeNear a ledge or edge
Requires GroundSpecific ground surface
Requires WaterIn or near water

Use MaxEnvironmentDistance to control detection range. Set bSpawnPropIfMissing to auto-spawn a weapon or object for the animation.

📹 Advanced Camera

Multi-camera cuts, slow motion, and post-processing during animations.

Camera Cuts

Add entries to the CameraCuts array in your Data Asset. Each cut defines a camera position, FOV, and timing:

FieldDescription
StartTimeWhen this cut starts (seconds into animation)
DurationHow long it lasts
CameraTransformPosition/rotation relative to initiator
FOVField of view (60–70 for dramatic, 90 for normal)
BlendTimeTransition time to this cut

Slow Motion

Set bUseSlowMotion = True → configure SlowMotionSpeed (0.3 = 30% speed), SlowMotionStartTime, and SlowMotionDuration.

AnimNotifyState (simpler method)

Alternatively, add AnimNotifyState_PairedCamera to your attacker's montage for basic camera control. See Section 19.

The player always has full mouse control during paired animations. The camera system never blocks player input.

🔊 Enhanced Audio

Dialogue, effort sounds, impacts, and ambient audio.

FieldDescription
InitiatorDialogueArray of dialogue sounds for the attacker
ReceiverDialogueArray of dialogue sounds for the victim
EffortSoundsTimed audio events — grunts, screams at specific times
ImpactSoundsArray of hit/impact sounds
AmbientSoundLooping sound during animation
bRandomizeAudioSelectionRandomly pick from arrays for variety
AudioAttenuationSound attenuation settings for 3D audio

💪 Gameplay Effects

Buffs, debuffs, status effects, and rewards.

FieldDescription
StatusEffectsOnHitGAS effects applied on damage notify
InitiatorBuffsBuffs for the attacker during animation
ReceiverDebuffsDebuffs for the victim during animation
ResourceDrainEffectDrain stamina/mana from initiator
ResourceGainEffectReward resources to initiator
XPRewardXP awarded on completion
CurrencyRewardCurrency awarded on completion

🤖 AI Behavior Tree Integration

AI can execute paired animations directly from Behavior Trees!

Available Nodes

BTTask_ExecutePairedAnimation

Behavior Tree task that executes a paired animation.

SettingDescriptionDefault
Animation TagWhich animation to playNone
Animation DataDirect data asset referenceNone
Target KeyBlackboard key for targetEmpty (auto-find)
Auto Target Search DistanceSearch radius if no key300cm
Required Target TagsTarget must have theseEmpty
Forbidden Target TagsTarget must NOT have theseEmpty
Wait For CompletionTask waits for anim finish?True

BTDecorator_CanExecutePairedAnimation

Condition decorator — checks if AI can execute a paired animation before entering the branch.

Example: AI Takedown

Behavior Tree:
Root
└── Selector
    ├── Sequence [Try Takedown]
    │   ├── Decorator: Can Execute Paired Animation?
    │   │     Animation Tag: Ability.Combat.Takedown
    │   │     Search Distance: 200cm
    │   ├── Decorator: Enemy HP < 30%
    │   └── Task: Execute Paired Animation
    │         Animation Tag: Ability.Combat.Takedown
    │         Wait For Completion: True
    │
    └── Task: Normal Attack (fallback)

Step-by-Step Setup

1
Make sure AI character has PairedAnimationComponent

Same as player setup — add the component and enable Can Initiate Paired Animations.

2
Open your AI's Behavior Tree

Add Decorator: right-click → Add Decorator → search "Can Execute Paired Animation"

3
Add the Task

Add Task → search "Execute Paired Animation". Set the Animation Tag. Leave Target Key empty for auto-find.

4
Test!

Place AI and a target in the level. The AI should approach and execute the animation automatically.

🎬 Sequencer Integration

Use paired animations in Level Sequences for cinematics and cutscenes.

Setup

1
Create Level Sequence

Content Browser → Right-click → Cinematics → Level Sequence. Add both actors to the Sequencer.

2
Add Paired Animation Track

On the initiator's track → "+ Track" → search "Paired Animation".

3
Add & configure section

Right-click on track → Add Section. Set the Animation Tag, Target Binding, and Blend In/Out Time.

Example Timeline: Boss Intro

0s-2s:   Boss enters room (idle animation)
2s-4s:   [PAIRED ANIMATION] Boss grabs player
4s-6s:   Close-up of boss face (camera track)
6s-8s:   Boss dialogue
8s:      Gameplay resumes
Some features don't work in Sequencer: camera cuts from Data Asset (use Sequencer cameras), slow motion (use Sequencer time dilation), QTE events (gameplay only). Audio, VFX, and damage still work.

🔔 AnimNotifies — Damage & Effects

Add damage, particles, and sounds at exact frames in your montages.

AnimNotify_PairedDamage

Applies damage to the receiver at a specific frame.

How to add: Open attacker's montage → right-click timeline → Add Notify → search "Paired Damage".

SettingDescription
Damage AmountHow much damage to apply
Damage TypeYour damage type class (optional)
Place the notify at the exact frame where the weapon makes contact — e.g. the sword swing hits at frame 30, put the notify there.

AnimNotify_PairedEffect

Spawns particles and plays sounds at specific frames.

SettingDescription
Effect TargetSpawn on Initiator or Receiver?
Particle SystemNiagara or Cascade particle effect
SoundSound to play
Attach to SocketOptional socket name (e.g. "hand_r")

AnimNotifyState_PairedCamera

Camera control during the animation. Drag it to cover a range of frames (it's a notify state, not a single-frame notify).

SettingDescription
bOverrideFOVFalse = normal camera. True = custom FOV.
CustomFOV50–70 for dramatic zoom, 90 for normal
FOVTransitionSpeedHow fast to blend to custom FOV

📢 Events & Callbacks

React to paired animation lifecycle in your game logic.

Binding Events in Blueprint

Select the PairedAnimationComponent on your character → scroll to Events in Details panel → click the + next to:

EventWhen it firesUse case
On Paired Animation StartedAnimation begins playingPlay sound, show UI, start slow-mo
On Paired Animation FinishedAnimation endsAward XP, spawn loot, update counters
On State ChangedAny state transitionUpdate UI, trigger effects per-phase

Animation States

StateDescription
IdleNot in any paired animation
PositioningCharacters are moving into position
PlayingMontages are playing
FinishingAnimation ending, cleanup in progress

🌐 Multiplayer

Full replication is built-in. No extra setup needed.

The plugin automatically handles:

  • Server authority — animations validated on server
  • Multicast to all clients — everyone sees the animation
  • Synchronized playback — same timing everywhere
  • Spectator support — spectators see animations correctly

Just call StartPairedAnimationWithData from any client or the server — replication is automatic.

Make sure animation montages are identical on all clients. Different montage lengths will cause desync. Also ensure bReplicateAnimation = True in the Data Asset (it's True by default).

🔧 Troubleshooting

Common problems and solutions.

Animation Issues

❌ Animation doesn't play when I press the trigger key
  • Both characters have PairedAnimationComponent?
  • Attacker has Can Initiate Paired Animations = True?
  • Victim has Can Receive Paired Animations = True?
  • Data Asset has both montages configured (Initiator + Receiver)?
  • Characters are within MaxActivationDistance?
  • Are you actually hitting the target with your trace? Enable bShowDebugInfo on the component.
  • Is the target actor being passed correctly? Add a Print String after the trace to verify.
❌ StartPairedAnimationWithData returns False
  • Call Can Start Paired Animation first to check what fails
  • Enable bShowDebugInfo = True on the component — check Output Log for details
  • Verify the target has a PairedAnimationComponent
  • Check you're not already in a paired animation (Is In Paired Animation == True)
❌ Characters don't line up correctly
  • Check PositioningMode — try Face To Face first
  • Adjust ActorDistance (try 100–200)
  • Make sure animations were authored at origin (0,0,0)
  • Try bInstantSnap = True for reliable positioning
❌ Camera goes black during animation
  • Update to v1.2+ (this bug was fixed)
  • Check that your character has a valid Camera Component
  • Enable debug logging to diagnose

Setup Issues

❌ "Component not found" error
  • Make sure PairedAnimationComponent is added to the character Blueprint
  • Verify the character is properly spawned in the level (not just placed as a static mesh)
  • Check the component is not disabled
❌ Compilation errors after installing plugin
  • Delete Intermediate and Binaries folders from your project
  • Right-click .uproject → Generate Visual Studio project files
  • Rebuild project
  • Make sure GameplayAbilities plugin is enabled in .uproject

AI Issues

❌ BTTask not appearing in Behavior Tree
  • Recompile the plugin
  • Restart Unreal Editor
  • Check AIModule is in dependencies
❌ AI not finding targets
  • Increase Auto Target Search Distance
  • Check target has PairedAnimationComponent with Can Receive = True
  • Verify tag filters (Required / Forbidden)
  • Use BT debugger to see which node fails

Multiplayer Issues

❌ Animations are out of sync
  • Ensure montages are identical on all clients
  • Check bReplicateAnimation = True in Data Asset
  • Very high ping (200ms+) can cause minor desync
For all issues: enable bShowDebugInfo = True on the PairedAnimationComponent and check the Output Log — look for lines starting with 🎭 (component) or 📷 (camera).