Quick Start

By the end of this page, a server-side broadcast makes a floating number pop appear over a target actor on every client - styled by your registry and recycled through the widget pool.

Prerequisites
A GameState subclass you can edit (Blueprint or C++), a server-authoritative place to report damage/heals from (e.g. a GAS AttributeSet or your damage pipeline), and at least one gameplay tag to describe the event (e.g. NumberPop.Damage).
Ships ready to run
CrimsonNumberPop includes demo content - a registry (DA_CrimsonNumberPopRegistry), a pop widget (WBP_CrimsonNumberPop), and a distance curve - and DefaultCrimsonNumberPop.ini already points Project Settings at them. So a fresh install pops numbers as soon as you wire the GameState component and broadcast (steps 5-6). Steps 2-4 show how to author and assign your own assets - skip them to try the shipped defaults first.

1. Enable the plugin

Open Edit -> Plugins, type Crimson in the search box, tick CrimsonNumberPop's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that's the entire install - you never hand-edit the .uproject or any .Build.cs.

Edit -> Plugins -> search 'Crimson' -> tick CrimsonNumberPop's Enabled checkbox -> restart the editor.

C++ projects: after enabling the plugin, add its module to your build file so your code can use its types:

csharp
// YourGame.Build.cs
PublicDependencyModuleNames.Add("CrimsonNumberPop");
Verify
CrimsonNumberPop shows as enabled in the Plugins window and the editor restarts without errors.

2. Create the style registry

The registry is a data asset that decides how each pop looks. Add FCrimsonNumberPopStyleRule entries - each pairs a FGameplayTagQuery and a priority with a FCrimsonNumberPopConfig (format string, rich-text style tags, physics, animation name) - and fill in DefaultConfig as the fallback. It is authored in the editor for both audiences; there is no C++ step.

Content Browser -> right-click -> Crimson -> Number Pop -> Style Registry. Add a rule matching your damage tag and set DefaultConfig.
Verify
The registry asset opens with at least one entry in StyleRules and a filled-in DefaultConfig - the fallback used when no rule matches.

3. Create the pop widget

Make a Blueprint subclass of UCrimsonNumberPopWidget and add two bound widgets: a Border named TextBorder and a Rich Text Block named TextBlock (both are required BindWidget bindings). That's all - the base class sets the text, drives the screen-space motion from the style's physics, fades out, and returns the widget to the pool automatically. No graph code is needed.

Content Browser -> right-click -> Crimson -> Number Pop -> Number Pop Widget. Hierarchy: a Border named TextBorder containing a Rich Text Block named TextBlock.
Rich text styles
Assign a Text Style Set DataTable to the TextBlock whose row names match the PrefixStyleTag / ValueStyleTag names in your registry configs (the default is Default). That is what colors and sizes the number.
The root widget must report a desired size
Pops are placed in an auto-sized viewport slot, so the Blueprint's root must report a real desired size - a Border, Size Box, or Overlay root (as above) all do. A Canvas Panel root reports zero desired size, and the auto-sized pop collapses to nothing.
Verify
The widget Blueprint compiles with no 'missing required widget binding' errors for TextBorder and TextBlock.

4. Point Project Settings at your assets

Open Project Settings -> Crimson -> Crimson Number Pop. These already point at the plugin's demo assets (via DefaultCrimsonNumberPop.ini), so this step is only needed to swap in your registry and widget. Both load asynchronously at startup.

Project Settings -> Crimson -> Crimson Number Pop: set Pop Registry Path and Pop Widget Class Path.
SettingValue
PopRegistryPathYour registry data asset (step 2)
PopWidgetClassPathYour widget Blueprint (step 3)
NumberFormatHow values render: CommaSeparated (default), Abbreviated, or Raw
InitialPoolSizeWidgets pre-allocated at startup (default 10)
Verify
Both paths point at a valid asset (they ship pointing at the plugin's demo assets). If you clear a path entirely, the subsystem logs an error at startup and no pops display.

5. Add the replication component to your GameState

UCrimsonNumberPopReplicationComponent is the broadcast entry point. It must live on the GameState (replicated, exists on every client) - it registers itself with each client's subsystem on BeginPlay, so there is no manual wiring.

GameState Blueprint -> Add Component -> Crimson Number Pop Replication Component.
GameState, not GameMode
The GameMode exists only on the server, so a component placed there never reaches clients. The GameState is the canonical home.
Verify
The GameState lists the component in its component tree, and your project's GameMode uses that GameState class.

6. Broadcast a pop from the server

Wherever damage or healing is applied on the server, build a FCrimsonNumberPopEvent and call Broadcast Number Pop. Set Target (the hit actor - the server resolves the pop's world location from it) and Tags (matched against your registry rules and the per-player filters). Instigator, PrefixText, and CustomText are optional.

Server-side event (e.g. after applying damage): Get Game State -> Get Component by Class (Crimson Number Pop Replication Component) -> Make CrimsonNumberPopEvent (Value, Tags, Target, Instigator) -> Broadcast Number Pop.
Authority is checked for you
BroadcastNumberPop validates HasAuthority() and ignores (with a warning) calls made on a client - safe to call from code that runs on both sides. In singleplayer and on listen servers the local player is also a client of the multicast, so this same path works everywhere.
Verify
Press Play (try Net Mode = Play As Client with 2 players): dealing damage shows a styled floating number over the target on every client, rising and fading per your registry's physics.
What's next
Give players display control (How-To: Filter Pops Per Player), place pops on a socket (How-To: Position Pops with the Target Component), replace the built-in motion with your own animation (How-To: Play a Custom Widget Animation), and save bandwidth in big worlds (How-To: Cull Pops on the Server).