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.
NumberPop.Damage).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.
C++ projects: after enabling the plugin, add its module to your build file so your code can use its types:
// YourGame.Build.csPublicDependencyModuleNames.Add("CrimsonNumberPop");
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.
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.
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.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.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.
| Setting | Value |
|---|---|
PopRegistryPath | Your registry data asset (step 2) |
PopWidgetClassPath | Your widget Blueprint (step 3) |
NumberFormat | How values render: CommaSeparated (default), Abbreviated, or Raw |
InitialPoolSize | Widgets pre-allocated at startup (default 10) |
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.
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.
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.