Floating damage numbers done right — pooled, tag-styled, and replicated for multiplayer.

Free · Gameplay · Unreal Engine 5

Damage numbers that pop — without the frame drops.

A floating number-pop system for damage, healing, and custom values. The server broadcasts one event; every client pulls a pooled widget, picks a style from a tag-driven registry, applies its own display filters, and plays the animation — so combat reads clearly on every machine and never hitches under a flurry of hits.

Video coming soon

Why CrimsonNumberPop

Everything you need to show numbers above actors — pooled for performance, styled by tags, and correct in multiplayer.

Tag-driven style registry

A UCrimsonNumberPopRegistry data asset pairs a FGameplayTagQuery with a priority and a style config. The highest-priority matching rule wins, with a DefaultConfig fallback — so crits, heals, and damage types each get their own look without a line of branching code.

Pooled widgets, no hitches

The subsystem async-loads and pre-warms a configurable pool at startup, then recycles widgets as their animations finish. New creations are capped to 5 per frame when the pool runs dry, so a burst of hits never spikes the frame time.

Multiplayer by design

A UCrimsonNumberPopReplicationComponent on your GameState multicasts each event to all clients over a NetMulticast Unreliable RPC. WorldLocation is resolved server-side, so clients render without re-deriving anything.

Per-player display filters

An optional UCrimsonNumberPopPlayerSettings component lets each player choose what they see: own, ally, enemy, and incoming damage, heals, a crits-only mode, and a max-distance cap — with a delegate that bridges to your team system.

Formatting & motion presets

Pick a number format — CommaSeparated, Abbreviated (1.1K, 2.3M), or Raw — plus a global widget scale. Per-style physics (duration, spread, vertical boost, gravity) gives crits a floating arc and heals a gentle rise.

Blueprint-authored visuals

Subclass the abstract UCrimsonNumberPopWidget, bind a URichTextBlock, and implement StartPop to play your own UMG animation. The format string drives rich-text styling per token — all authored in Blueprint.

A closer look

One server event, every client renders locally

On the server, build a FCrimsonNumberPopEvent and call BroadcastNumberPop — from an AttributeSet's PostGameplayEffectExecute, an ability, or Blueprint. It validates authority, resolves the spawn location from the target's UCrimsonNumberPopTargetComponent, and multicasts. Each client's subsystem takes it from there.

Video coming soon

Styled by tags, not branches

Incoming event tags are matched against the registry's rules; the highest-priority match supplies the format string, rich-text style, physics, and animation name. Add a new pop type by adding a rule — crits shoot up and float, normal hits arc down, heals drift upward — no code changes.

Video coming soon

Every player sees their own fight

Drop a UCrimsonNumberPopPlayerSettings component on the local PlayerController and each player tunes their own clutter: hide enemy damage, show only crits, cap by distance — while incoming damage to you always shows. Bind IsActorFriendly to your team system and ally-vs-enemy filtering just works.

Video coming soon

Technical details

Engine
UE 5.8
Platforms
Windows, Mac, Linux
Blueprint-ready
Yes
C++ required
No
Network replicated
Yes
Dependencies
UMG, GameplayTags, GameplayAbilities, Slate, DeveloperSettings
Last updated
June 2026

Frequently asked questions

Do I need C++ to use it?
No. The registry data asset, widget Blueprint, project settings, target component, and per-player filters are all Blueprint-accessible, and BroadcastNumberPop is BlueprintCallable. The C++ snippets in the docs show the common GAS integration point, but they're optional — C++ is there if you want it.
Does it depend on other Crimson plugins?
No. CrimsonNumberPop has no Crimson plugin dependencies — it stands alone on stock engine modules (UMG, GameplayTags, GameplayAbilities, Slate, DeveloperSettings). It pairs naturally with the rest of the suite but requires none of it.
Does it work in multiplayer?
Yes — that's the design. A replication component on your GameState multicasts each event to all clients via an unreliable RPC, with the spawn location resolved server-side; each client then applies its own filters and renders locally. For singleplayer or offline use, call RequestNumberPop on the subsystem directly.
Will hundreds of numbers tank my framerate?
No. Widgets are pooled and recycled, the pool is pre-warmed asynchronously at startup, and new widget creation is capped to 5 per frame to avoid spikes. The subsystem also isn't created on dedicated servers or in editor preview worlds, so there's no wasted work where pops never appear.
Is it free?
Yes. CrimsonNumberPop is free on Fab — drop it in and start showing numbers.

Make every hit land — on screen

CrimsonNumberPop is free and quick to wire up: enable the plugin, build a style registry, add the component to your GameState, and broadcast from the server. The Quick Start walks through it end to end.