How-To: Position Pops
Goal: decide where a pop appears - over the target, under it, or somewhere else entirely.
Two independent controls do this, and it is worth keeping them apart. The target component sets the anchor point on an actor (which bone, how high). A placement decides which anchor a style uses at all, and can ignore the actor entirely in favour of a spot on the screen.
1. Move the anchor point on the actor (optional)
Without a UCrimsonCombatTextTargetComponent, pops anchor 100 cm above the actor's root. Add one to pick a socket or a different offset. A valid socket wins over the offset, and because the socket moves with the animation the offset is deliberately ignored in that case.
On your character Blueprint: Add Component -> Crimson Combat Text Target Component, then in its details set either Socket Name (for example head) or Relative Offset.
SocketName to head on a character - its pops now spawn at the head bone instead of 100 cm above the root. Clear it and they return to the offset.2. Create a placement set
A placement set is the library of named places text is allowed to appear. Right-click in the Content Browser -> Crimson -> Combat Text -> Placement Set. A new asset seeds itself with five editable built-in rows:
| Placement id | What it does |
|---|---|
CrimsonCombatText.Placement.Target | Over the target, using its target component. Identical to authoring no placement at all |
CrimsonCombatText.Placement.TargetBelow | Same anchor, offset 90 layout units down |
CrimsonCombatText.Placement.ScreenIncoming | Fixed HUD area left of center |
CrimsonCombatText.Placement.ScreenOutgoing | Fixed HUD area right of center |
CrimsonCombatText.Placement.ScreenNotification | Fixed HUD area above center, for words rather than numbers |
Assign the asset to your registry's Placement Set property. The built-in rows are a starting point, not an opinion - retune them, delete them, or add your own. Add Built-In Placements on the asset re-adds any that are missing without touching what you authored.
3. Route a style to a placement
On any Styles row in your registry, set Placement Preset to a placement id. Leave it unset and that style anchors over the target - which is why an existing project keeps working after you add a placement set.
Placement Offset on the same row nudges that style relative to others sharing the placement, in layout units. Slate's Y axis grows downward, so a positive Y reads lower on screen.
Placement: line. It shows the resolved id, or (default - over target).4. Recipe: damage over the enemy, healing under it
This is the whole reason placements route by tag. Two rows, no code:
Registry Styles row | Placement Preset |
|---|---|
Damage | CrimsonCombatText.Placement.Target |
Heal | CrimsonCombatText.Placement.TargetBelow |
Both anchor to the same point on the actor. TargetBelow simply carries a downward Screen Offset, so healing reads under the enemy while damage reads over it.
5. Follow the target, or pin to the hit
Whether text chases a moving enemy is a property of the placement, not the style: bFollowTarget on UCrimsonCombatTextPlacement_WorldActor. On, a fleeing enemy carries its numbers. Off, they stay where the hit landed, which some fast-movement games prefer for readability.
Two placement rows can point at the same class and disagree about this, so you can have damage follow while critical hits stay put.
bClampToViewportEdge on the placement to pin it to the edge of the screen instead - it handles anchors behind the camera correctly, which a plain projection cannot express.See also
- How-To: Show Pops on the HUD or a Health Bar - fixed screen areas and widget anchors.
- How-To: Write Your Own Placement - when the built-ins are not enough.
- Concept: Style Resolution, Motion & Rendering - where placement sits in the resolution order.
- Concept: Event Flow & Replication - why the event still carries a world location.