# Pairing Editor

> A Paired Action opens in the pairing editor: stand-ins on their rings in a viewport, a timeline of each role's part, montage and events, camera shots, and a list of what still needs fixing.

Markdown version of https://rigbak.com/docs/universal-player-combat/pairing-editor, a page of the Universal Player Combat documentation. Link that page when citing it.

## Set it up (5 minutes)

1. **Open the paired action**

   Double-click `Paired_MyExecution` from [Paired Actions](https://rigbak.com/docs/universal-player-combat/paired-actions).

   Double-click **Paired_MyExecution** in the Content Browser to open it.
2. **Give the Attacker an events lane**

   On the timeline, right-click the Attacker's **Role** row and choose **Add Event Track**: a green **Events** lane appears.
3. **Land the blow**

   Scrub to the frame the blow lands, right-click the lane there, choose **Add Event** and pick **Deal Damage**. In Details, set **Target Role Id** to `Victim` and **Damage Override** to `25`.

   **Details panel: Deal Damage** (instanced object, in Paired_MyExecution)

   **Category: Paired Action Event**

   | Property | Value |
   | --- | --- |
   | Time Seconds | 1.20 |
   | Target Role Id | Victim |
   | Skip when Target Missing | true |
   | Damage Config | None |
   | Damage Override | 25 |
   | Impact Socket Name | None |
   | Extra Damage Tags | no tags |
   | Run Hit Effects | true |

   *Carried by the Attacker and aimed at the Victim, so the attacker's stab lands on the victim at 1.2 seconds into the action.*
4. **Drop the victim at the end**

   Give the Victim a lane and add a **Ragdoll** near the end of its montage, with Target Role Id empty (an event with none acts on the role carrying it). Ragdoll needs a [UPC Physical Reaction](https://rigbak.com/docs/universal-player-combat/physical-reactions) with a Reaction Set on the victim, which the demo's `BP_UPC_PairedDummy` carries. The victim leaves the action limp; the Attacker plays on.
5. **Save and press Play**

   Take part again: the dummy takes 25 damage as the blow lands and drops limp at the end.

---

## The window

Paired_MyExecution Derive Offsets Fit Action Frame All

Preview

Two role rings on the ground, the anchor role in gold and the other role in blue.

Stand-ins on their rings. Click a stand-in and drag the gizmo to move its role; the Camera Shot strip appears here for a role with an Authored Camera Shot hook.

Timeline

One folder per role: its Role bar, its Animation bar and its Events lanes.

Roles

Add Role, rename, set the anchor, show or hide a stand-in.

Action

Settings for the whole action: anchor, release, placement.

Details

The selected role, or the selected event.

Validation

Issues, with a Fix button where one answer is right.

*The pairing editor as it first opens. Every panel can be docked elsewhere; Window, Pairing Editor brings a closed one back.*

| Panel | Holds |
| --- | --- |
| **Preview** | A stand-in per role on its ring, posed at the playhead. |
| **Timeline** | A folder per role: Role, Animation and Events rows. |
| **Roles** | Add, rename, delete, set the anchor, hide a stand-in. |
| **Action** | Whole-action settings ([The anchor](https://rigbak.com/docs/universal-player-combat/paired-actions#the-anchor)). |
| **Details** | The selected role or event; **Preview Settings** opens from **Window**, **Pairing Editor**. |
| **Validation** | The asset's issues ([Validation](https://rigbak.com/docs/universal-player-combat/pairing-editor#validation)). |

Toolbar: **Derive Offsets** overwrites each role's offset with where its montage places the character, **Fit Action** lets the length follow the content again, **Frame All** frames every role. Selecting a role in one panel selects it everywhere.

---

## Line the roles up

*Interactive diagram on the page: The first role added becomes the anchor and carries the star. F2 or a right-click renames a role; the right-click menu also holds Set as Anchor and Delete.*

- **Add Role** adds Role1, Role2 and on; a new asset's first is the anchor (star, gold tile). F2 renames (anchor and Face Toward settings follow); right-click, **Set as Anchor** sets the anchor and At Role.
- A rename leaves events aimed at the old name with no target; they never run, and Validation lists them.
- Click a stand-in to select its role (white ring outline), then drag the move or rotate gizmo; it stays on the ground and turns on the vertical axis. The anchor only turns.
- Rings: gold anchor, blue required, green optional, gray "(done)" once the montage has ended at the playhead. **Show**, **Pairing** toggles **Slot Rings**, **Role Labels** and **Anchor Guides**.

---

## The timeline

**Timeline: Paired_MyExecution** (3 s long). Tracks:

- **Attacker (Anchor)**

  - **Role**: Role (0 s to 2.6 s)
  - **Animation**: AM_UPC_Unarmed_Execute_Attacker_B (0 s to 2.6 s)
  - **Events**: Deal Damage on Victim (at 1.2 s)
- **Victim**

  - **Role**: Role (0 s to 2.4 s, rising until 0.4 s)
  - **Animation**: AM_UPC_Unarmed_Execute_Victim_B (0 s to 2.4 s)
  - **Events**: Ragdoll (at 2.2 s)

*Times are an example. The Role bar runs from join to release, with the Victim's glide as a dashed slope; the Animation bar is the montage's played stretch.*

| Row | Drag to set |
| --- | --- |
| **Role** | Left edge **Role Start Seconds**, right edge **Role End Seconds**. |
| **Animation** | The whole bar sets **Start Delay Seconds**. Dragging the left edge right by 0.5 s adds 0.5 to **Start Delay Seconds** and to **Play from Seconds**: the montage starts later and skips its first 0.5 s, and the rest stays put. The right edge sets **Play to Seconds**. An amber line marks the Sync Marker, where a Sync with Current role lines up with the swing it takes over ([Paired Actions](https://rigbak.com/docs/universal-player-combat/paired-actions#a-counter-sets-and-the-paired-action-available-condition)). |
| **Events** | A bar's **Time Seconds**, snapped to the frame, and a window's length. |

Two clocks. **Role Start Seconds**, **Start Delay Seconds** and an event's **Time Seconds** count from the action's start, not the role's join; **Play from Seconds** and **Play to Seconds** are times inside the montage. A Victim with Role Start 0.5, Start Delay 0.8 and Play from 0.3 joins at 0.5 s and starts its montage at 0.8 s, 0.3 s in. A Data Driven role's montage starting inside its glide loses root motion until the glide ends, so start it after the slope.

Right-click a row for **Add Event Track**, **Add Animation Track**, **Fit Role To Content** (once its start or end is set) and the deletes, or a lane for **Add Event**, any event class included. An event outside the bar of the role carrying it never runs and shows dimmed. The end marker sets **Action Length Seconds**; **Fit Action** clears it.

---

## Events

An event fires at a second of the action on the role in **Target Role Id** (the carrying role when empty), so an attacker's stab can damage the victim. Moving a montage leaves its events put. **Skip when Target Missing** (on) skips it while the target role is empty or out of the action; a window's **Duration Seconds** (0.25) ends early with the action or its role.

These run on the server:

| Event | Does |
| --- | --- |
| **Deal Damage** | A weapon hit from a **Damage Config** or **Damage Override**; **Kill** takes all the target's health whatever defends it. |
| **Apply Effect**, **Remove Effect**, **Apply Effect For Duration** | A gameplay effect on the target (the window form for its length). |
| **Hold Tags** | A window of tags on the target, such as `UPC.State.Intangible`. |
| **Push** | Launches a character target. |
| **Ragdoll** | Drops the target limp and out of the action while the rest play on; needs a UPC Physical Reaction with a Reaction Set. |
| **Release Role** | Lets the target out early. Both end the role Completed, so Cancel All leaves the other roles playing. |
| **Send Gameplay Event**, **Gameplay Event Window** | A gameplay event, or one at the window's open and one at its close. |
| **Activate Ability** | Starts an ability granted to the target. |
| **Play Gameplay Cue** | A cue every player sees, such as a camera shake. |
| **Notify Listener**, **Notify Listener Window** | Calls On Paired Action Event on a `UPCPairedActionListener`. |
| **Disarm** | Knocks the drawn weapon down, or puts away one that cannot drop. |

These play on every machine showing the action, never a dedicated server:

| Event | Does |
| --- | --- |
| **Play Sound** | A sound at a placement; **Follow** tracks the socket. |
| **Play Niagara**, **Timed Niagara** | A Niagara system at a placement (timed form for the window). |
| **Anim Effect**, **Anim Effect Window** | Asks the target for an effect by tag; it answers with its own sound or particles, as for an [anim effect notify](https://rigbak.com/docs/universal-player-combat/animation-integration#ask-the-character-for-its-own-effect). |

**Details panel: Ragdoll** (instanced object, in Paired_MyExecution)

**Category: Paired Action Event**

| Property | Value |
| --- | --- |
| Time Seconds | 2.20 |
| Target Role Id | None |
| Skip when Target Missing | true |
| Use Reaction Set Defaults | true |
| Impulse Bone | None |
| Impulse Frame | Away from Source |
| Impulse Strength | 0 |
| Impulse Vertical | 0 |

*Carried by the Victim with no Target Role Id, so it acts on the Victim itself: drops it limp and lets it out of the action. It needs a UPC Physical Reaction component with a Reaction Set.*

### Place an effect on a body

Sound, Niagara and cue events carry a **Placement**: an **Origin** (**Target** the role acted on, **Source** the role carrying it, **Anchor** the ground spot, no socket), a **Socket Name** on that role's mesh, and a **Location Offset** and **Rotation Offset**. **Play Once in Preview** spawns a Niagara system at the playhead.

---

## Stand-ins

**Preview Stand-In** in Details, or the combo under a role in Roles, sets what stands in for it; none of it reaches the game.

| Preview Kind | Shows |
| --- | --- |
| **Skeletal Mesh** | Default: **Preview Mesh**, else the montage's or skeleton's preview mesh, posed; **Preview Anim Instance Class** runs an Animation Blueprint instead. |
| **Actor Class** | **Preview Actor Class**, posed on **Preview Actor Mesh Component** (else its first skeletal mesh). |
| **Static Mesh** | **Preview Static Mesh**, unposed, for a prop. |
| **None** | Ring and label only. |

**Preview Items** puts items in its hands, **Preview Scale** (1) matches a scaled character, **Preview ZOffset** lifts it, **Preview Mesh Yaw Offset** (-90) faces a mesh like the game character. **Project Settings**, **Plugins**, **Universal Player Combat Pairing Editor** picks which Actor Class components show.

**Details panel: Universal Player Combat Pairing Editor** (project settings, in Project Settings)

**Category: Preview**

| Property | Value |
| --- | --- |
| Preview Actor Component Filter | Main Skeletal Mesh |
| Preview Components Always Kept | 0 Array elements |

*Which of an actor class's components show when a role previews as that actor. Editor only.*

---

## Camera shots

An **Authored Camera Shot** hook plays a keyed camera move for the player in a role:

1. Add it to the role's **Hooks**; a **Camera Shot** strip appears in the viewport.
2. **Create Shot** saves a Camera Shot asset (action name plus `_Camera`), assigns it and turns on **Edit Camera**.
3. Scrub, **Add Key** and move it with the gizmo, or fly the viewport there and **Capture View**.
4. **Preview Camera** looks through the shot; with **Auto Key**, flying writes the key at the playhead.

The strip edits a key's **Time (s)**, **FOV (deg)**, **Curved** (path bends through a handle) and **To next** (**Linear**, **Smooth**, or **Hold**: keep this view, then cut), with **View Key**, **Delete Key**, **Duplicate Shot** and **Curve New Keys**. Hook settings: [Camera](https://rigbak.com/docs/universal-player-combat/camera#cameras-for-paired-actions).

---

## Validation

The **Validation** panel lists the asset's issues as you edit; double-click one to select its role and frame the cast, and **Fix** makes the change it names. Saving logs the same issues under `LogUPCPaired`; Troubleshooting lists each with its fix.

Validation

Role 'Victim' is let go at 1.5s, before its montage ends at 2.4s, so the animation is cut off there. Drag the right edge of its bar out, or use Fit Role To Content, if that was not intended.

Role 'Victim' plays to 0.4s, at or before where it plays from at 0.6s, so nothing plays. Drag the right edge of its montage bar out, or set Play To Seconds to 0 to play to the end. Fix

*Double-click a row to select its role and frame the whole cast in the preview. Fix makes the one change the message names, as an undo step of its own.*

<details>
<summary>Editor and event details (Advanced)</summary>

- A Blueprint child of `UPCPairedActionEvent` overriding **Fire Paired Action Event** is an event of your own; **Cosmetic** in its Class Defaults runs it on every machine.
- **Preview Items** gate nothing in the game; each sits where its first [Hold Places](https://rigbak.com/docs/universal-player-combat/equipment#where-an-item-is-held-hold-places) entry holds it on a default body. An Actor Class stand-in keeps its class scale, which Preview Scale multiplies; its items and root motion scale with it, its slot does not.
- **Hold Tags** and **Apply Effect For Duration** come off even when the action is cut short. **Push** points away from the carrying role by default. **Ragdoll** uses the Reaction Set's default ragdoll unless **Use Reaction Set Defaults** is off. **Deal Damage** plays the config's hit effects unless **Run Hit Effects** is off; Kill leaves a target with Can Be Damaged off alone.
- A placement socket the mesh lacks uses the character's position; Play Sound has no preview.
- **Role Labels** show for All Roles, the Selected Role Only or none; **Anchor Guides** draw the anchor's ring, mode and a dashed line to the role it faces.
- Move the Sync Marker on the montage, not the timeline.

</details>

<details>
<summary>Troubleshooting (Advanced)</summary>

| Issue | Fix |
| --- | --- |
| A role with no name, or two with one. | Rename it. |
| An event aimed at a missing role, outside its role's window, or of no length. | Retarget, move or lengthen it. |
| A role let go at or before it joins, or before its montage ends. | Drag the bar, or Fit Role To Content. |
| Play from past the montage's end, or Play to before Play from. | Fix resets it to 0. |
| Looping or jumping sections, or a play rate of 0 or less. | Start on a chain that ends; raise the rate. |
| A Data Driven glide past its montage's end, of 0 length, or over root motion. | Shorten it, start the montage after the slope, or Montage Driven (Fix, with a warp or approach window). |
| A Montage Driven role with no window on Warp Target Name. | Author the window. |
| An anchor role with an offset position, optional or facing itself; an anchor or Face Toward role missing; a faced role behind. | Clear it, tick Required, pick a role, or turn Formation Yaw Offset. |
| Sync with Current without a usable marker, two syncing roles, a late join or a blend in. | Fix moves the start to the marker or sets Blend In to 0. |
| An Apply Effect whose effect never ends. | A duration, or the window event. |
| A stand-in missing its asset or on the wrong kind; a preview mesh on another skeleton, an additive or multi-slot montage. | Pick the asset or kind; preview-only issues leave the game unaffected. |

</details>

---

Previous page: [Paired Actions](https://rigbak.com/docs/universal-player-combat/paired-actions). Next page: [Animation Integration](https://rigbak.com/docs/universal-player-combat/animation-integration)
