/unreal-niagara
Create and control VFX in Unreal Engine 5 with Niagara: systems and emitters, modules and the spawn/update stages, exposed User parameters, and spawning or driving effects from Blueprints or C++. Use when building particle effects, NS_/NE_ assets, spawning a Niagara system at
$ npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill unreal-niagara --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/unreal-niagara
Context preview
The summary Claude sees to decide when to auto-load this skill.
Create and control VFX in Unreal Engine 5 with Niagara: systems and emitters, modules and the spawn/update stages, exposed User parameters, and spawning or driving effects from Blueprints or C++. Use when building particle effects, NS_/NE_ assets, spawning a Niagara system at
SKILL.md
unreal-niagara.SKILL.mdname: unreal-niagara
description: >
Create and control VFX in Unreal Engine 5 with Niagara: systems and emitters, modules and
the spawn/update stages, exposed User parameters, and spawning or driving effects from
Blueprints or C++. Use when building particle effects, NS_/NE_ assets, spawning a Niagara
system at runtime, setting User parameters, or when the user mentions Niagara, VFX, or a
particle system in Unreal.
Unreal Niagara VFX
Build and control real-time visual effects in UE5 with Niagara: understand the System/Emitter/Module hierarchy, expose parameters you can drive from gameplay, and spawn effects at runtime. Targets **UE 5.8**. (Niagara replaces the legacy Cascade system.)
When to use
- Use when creating a Niagara System (`NS_`) and Emitters (`NE_`), wiring modules in the
spawn/update stages, exposing **User** parameters to gameplay, or spawning/driving an effect (impact, muzzle flash, fire, magic) from Blueprint or C++.
- Use when the project has Niagara `NS_`/`NE_` assets or references `UNiagaraComponent`.
**When *not* to use:** material/shader authoring (the look of a surface, not particles) is a separate topic; `shader-programming` covers cross-engine shader concepts. Audio for the effect → `audio-design`.
Core workflow
1. **Understand the hierarchy.** A **Niagara System** (`NS_`) is the effect you place/spawn; it contains one or more **Emitters** (`NE_`, often emitter *templates*). Each emitter runs in stages: **Emitter Spawn/Update**, **Particle Spawn/Update**, optional **Event Handler**, and **Render**. 2. **Build behaviour from Modules**, which execute top-to-bottom in each stage (Spawn Rate, Add Velocity, Gravity Force, Color over Life, etc.). Order matters — a later module reads the values earlier ones wrote. 3. **Know the parameter namespaces:** `System`, `Emitter`, `Particle`, and **`User`**. Only **User-namespace** parameters are exposed to and settable from Blueprint/C++; the others are internal to the simulation. 4. **Spawn at runtime** with `UNiagaraFunctionLibrary::SpawnSystemAtLocation` (world position) or `SpawnSystemAttached` (follows a component/socket), which return a `UNiagaraComponent`. 5. **Drive the effect** by setting its User parameters on the returned component (color, spawn rate, a target position) and `Activate`/`Deactivate` it. 6. **Verify** in the Niagara editor preview and in-level; check bounds (especially GPU emitters), and confirm the effect culls/destroys correctly.
Patterns
1. Spawn a one-shot effect at a world location (C++)
#include "NiagaraFunctionLibrary.h"
#include "NiagaraComponent.h"
// ImpactSystem is a UPROPERTY(EditAnywhere) TObjectPtr<UNiagaraSystem>.
void AProjectile::SpawnImpact(const FVector& Location, const FRotator& Rotation)
{
UNiagaraComponent* FX = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
GetWorld(), ImpactSystem, Location, Rotation);
// FX auto-destroys when finished for a one-shot (system marked non-looping).
}2. Spawn attached to a socket (muzzle flash that follows the gun)
UNiagaraComponent* Muzzle = UNiagaraFunctionLibrary::SpawnSystemAttached(
MuzzleSystem, WeaponMesh, FName("MuzzleSocket"),
FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::SnapToTarget, /*bAutoDestroy*/ true);3. Drive an exposed User parameter at runtime
// Only User-namespace parameters can be set from gameplay. Names match the User parameter.
if (UNiagaraComponent* Fire = UNiagaraFunctionLibrary::SpawnSystemAttached(
FireSystem, RootComponent, NAME_None, FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::KeepRelativeOffset, /*bAutoDestroy*/ false))
{
Fire->SetVariableFloat(FName("SpawnRate"), 250.f); // User.SpawnRate
Fire->SetVariableLinearColor(FName("FireColor"), FLinearColor::Red);
}4. Blueprint equivalent (node flow)
Spawn System at Location (System = NS_Impact, Location, Rotation) -> returns Niagara Component
On the returned component:
Set Niagara Variable (Float) Name="SpawnRate" Value=250
Set Niagara Variable (LinearColor) Name="FireColor" Value=Red
Pitfalls
- **Trying to set a System/Emitter/Particle parameter from gameplay** — it won't take. Expose
it in the **User** namespace; only User parameters are settable via the component.
- **Using Cascade tutorials** — Cascade is legacy/deprecated. Niagara is the current system; the
emitter/module workflow differs.
- **Effect disappears or doesn't cull right** — fixed/incorrect bounds, especially for **GPU
Compute** emitters which need explicit Fixed Bounds. Set bounds on the emitter/system.
- **Looping effect never stops** — spawned with `bAutoDestroy = false` and never
`Deactivate()`d; manage the returned component's lifetime, or mark the system non-looping for one-shots.
- **GPU sim can't drive gameplay** — GPU particle data isn't readily read back to the CPU;
collision/events that gameplay must react to should use CPU emitters (or Niagara → gameplay via the data interface), not GPU.
- **Module order bugs** — a Force/Velocity module placed before the one that initializes the
value reads zero. Mind the top-to-bottom stack order.
References
- Primary docs: "Overview of Niagara Effects"
(`https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-niagara-effects-for-unreal-engine`) and the `UNiagaraFunctionLibrary` / `UNiagaraComponent` API. Add the `Niagara` module to `*.Build.cs` for C++ access.
Related skills
- `shader-programming` — material/shader concepts for particle materials.
- `unreal-cpp-gameplay` — spawning effects from gameplay code and module setup.
- `unreal-blueprints` — triggering effects from visual scripts.
Read more
name: unreal-niagara description: > Create and control VFX in Unreal Engine 5 with Niagara: systems and emitters, modules and the spawn/update stages, exposed User parameters, and spawning or driving effects from Blueprints or C++. Use when building particle effects, NS_/NE_ assets, spawning a Niagara system at runtime, setting User parameters, or when the user mentions Niagara, VFX, or a particle system in Unreal.
Unreal Niagara VFX
Build and control real-time visual effects in UE5 with Niagara: understand the System/Emitter/Module hierarchy, expose parameters you can drive from gameplay, and spawn effects at runtime. Targets **UE 5.8**. (Niagara replaces the legacy Cascade system.)
When to use
- Use when creating a Niagara System (`NS_`) and Emitters (`NE_`), wiring modules in the
spawn/update stages, exposing **User** parameters to gameplay, or spawning/driving an effect (impact, muzzle flash, fire, magic) from Blueprint or C++.
- Use when the project has Niagara `NS_`/`NE_` assets or references `UNiagaraComponent`.
**When *not* to use:** material/shader authoring (the look of a surface, not particles) is a separate topic; `shader-programming` covers cross-engine shader concepts. Audio for the effect → `audio-design`.
Core workflow
1. **Understand the hierarchy.** A **Niagara System** (`NS_`) is the effect you place/spawn; it contains one or more **Emitters** (`NE_`, often emitter *templates*). Each emitter runs in stages: **Emitter Spawn/Update**, **Particle Spawn/Update**, optional **Event Handler**, and **Render**. 2. **Build behaviour from Modules**, which execute top-to-bottom in each stage (Spawn Rate, Add Velocity, Gravity Force, Color over Life, etc.). Order matters — a later module reads the values earlier ones wrote. 3. **Know the parameter namespaces:** `System`, `Emitter`, `Particle`, and **`User`**. Only **User-namespace** parameters are exposed to and settable from Blueprint/C++; the others are internal to the simulation. 4. **Spawn at runtime** with `UNiagaraFunctionLibrary::SpawnSystemAtLocation` (world position) or `SpawnSystemAttached` (follows a component/socket), which return a `UNiagaraComponent`. 5. **Drive the effect** by setting its User parameters on the returned component (color, spawn rate, a target position) and `Activate`/`Deactivate` it. 6. **Verify** in the Niagara editor preview and in-level; check bounds (especially GPU emitters), and confirm the effect culls/destroys correctly.
Patterns
1. Spawn a one-shot effect at a world location (C++)
#include "NiagaraFunctionLibrary.h"
#include "NiagaraComponent.h"
// ImpactSystem is a UPROPERTY(EditAnywhere) TObjectPtr<UNiagaraSystem>.
void AProjectile::SpawnImpact(const FVector& Location, const FRotator& Rotation)
{
UNiagaraComponent* FX = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
GetWorld(), ImpactSystem, Location, Rotation);
// FX auto-destroys when finished for a one-shot (system marked non-looping).
}2. Spawn attached to a socket (muzzle flash that follows the gun)
UNiagaraComponent* Muzzle = UNiagaraFunctionLibrary::SpawnSystemAttached(
MuzzleSystem, WeaponMesh, FName("MuzzleSocket"),
FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::SnapToTarget, /*bAutoDestroy*/ true);3. Drive an exposed User parameter at runtime
// Only User-namespace parameters can be set from gameplay. Names match the User parameter.
if (UNiagaraComponent* Fire = UNiagaraFunctionLibrary::SpawnSystemAttached(
FireSystem, RootComponent, NAME_None, FVector::ZeroVector, FRotator::ZeroRotator,
EAttachLocation::KeepRelativeOffset, /*bAutoDestroy*/ false))
{
Fire->SetVariableFloat(FName("SpawnRate"), 250.f); // User.SpawnRate
Fire->SetVariableLinearColor(FName("FireColor"), FLinearColor::Red);
}4. Blueprint equivalent (node flow)
Spawn System at Location (System = NS_Impact, Location, Rotation) -> returns Niagara Component On the returned component: Set Niagara Variable (Float) Name="SpawnRate" Value=250 Set Niagara Variable (LinearColor) Name="FireColor" Value=Red
Pitfalls
- **Trying to set a System/Emitter/Particle parameter from gameplay** — it won't take. Expose
it in the **User** namespace; only User parameters are settable via the component.
- **Using Cascade tutorials** — Cascade is legacy/deprecated. Niagara is the current system; the
emitter/module workflow differs.
- **Effect disappears or doesn't cull right** — fixed/incorrect bounds, especially for **GPU
Compute** emitters which need explicit Fixed Bounds. Set bounds on the emitter/system.
- **Looping effect never stops** — spawned with `bAutoDestroy = false` and never
`Deactivate()`d; manage the returned component's lifetime, or mark the system non-looping for one-shots.
- **GPU sim can't drive gameplay** — GPU particle data isn't readily read back to the CPU;
collision/events that gameplay must react to should use CPU emitters (or Niagara → gameplay via the data interface), not GPU.
- **Module order bugs** — a Force/Velocity module placed before the one that initializes the
value reads zero. Mind the top-to-bottom stack order.
References
- Primary docs: "Overview of Niagara Effects"
(`https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-niagara-effects-for-unreal-engine`) and the `UNiagaraFunctionLibrary` / `UNiagaraComponent` API. Add the `Niagara` module to `*.Build.cs` for C++ access.
Related skills
- `shader-programming` — material/shader concepts for particle materials.
- `unreal-cpp-gameplay` — spawning effects from gameplay code and module setup.
- `unreal-blueprints` — triggering effects from visual scripts.
<img src="docs/assets/banner.png" width="820" alt="awesome-gamedev-agent-skills — game-dev skills for AI coding agents.
Repo: gamedev-skills/awesome-gamedev-agent-skills
Other skills on awesome-gamedev-agent-skills.
- /audio-design
Implement game audio practice — bus/mixer architecture and gain in decibels, ducking (sidechain), adaptive/dynamic music via layering and re-sequencing, SFX variation, and beat synchronization. Engine-neutral. Use when the user mentions audio mixing, audio buses,
Open skill - /camera-systems
Build game cameras that feel good — 2D follow with a deadzone, look-ahead, smoothing, and level-bounds clamping; 3D third-person orbit with collision and first-person look; plus multi-target framing and a shake hook. Engine-neutral techniques that pair with the engine's camera
Open skill - /create-game-assets
Plan, generate, source, normalize, and validate cohesive visual game assets. Use for art direction, style bibles, sprites, tilesets, backgrounds, UI art, icons, textures, concept art, or 3D asset briefs.
Open skill - /dialogue-systems
Build branching dialogue and narrative — a node/choice graph with conditions, variables, and localization hooks — and choose between authoring tools Ink and Yarn Spinner or a custom data-driven runner. Engine-neutral. Use when the user mentions dialogue system, branching
Open skill - /game-ai
Design NPC and enemy decision-making with finite state machines, behavior trees, steering behaviors, and A* pathfinding — engine-neutral algorithms that pair with the detected engine's navigation API. Use when building enemy AI, an FSM or behavior tree, steering/flocking, or
Open skill - /game-feel
Add "juice" and game feel that makes actions satisfying — screen shake, hit-stop/freeze frames, tweened/eased motion, squash & stretch, knockback, and layered audio-visual feedback — as engine-neutral techniques that pair with the detected engine's tween, particle, and camera
Open skill

