A Niagara authoring language for Unreal Engine

DreamFXLang

Describe Niagara effects in .dfs / .dfe / .dfm source files. The DreamFX plugin compiles them into standard UNiagaraSystem, UNiagaraEmitter and UNiagaraScript assets — and decompiles any existing Niagara system back into source. The text is the authoring surface; the asset is build output, and can always be thrown away and regenerated.

  • DreamFX1.0.0
  • UE5.8
  • Diagnostics143
  • LicenseMIT
The DreamFX character: a silver-haired mage drawing a trail of particles with a brush

DreamFX · Text to UE Niagara

Scroll

What it looks like

One file, one command, one Niagara system

A complete .dfs, not an excerpt. Module calls across the stacks, a user parameter, renderer properties — all of it text, and the build turns it into an ordinary UNiagaraSystem under /Game.

NS_Hello.dfsDreamFXLang
System(Name="Effects/NS_Hello", Root="Game"){    Properties = {        float Speed = 150.0;    }    Emitter Motes    {        Settings = { SimTarget = CPU; Determinism = true; }        EmitterUpdate = {            EmitterState(LifeCycleMode = Self);            SpawnRate(SpawnRate = 20.0);        }        ParticleSpawn = {            SystemLocation();            AddVelocityInCone(VelocityStrength = User.Speed);        }        ParticleUpdate = {            ParticleState();            GravityForce(Gravity = (0, 0, -400));            SolveForcesAndVelocity();        }        SpriteRenderer Core { FacingMode = FaceCamera; }    }}

builds /Game/Effects/NS_Hello — no editor required

pwsh -File Plugins/DreamFX/.skill/dfx.ps1 build DFX/Effects/NS_Hello.dfs

Workflow

Text in, Niagara assets out — and back again

Generation is headless: one command, one asset. With the editor open, saving a source rebuilds it, so a Niagara preview window doubles as a live preview. The reverse direction is not a convenience export — it is a contract.

  1. Source

    .dfs declares a system, .dfe a reusable emitter, .dfm a module or dynamic input. Six stacks, event handlers, simulation stages, renderer properties and bindings — all of it is text.

  2. Build

    The commandlet parses, generates modules → emitters → systems, runs the Niagara compile, and stamps provenance on the asset: source hash, generator version, module version GUIDs.

  3. Verify

    A four-step CI: lint → build → verify → corpus. verify is the one that catches a source edited and committed without a rebuild — build alone can never see it, because build fixes it.

  4. Round-trip

    Decompilation is byte-for-byte idempotent, and anything the language cannot express is written into the file header as an explicit gap. Adopt re-exports and compares before taking an asset over.