01What this plugin does
When something takes damage (or gets healed) you usually want a number to pop up at that spot and float away. Impact Numbers does exactly that — and lets you style it completely: colour, font, outline, motion, formatting, sound, and more.
You do not write rendering or pooling code. You call one function with a world position and a value; the plugin spawns, animates, recycles and cleans up the visuals for you, efficiently.
It does not calculate damage. You decide how much damage a hit does (and whether it was a crit, block, miss); you pass the final number and an optional "modifier" label, and the plugin shows it in the matching style.
Promise: drop in → pick one config asset → call one function → done.
02Requirements & installation
Requirements
- Unreal Engine 5.7 (Win64).
- A project that can compile C++ (install Visual Studio 2022 with the Game development with C++ workload). Blueprint-only projects work too — see the tip below.
Install
- Copy the
ImpactNumbersfolder into your project'sPlugins/folder:<YourProject>/Plugins/ImpactNumbers/ImpactNumbers.uplugin - If your project has no
Source/folder (Blueprint-only), create any C++ class once: Tools → New C++ Class → None. This lets the editor compile the plugin. - Right-click your
.uproject→ Generate Visual Studio project files. - Open the project. If prompted to rebuild missing modules, click Yes.
- Confirm it's on: Edit → Plugins, search Impact Numbers.
GameplayTagsis a built-in engine feature — there is nothing extra to enable.
03Quick start (5 minutes)
- Create the config asset. Content Browser → Add → Miscellaneous → Data Asset → choose Impact Number Config → name it
DA_ImpactNumbers.(Optional shortcut: open the console with the
`key and runImpactNumbers.GenerateDemoConfigsto get ten ready-made configs — see Section 12.) - Select it. Edit → Project Settings → Plugins → Impact Numbers → Active Config → pick
DA_ImpactNumbers. (This is the only required setup step.) - Show a number.
Blueprint
In the Level Blueprint, off
BeginPlayadd a Set Timer by Event (0.3s, looping) and from it call Show Damage Number:- World Location = Player Pawn location +
(0,0,100) - Amount = a random number
C++
#include "ImpactNumbersLibrary.h" UImpactNumbersLibrary::ShowDamageNumber(this, GetActorLocation() + FVector(0,0,100), 123.0f); - World Location = Player Pawn location +
- Press Play. Numbers float up above the player.
04Key concepts
Three ideas explain the whole plugin:
1. One function
ShowDamageNumber(WorldContext, WorldLocation, Amount, ...). Everything after Amount is optional.
2. One config, layered overrides
A single Impact Number Config asset holds a Default Style plus a list of Modifier Overrides (one per gameplay tag, e.g. crit/heal/miss). Every style field has a small checkbox next to it ("override this field?"). Unchecked fields fall back to the layer below.
The final style for a hit is merged in this order, last one wins per field:
Default Style → Explicit Preset (optional) → Modifier Override (by tag)
The per-tag modifier override is applied last, so your project's config always has the final say over a preset passed from code.
3. Pooled & automatic
One screen overlay (or pooled world widgets) is reused for every number, capped by Max Concurrent Numbers. You never manage widgets.
05The config Data Asset
UImpactNumberConfig is the heart of the plugin. Open your DA_ImpactNumbers:
| Field | What it does |
|---|---|
| Default Style | The base look/behaviour for every number. |
| Modifier Overrides | A map of gameplay tag → style. Used when you pass that tag (e.g. ImpactNumbers.Crit). Only the fields you check override the default. |
| Max Concurrent Numbers | Hard cap on visible numbers at once. The oldest is recycled when the cap is hit. Default 128. |
| Overlay Widget Class | (Advanced) Custom screen overlay widget. Leave empty for the built-in one. |
| Entry Widget Class | (Advanced) Custom per-number widget. Leave empty for the built-in one. |
The override checkboxes
Each style field (e.g. Base Color) has a checkbox.
- Unchecked → the field is ignored at this layer and inherited from below.
- Checked → this layer sets the field.
So a Crit modifier might check only Base Color (red) and Base Font Size (48) — everything else stays as the Default Style. This is the same pattern Unreal uses for Post Process Volumes.
06Calling the function
The one function
UImpactNumbersLibrary::ShowDamageNumber(
WorldContextObject, // any object in the world (this)
WorldLocation, // FVector — where the number appears
Amount, // float — the value to show
ModifierTag, // FGameplayTag — optional style selector
Target); // AActor* — optional owner (stacking/rate-limit)
In C++ there are convenience overloads, so the minimal call is:
UImpactNumbersLibrary::ShowDamageNumber(this, Location, Amount);
UImpactNumbersLibrary::ShowDamageNumber(this, Location, Amount, MyTag);
UImpactNumbersLibrary::ShowDamageNumber(this, Location, Amount, MyTag, TargetActor);
In Blueprint, add the Show Damage Number node. World Context is supplied automatically. Modifier Tag and Target live under the node's Advanced (the small arrow at the bottom) and are optional.
With an explicit preset
If you want to pass a whole style from code (rare), use:
UImpactNumbersLibrary::ShowDamageNumberWithPreset(this, Location, Amount, Preset, Tag, Target);
Preset is an FImpactNumberStyle; its checked fields apply between the default and the modifier layer.
Where do I call it?
Wherever your game applies damage. Typical spots: AnyDamage/PointDamage events, your ApplyDamage function, an ability's "on hit", etc. Example:
void AEnemy::HandleHit(float FinalDamage, FGameplayTag HitTag, AActor* Causer)
{
Health = FMath::Max(0.f, Health - FinalDamage); // your logic
UImpactNumbersLibrary::ShowDamageNumber( // the visual
this, GetActorLocation() + FVector(0,0,90), FinalDamage, HitTag, this);
}
07Modifiers & gameplay tags
A modifier is a named variation of the look, selected by a gameplay tag.
- Create the tags. Edit → Project Settings → Project → GameplayTags → Manage Gameplay Tags → +. Suggested:
ImpactNumbers.CritImpactNumbers.HealImpactNumbers.MissImpactNumbers.Block
(You can use any names. The
ImpactNumbers.GenerateDemoConfigsconsole command creates these four for you.) - Add overrides in the config. In
DA_ImpactNumbers→ Modifier Overrides → + → set the key to a tag → check the fields you want to change. - Pass the tag when calling the function. No tag (empty) = just the Default Style.
Showing text instead of a number (MISS, BLOCK): on that modifier, check Behavior → Format → Override Text and type the word. The number is then ignored for that modifier.
Number + label (e.g. 250 Critical!): use Prefix or Suffix instead of Override Text.
08Per-enemy configs
Want different enemies to show different number styles without changing your calling code? Use the component:
- On the enemy actor/Blueprint: Add Component → Impact Numbers Config.
- Set its Config to a dedicated
UImpactNumberConfigfor that enemy. - Pass that enemy as the Target in
ShowDamageNumber(you usually already do).
The plugin reads the component from the Target and uses its config to resolve the style. Enemies without the component use the global config from Project Settings. The shared overlay, pool and pool cap stay global — only the look/behaviour changes per enemy.
09Full parameter reference
All fields are optional via their override checkbox. Fields are grouped under the Default Style (and each modifier) in the details panel.
Render space
| Field | Meaning |
|---|---|
| Space | Screen Space (2D overlay, projected from the world point) or World Space (a widget living in the scene). Per preset, mixable per modifier. |
World Space only
| Field | Meaning |
|---|---|
| Face Camera | Billboard the number to always face the camera. |
| Distance Scale Curve | Curve: camera distance (X) → scale multiplier (Y). |
| Min/Max Screen Size | Clamp apparent size as a fraction of viewport height (0 = no clamp). |
| Occlusion Test | Hide while world geometry blocks the line of sight. |
Screen Space only
| Field | Meaning |
|---|---|
| Clamp To Screen Edges | Keep the number inside the viewport. |
| Screen Anchor Offset | Pixel offset added to the projected position (e.g. lift above the head). |
Value / format (Behavior → Format)
| Field | Meaning |
|---|---|
| Fractional Digits | Decimal places (e.g. 2 → 12.34). |
| Use Thousands Separator | Group digits: 12,345. |
| Rounding | None / Nearest / Floor / Ceil. |
| Abbreviation | None or Short (1.2K, 3.4M, 5.6B). |
| Sign Mode | Auto (− only), Always (+/−), Never (absolute). |
| Prefix / Suffix | Text before/after the number. |
| Override Text | If set, shown instead of the number (e.g. MISS). |
| Count Up | Animate the displayed value from 0 to Amount over Count Up Duration seconds. |
| Count Up Duration | Seconds the count-up animation takes. Should be shorter than Lifetime. |
Icon (Style → Icon)
| Field | Meaning |
|---|---|
| Icon | Optional texture displayed next to the number. Null = no icon. |
| Icon Position | Left (before the text) or Right (after the text). |
| Icon Size | Display size in pixels (width × height). |
Follow target (Behavior → Follow)
| Field | Meaning |
|---|---|
| Follow Target | When enabled and a Target actor is passed, the number's render position tracks the target each frame. Motion (FloatUp, Arc, etc.) plays in target-local space so the arc always floats above the target even as it moves. |
Typography
| Field | Meaning |
|---|---|
| Font | Font family/typeface (FSlateFontInfo). Leave empty to use the engine default Roboto. |
| Base Font Size | Size in points before any amount scaling. |
| Size By Amount Curve | Curve: hit amount (X) → font-size multiplier (Y). |
| Outline | Glyph outline (size + colour). |
| Drop Shadow + Shadow Offset/Color | Soft shadow behind the text. |
| Tracking | Extra letter spacing. |
| Font Material | Optional material on the glyphs. |
Colour
| Field | Meaning |
|---|---|
| Base Color | The base text colour (multiplied by the curves below). |
| Color Over Life Curve | Curve: normalised lifetime 0..1 (X) → RGBA. |
| Color By Amount Curve | Curve: hit amount (X) → RGBA. |
Animation
| Field | Meaning |
|---|---|
| Lifetime | Seconds the number is visible. |
| Start Delay | Seconds before it appears/animates. |
| Scale Curve | Curve: lifetime 0..1 (X) → scale multiplier (Y). |
| Opacity Curve | Curve: lifetime 0..1 (X) → opacity 0..1 (Y). If unset, it fades over the last 20% automatically. |
Motion
| Field | Meaning |
|---|---|
| Motion Type | Float Up, Arc, Scatter, Fountain, Hover, Fall. |
| Initial Speed | Launch speed. |
| Initial Direction | Launch direction (used by Arc). |
| Direction Spread | Random cone half-angle (degrees) per spawn. |
| Gravity | Downward acceleration. |
| Horizontal Drift | Constant sideways velocity. |
| Wobble Amplitude / Frequency | Sine sway. |
| Rotation Rate | 2D spin (degrees/sec). |
| Max Travel Distance | Stop moving after this distance (0 = unlimited). |
Spawn placement (Motion → Spawn)
| Field | Meaning |
|---|---|
| World Offset | Constant offset from the hit location. |
| Spawn Jitter | Random offset radius to de-stack overlapping hits. |
| Spread Radius | Initial radial scatter from the spawn point. |
Stacking (Behavior → Stacking)
| Field | Meaning |
|---|---|
| Enable Stacking | Merge rapid hits on the same Target into one number. |
| Stacking Window | Time window (seconds) for merging. |
| Sum Stacked Values | Add amounts (true) or keep the first and only count (false). |
| Stack Multiplier Format | Suffix format, {0} = hit count (e.g. x{0}). |
| Anti Overlap Offset | Vertical stagger (pixels) across concurrent numbers. |
Limits / performance (Behavior → Limits)
| Field | Meaning |
|---|---|
| Culling Distance | Skip spawning beyond this camera distance (0 = off). |
| Skip When Off Screen | Skip spawning if the point isn't on screen. |
| Rate Limit Per Target | Max numbers/sec per Target (0 = unlimited). |
| Z Order | Draw order among screen numbers. |
Audio (Behavior → Audio)
| Field | Meaning |
|---|---|
| Sound | Optional sound played on spawn. |
| Pitch Variation | Random ± pitch offset. |
| Volume Multiplier | Spawn sound volume. |
10Working with curves
Several of the best-looking features are driven by Curve assets. Two types:
- Curve Float — a single value over an input (used for Scale, Opacity, Size By Amount, Distance Scale).
- Curve Linear Color — an RGBA colour over an input (used for Color Over Life, Color By Amount).
Create one: Content Browser → Add → Miscellaneous → Curve → choose CurveFloat or CurveLinearColor. Double-click to edit; right-click in the graph to add keys.
What the X axis means:
- Scale Curve / Opacity Curve / Color Over Life Curve → X is normalised lifetime from
0(spawn) to1(death). - Size By Amount / Color By Amount → X is the damage amount you pass.
- Distance Scale Curve → X is the camera distance in world units.
Example — a satisfying "pop": a Scale Curve with keys (0, 0.3) → (0.12, 1.25) → (0.25, 1.0) → (1.0, 1.0) grows fast, slightly overshoots, then settles.
The advanced demo command (
ImpactNumbers.GenerateAdvancedDemoConfigs) creates reusable example curves namedC_IN_PopScale,C_IN_FadeInOut,C_IN_LifeGradient,C_IN_AmountColor,C_IN_AmountSize,C_IN_DistanceScale.
11Use cases & recipes
Each recipe is a set of fields to check on a Default Style or a modifier.
Basic damage
Default Style: Base Color white, Base Font Size 28, Motion Type Float Up, Initial Speed 120, Lifetime 1.0.
Critical hit
Modifier ImpactNumbers.Crit: Base Color gold, Base Font Size 48–56, Motion Type Fountain, Suffix !, Outline on. (Your code multiplies the damage and passes the Crit tag.)
Healing
Modifier ImpactNumbers.Heal: Base Color green, Sign Mode Always (+), or Prefix +.
Miss / Block
Modifiers with Override Text MISS / BLOCK, grey/blue colour. (Your code sets damage to 0 / reduced and passes the tag.)
Damage over time (poison/burn)
Motion Type Fall, small Base Font Size, short Lifetime, green colour, optional Start Delay to stagger ticks.
MMO-style big numbers
Abbreviation Short (1.2K), Size By Amount Curve so big hits are physically bigger, Color By Amount Curve white→red.
Bullet-hell / many hits
Enable Stacking with a small window and an Anti Overlap Offset; set a sensible Rate Limit Per Target and a lower Max Concurrent Numbers.
3D world labels (e.g. boss)
Space World, Face Camera on, Distance Scale Curve, Occlusion Test on so numbers hide behind walls.
Arcade burst
Motion Type Scatter, Direction Spread ~75°, Gravity, Spread Radius, bright colour + outline.
11aAdvanced features
Icons / sprites next to the number
Any number can show a texture icon to the left or right of the text.
- In your config (Default Style or a modifier), expand Style → Icon.
- Set Icon to a texture.
- Set Icon Position (
Left/Right) and Icon Size in pixels.
The built-in default widget contains left and right slots that the plugin shows and hides automatically. Blueprint widget subclasses bind LeftIconImage / RightIconImage via BindWidgetOptional for custom layouts.
Count-Up number animation
Make the displayed value animate from 0 to the final amount when the number first appears. In Behavior → Format: enable Count Up and set Count Up Duration (e.g. 0.5 seconds).
The value counts linearly from 0 to Amount over the duration, then stays fixed. Works with stacking — a new merge resets the count-up from 0 to the combined total.
Follow moving target
Keep the number floating above a moving actor (e.g. a running enemy). In Behavior → Follow, enable Follow Target, then always pass the target actor in the Target parameter of ShowDamageNumber.
The motion arc (FloatUp, Arc, etc.) plays in the target's local frame so the number follows the target while still floating away naturally.
Multiplayer helper (replicated component)
For a number visible to all connected clients (not just the local player):
- Add the Impact Numbers Replication Component to your replicated actor (the owning actor must have
bReplicates = true). - Call
ShowNumberReplicated(WorldLocation, Amount, ModifierTag)from your server-side damage code instead ofShowDamageNumber.
The component sends a Server RPC → NetMulticast automatically. Each client's local subsystem then spawns the visual using its own viewport and pooled widgets, so there is no network traffic beyond the initial RPC.
// C++ — on the server, inside ApplyDamage:
if (UImpactNumbersReplicationComponent* Comp =
Enemy->FindComponentByClass<UImpactNumbersReplicationComponent>())
{
Comp->ShowNumberReplicated(HitLocation, FinalDamage, CritTag);
}
Blueprint events (OnSpawned / OnExpired)
Bind to the subsystem delegates in Blueprint or C++ to react when any number spawns or expires.
Blueprint: call Get Impact Numbers Subsystem (library node, WorldContextObject auto-filled), then drag out and select Assign On Number Spawned or Assign On Number Expired.
// C++
if (UImpactNumbersSubsystem* Sub = UImpactNumbersSubsystem::Get(this))
{
Sub->OnNumberSpawned.AddDynamic(this, &AMyActor::HandleNumberSpawned);
Sub->OnNumberExpired.AddDynamic(this, &AMyActor::HandleNumberExpired);
}
OnNumberSpawned delivers (FVector WorldLocation, float Amount, FGameplayTag ModifierTag). OnNumberExpired delivers (FVector LastLocation, float Amount).
Per-call overrides (colour / text / icon)
Override the colour, text, or icon for a single call without touching the config or adding a named modifier tag.
// C++ — tint one number red without changing the config:
FImpactNumberCallOverrides Overrides;
Overrides.bOverride_Color = true;
Overrides.Color = FLinearColor::Red;
UImpactNumbersLibrary::ShowDamageNumberEx(this, Location, Damage, Overrides, Tag, Target);
Blueprint: use the Show Damage Number Ex node. The Overrides pin expands to bOverride_Color / Color, bOverride_Text / Text, and bOverride_Icon / Icon. Only enabled overrides are applied; the rest falls back to the config.
Resolution order: Config default → Overrides → ModifierTag (tag still wins last).
Combinable modifier tags (TagContainer)
Apply multiple modifier overrides at once by passing a FGameplayTagContainer instead of a single tag. Each tag's override is applied in iteration order; later tags win per field.
FGameplayTagContainer Tags;
Tags.AddTag(FGameplayTag::RequestGameplayTag("ImpactNumbers.Crit"));
Tags.AddTag(FGameplayTag::RequestGameplayTag("ImpactNumbers.Elemental"));
UImpactNumbersLibrary::ShowDamageNumberWithTags(this, Location, Damage, Tags, Target);
Blueprint: use the Show Damage Number With Tags node. The Modifier Tags pin accepts a Make GameplayTagContainer node.
11bGAS Bridge (Gameplay Ability System)
The optional ImpactNumbersGAS module wires your existing GAS setup to Impact Numbers with zero ability or attribute-set code. Attach one component, configure a few fields, and numbers appear automatically whenever GAS modifies your attributes or applies a GameplayEffect.
This module is entirely optional. The core
ImpactNumbersmodule has no GAS dependency. AddImpactNumbersGASto your project's module list only when you use GAS.
Setup
- Enable the module. In your game project's
Build.cs, add"ImpactNumbersGAS"toPublicDependencyModuleNames. The engine'sGameplayAbilitiesplugin must also be enabled. - Add the component. Select the actor that owns the
UAbilitySystemComponent(or implementsIAbilitySystemInterface), click Add Component, and choose Impact Numbers GAS. - Pick the integration mode under Impact Numbers|GAS → Integration Mode.
- Configure attributes / tag mapping (see below).
- Play. Numbers appear automatically from that point.
If the ASC lives on a different actor (e.g. PlayerState), assign it to Explicit Ability System Component. For actors that acquire their ASC after BeginPlay (e.g. possessed AI), call
BindToAbilitySystem(ASC)from Blueprint or C++ once the ASC is ready.
Integration modes
Attribute Change mode (recommended default)
Binds GetGameplayAttributeValueChangeDelegate per watched attribute. Fires whenever an attribute changes — predicted client-side changes included. Configure Watched Attributes:
| Field | Meaning |
|---|---|
| Attribute | The FGameplayAttribute to watch (e.g. AMyAttributeSet::GetHealthAttribute()). |
| Min Display Amount | Minimum absolute delta to show a number. |
| Treat Decrease As Damage | Show decreases as damage (positive number) and, when Show Heal is also on, increases as healing. |
| Show Heal | Also show a number when the attribute goes up (uses Default Heal Modifier Tag). |
| Actor Location Offset | World-space offset above the actor when no hit result is available (default (0,0,90)). |
Effect Applied mode
Binds OnGameplayEffectAppliedDelegateToSelf. Richer than attribute change: reads the hit location from the GE effect context (if set by the ability) and maps GE tags to Impact Numbers modifier tags via Tag Mapping (a TMap<FGameplayTag, FGameplayTag>):
- Key: a GAS tag on the applied GE (asset or granted tag), e.g.
GE.Damage.Crit. - Value: the Impact Numbers modifier tag to use, e.g.
ImpactNumbers.Crit.
First match wins. If no entry matches, Default Damage Modifier Tag is used.
For the hit location to come from the GE context, the ability must call
EffectContextHandle.AddHitResult(HitResult)when building theFGameplayEffectSpecHandle.
Common properties
| Property | Meaning |
|---|---|
| Default Damage Modifier Tag | Fallback modifier tag for damage numbers when no mapping matches. |
| Default Heal Modifier Tag | Modifier tag for heal/attribute-gain numbers. |
| Global Min Display Amount | Minimum absolute value to show. Overrides per-attribute minimum when larger. |
| Only Show On Locally Controlled Owner | Suppress numbers when the owning actor is a simulated proxy. Useful with replicated attributes to avoid double-spawning on non-owning clients. |
| Explicit Ability System Component | Set when the ASC lives on a different actor (e.g. PlayerState). Auto-discovered otherwise. |
Runtime API
// Called automatically from BeginPlay. Re-call after possession with a new ASC.
GASComp->BindToAbilitySystem(NewPawn->GetAbilitySystemComponent());
// Clean up before unpossession / actor destruction.
GASComp->UnbindFromAbilitySystem();
// Query.
UAbilitySystemComponent* BoundASC = GASComp->GetBoundAbilitySystemComponent();
All three functions are also BlueprintCallable.
Multiplayer considerations
| Scenario | Recommended approach |
|---|---|
| Listen server / single-player | Works as-is. Delegates fire on the local machine. |
| Dedicated server + replicated attributes | Use AttributeChange mode on the owning client. GAS replicates attribute changes; each client's component fires locally with no extra RPC. |
| Dedicated server + authoritative-only attributes | Combine with UImpactNumbersReplicationComponent. Use ShowNumberReplicated from server damage code; do not also use the GAS component for the same hit. |
| Simulated proxies (enemies) | Keep Only Show On Locally Controlled Owner = false (default) so each client sees numbers on replicated enemy attributes. Set true to suppress ghost numbers from prediction rollbacks. |
12Ready-made demo configs
Two editor console commands generate complete example configs under /ImpactNumbers/Data (enable Show Plugin Content in the Content Browser settings to see them). Open the console with the ` key.
ImpactNumbers.GenerateDemoConfigs
Creates 10 straightforward presets (classic, gold crit, green heal, abbreviation, thousands separator, outlined bold, world floaty, scatter arcade, MISS/BLOCK status text, minimal fast) and registers the demo tags.
ImpactNumbers.GenerateAdvancedDemoConfigs
Creates 10 advanced, curve-driven presets (pop scale, colour over life, colour by amount, size by amount, spin arc, stacking, DoT fall, world distance + occlusion, performance guardrails, and a combined showpiece) plus their curve assets.
Pick any generated DA_IN_Demo_* as your Active Config to try it.
13Custom widgets
The default widgets build themselves, so you usually do nothing. To use your own design:
- Create a Blueprint subclass of ImpactNumberTextWidget. Add a Text Block named exactly
TextBlock. Style it freely (you can add backgrounds, icons, etc. around it). - (Optional) Blueprint subclass of ImpactNumbersOverlayWidget with a Canvas Panel named
RootCanvas. - In your config under Widgets, assign Entry Widget Class / Overlay Widget Class.
The exact widget names matter — that's how the engine binds your designer elements to the plugin. Without them, the built-in fallback is used.
14Performance guide
Impact Numbers is built to be cheap, but you control the budget:
- Max Concurrent Numbers (config) — the hard cap. Lower it for mobile / busy scenes. The oldest number is recycled when exceeded.
- Rate Limit Per Target — prevents a single fast-hitting source from flooding.
- Culling Distance / Skip When Off Screen — don't spawn what the player can't see.
- Stacking — merges bursts into one number, drastically cutting count.
- Prefer Screen Space for huge counts (one overlay) over many world widgets.
Everything updates from a single subsystem tick — there is no per-number Tick and no actor/widget is spawned per hit.
15Editor validation
When you save a config, the plugin checks it and shows messages in the Message Log / Data Validation:
- Error: an empty/invalid gameplay tag key in Modifier Overrides (it would never match).
- Warnings: invisibly short Lifetime, huge Base Font Size, World Space with no Distance Scale Curve / size clamps, Abbreviation cancelling Fractional Digits, Stacking enabled with a zero window.
You can also run Tools → Validate Assets / Validate Data on the folder.
16Troubleshooting & FAQ
| Symptom | Cause / fix |
|---|---|
| Nothing appears | No Active Config in Project Settings, or you're on a dedicated server (no local player). |
| A field has no effect | Its override checkbox is unchecked, so it inherits from the layer below. |
| A modifier does nothing | The tag you pass doesn't exactly match a key in Modifier Overrides. |
| Text uses the default font | No font assigned; set one under Typography → Font or accept Roboto. |
| World-space text unreadable far away | Add a Distance Scale Curve or set Min/Max Screen Size. |
| Numbers overlap on rapid hits | Enable Stacking and/or set Anti Overlap Offset / Spawn Jitter. |
| Too many numbers / hitching | Lower Max Concurrent Numbers, add Rate Limit Per Target. |
| Can't see generated assets | Enable Show Plugin Content in the Content Browser settings. |
FAQ
- Does it apply damage? No. You compute damage; you pass the final number.
- Networking — only one client sees the number? Use
UImpactNumbersReplicationComponent::ShowNumberReplicatedon a replicated actor. See Advanced features. - Can I mix screen and world space? Yes — per preset and per modifier.
- Blueprint only? Yes for usage; the project must still be able to compile the plugin's C++.
- Count-up doesn't animate? Check that Count Up Duration is shorter than Lifetime and the override checkbox is enabled.
- Follow target lags behind? The follow tracks the actor's root position. For actors with a complex bone hierarchy, compute a socket location before calling
ShowDamageNumber.
17API reference
Function library — UImpactNumbersLibrary
ShowDamageNumber(WorldContextObject, WorldLocation, Amount, ModifierTag, Target)— the one function.ShowDamageNumberWithPreset(WorldContextObject, WorldLocation, Amount, Preset, ModifierTag, Target)— explicit style preset.ShowDamageNumberEx(WorldContextObject, WorldLocation, Amount, Overrides, ModifierTag, Target)— per-call colour/text/icon overrides without a named modifier.ShowDamageNumberWithTags(WorldContextObject, WorldLocation, Amount, ModifierTags, Target)— stackedFGameplayTagContaineroverrides.GetImpactNumbersSubsystem(WorldContextObject)→UImpactNumbersSubsystem*— access delegates.- C++ overloads omit trailing
Target/ModifierTag.
Config — UImpactNumberConfig (Data Asset)
DefaultStyle,ModifierOverrides,MaxConcurrentNumbers,OverlayWidgetClass,EntryWidgetClass.ResolveStyle(ModifierTag, ExplicitPreset)— single-tag resolution.ResolveStyleForTags(ModifierTags, ExplicitPreset)— multi-tag stacked resolution.
Settings — UImpactNumbersSettings (Project Settings → Plugins)
ActiveConfig.
Components
UImpactNumbersConfigComponent— per-actor style config override.UImpactNumbersReplicationComponent— multiplayer helper; callShowNumberReplicatedfor all-client visibility.UImpactNumbersGASComponent(ImpactNumbersGAS module) — GAS bridge; wires attribute-change or GE-applied delegates toShowDamageNumberautomatically. Properties:IntegrationMode,WatchedAttributes,TagMapping,DefaultDamageModifierTag,DefaultHealModifierTag,GlobalMinDisplayAmount,bOnlyShowOnLocallyControlledOwner,ExplicitAbilitySystemComponent. Methods:BindToAbilitySystem,UnbindFromAbilitySystem,GetBoundAbilitySystemComponent.
GAS Types (ImpactNumbersGAS module)
EImpactNumberGASMode:AttributeChange,EffectAppliedFImpactNumberGASAttributeConfig— per-attribute config for AttributeChange mode (Attribute, MinDisplayAmount, bTreatDecreaseAsDamage, bShowHeal, ActorLocationOffset).
Subsystem — UImpactNumbersSubsystem (UWorldSubsystem)
- Owns pooling, both render spaces, the update loop and projection. You normally don't call it directly; the library routes through it.
OnNumberSpawned(FOnImpactNumberSpawned) — fired when any number spawns.OnNumberExpired(FOnImpactNumberExpired) — fired when any number's lifetime elapses.
Structs
FImpactNumberStyle(umbrella) → containsFImpactNumberMotionandFImpactNumberBehavior. Every field has abOverride_toggle.FImpactNumberCallOverrides— lightweight per-call overrides (colour, text, icon).
Enums
EImpactNumberSpace:ScreenSpace,WorldSpaceEImpactNumberMotionType:FloatUp,Arc,Scatter,Fountain,Hover,FallEImpactNumberRounding:None,Nearest,Floor,CeilEImpactNumberAbbreviation:None,ShortEImpactNumberSignMode:Auto,Always,NeverEImpactNumberIconPosition:Left,Right
Editor console commands
ImpactNumbers.GenerateDemoConfigsImpactNumbers.GenerateAdvancedDemoConfigs
18Glossary (for beginners)
- Data Asset — a content file that just holds settings (no logic). Here, your config.
- Project Settings — the project-wide options window (Edit → Project Settings).
- Gameplay Tag — a hierarchical label like
ImpactNumbers.Critused to pick a modifier. - World Location — a 3D position in the level (
FVector). - World Context — any object that knows which game world it's in; in Blueprint it's filled in automatically, in C++ pass
this. - Blueprint node — a visual function block; Show Damage Number is the one you use.
- Subsystem — an engine-managed singleton that lives with the game world.
- Curve asset — a content file describing a value (or colour) over an input, edited in a graph.
- Pooling — reusing a fixed set of objects instead of creating/destroying them constantly (faster).
- GAS — Unreal's Gameplay Ability System, a framework for abilities, attributes (e.g. Health), and gameplay effects.
- Attribute — a GAS value like Health or Mana, held in an Attribute Set and changed via Gameplay Effects.
- GameplayEffect (GE) — a GAS data object that modifies attributes (e.g. "deal 30 damage").
- Delegate — an event you can bind a function to; fires when something happens (e.g. a number spawns).
19Version & maintenance
- Plugin version: 1.0 — Engine: Unreal Engine 5.7.
For support: seoulmediastudio.com/kontakt
We reply within 48 hours — Deutsch & English.