Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/gamedev-skills-unreal-niagara/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 219% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 175% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 332% | 0% |
| case-18 | ✓→✓ | = Same ✓ | 61% | 0% |
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.)
NS_) and Emitters (NE_), wiring modules in thespawn/update stages, exposing User parameters to gameplay, or spawning/driving an effect (impact, muzzle flash, fire, magic) from Blueprint or C++.
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.
NS_) is the effect you place/spawn; itcontains one or more Emitters (NE_, often emitter templates). Each emitter runs in stages: Emitter Spawn/Update, Particle Spawn/Update, optional Event Handler, and Render.
Add Velocity, Gravity Force, Color over Life, etc.). Order matters — a later module reads the values earlier ones wrote.
System, Emitter, Particle, and User. OnlyUser-namespace parameters are exposed to and settable from Blueprint/C++; the others are internal to the simulation.
UNiagaraFunctionLibrary::SpawnSystemAtLocation (world position)or SpawnSystemAttached (follows a component/socket), which return a UNiagaraComponent.
rate, a target position) and Activate/Deactivate it.
emitters), and confirm the effect culls/destroys correctly.
cpp#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). }
cppUNiagaraComponent* Muzzle = UNiagaraFunctionLibrary::SpawnSystemAttached( MuzzleSystem, WeaponMesh, FName("MuzzleSocket"), FVector::ZeroVector, FRotator::ZeroRotator, EAttachLocation::SnapToTarget, /*bAutoDestroy*/ true);
cpp// 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); }
textSpawn 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
it in the User namespace; only User parameters are settable via the component.
emitter/module workflow differs.
Compute emitters which need explicit Fixed Bounds. Set bounds on the emitter/system.
bAutoDestroy = false and neverDeactivate()d; manage the returned component's lifetime, or mark the system non-looping for one-shots.
collision/events that gameplay must react to should use CPU emitters (or Niagara → gameplay via the data interface), not GPU.
value reads zero. Mind the top-to-bottom stack order.
(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.
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.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | pass→pass | 12,916 | 12,310 | -5% | 1 | 1 | 0% | 2,183 | 3,510 | +61% | 0 | 0 | — |
case-19 | pass→pass | 19,215 | 17,568 | -9% | 1 | 1 | 0% | 3,429 | 4,741 | +38% | 0 | 0 | — |
case-20 | pass→pass | 13,196 | 15,508 | +18% | 1 | 1 | 0% | 2,171 | 3,965 | +83% | 0 | 0 | — |
case-21 | pass→pass | 21,881 | 18,486 | -16% | 1 | 1 | 0% | 3,361 | 4,256 | +27% | 0 | 0 | — |
case-01 | pass→pass | 19,454 | 19,446 | -0% | 1 | 1 | 0% | 2,808 | 4,034 | +44% | 0 | 0 | — |
case-02 | pass→pass | 16,296 | 12,108 | -26% | 1 | 1 | 0% | 1,962 | 2,733 | +39% | 0 | 0 | — |
case-03 | pass→pass | 8,405 | 5,348 | -36% | 1 | 1 | 0% | 1,690 | 2,394 | +42% | 0 | 0 | — |
case-04 | pass→pass | 15,199 | 11,287 | -26% | 1 | 1 | 0% | 1,846 | 2,644 | +43% | 0 | 0 | — |
case-05 | fail→pass | 13,092 | 9,918 | -24% | 1 | 1 | 0% | 1,578 | 2,325 | +47% | 0 | 0 | — |
case-06 | pass→pass | 10,051 | 9,748 | -3% | 1 | 1 | 0% | 1,768 | 2,208 | +25% | 0 | 0 | — |
case-07 | pass→pass | 23,878 | 14,044 | -41% | 1 | 1 | 0% | 1,909 | 2,866 | +50% | 0 | 0 | — |
case-08 | pass→pass | 17,054 | 10,914 | -36% | 1 | 1 | 0% | 2,028 | 3,281 | +62% | 0 | 0 | — |
case-09 | pass→pass | 16,643 | 19,437 | +17% | 1 | 1 | 0% | 2,465 | 3,743 | +52% | 0 | 0 | — |
case-10 | pass→pass | 11,772 | 13,037 | +11% | 1 | 1 | 0% | 1,899 | 2,608 | +37% | 0 | 0 | — |
case-11 | pass→pass | 8,616 | 7,890 | -8% | 1 | 1 | 0% | 1,257 | 2,920 | +132% | 0 | 0 | — |
case-12 | pass→pass | 4,990 | 10,268 | +106% | 1 | 1 | 0% | 917 | 2,399 | +162% | 0 | 0 | — |
case-13 | pass→pass | 3,924 | 3,149 | -20% | 1 | 1 | 0% | 603 | 1,866 | +209% | 0 | 0 | — |
case-14 | pass→pass | 8,003 | 11,939 | +49% | 1 | 1 | 0% | 1,294 | 2,526 | +95% | 0 | 0 | — |
case-15 | fail→pass | 9,511 | 6,326 | -33% | 1 | 1 | 0% | 820 | 2,615 | +219% | 0 | 0 | — |
case-16 | pass→pass | 9,429 | 3,924 | -58% | 1 | 1 | 0% | 728 | 2,119 | +191% | 0 | 0 | — |
case-17 | fail→pass | 11,285 | 8,601 | -24% | 1 | 1 | 0% | 1,038 | 2,851 | +175% | 0 | 0 | — |
case-22 | fail→pass | 2,710 | 1,075 | -60% | 1 | 1 | 0% | 355 | 1,535 | +332% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.