Particle Editor
The Particles tab is where you author particle effects: a list of every effect asset in the project, a live 3D preview of the open one, and grouped controls for its ~25 numbers plus the two widgets that need real space - the colour gradient over life and the size curve over life.
An effect authored here is used in two ways: pick it in a ParticleEmitter component's Effect field, or fire it from a script with api.burst("<id>"). See Particles for the system behind it.
Where the tab is
Particles shares the centre dock leaf with Editor, Game, Code, Material and Anim Graph. Like those asset panels it is data-gated: a tab only gets a real slot in the tab bar when the project actually has that kind of asset. With no particle effects, Particles lives behind the right-aligned … overflow menu at the end of the bar; create or import the first effect and it is promoted into the bar immediately.
The rule has one exception, and it matters: the active tab is always shown. Open an empty Particles from the … menu and it stays visible while you're looking at it; switch away and it drops back into the overflow.
You land here from several places, all of which open the effect and focus the tab:
- + New Effect in this tab's sidebar footer, or in the Asset Browser.
- Double-click a particle-effect asset in the Asset Browser.
- Edit on the compact effect card in the Inspector.
The layout
- The sidebar lists every effect with the same ✷ glyph the Asset Browser uses. Click to open. Double-click (or right-click ▸ Rename) renames; right-click ▸ Delete removes it, with a confirm that warns emitters referencing it will stop emitting. + New Effect creates one seeded from the engine defaults and drops you straight into naming it.
- The sidebar collapses to an icon strip (« / ») to reclaim width - names then show on hover, and rename switches to a dialog. The collapsed state is remembered.
- The header bar above the workspace shows the open effect's name (read-only - rename lives on the sidebar row) and a one-line status: shape · rate · max particles.
📸 Screenshot - save as img/editor-particle-editor.png
The Particles tab with the starter Fire effect open: the sidebar listing Fire and Sparks, the live preview at the top actively burning, and the control groups flowing into two columns below.
The live preview
The preview sits first and full-width, because tuning particles is a watch-then-adjust loop - the thing you are changing has to be the thing you are looking at.
It is not a mock-up: it runs the same simulateEmitter integrator the engine uses, drawn by a real Awaken renderer on its own GPU device. The emitter sits at the stage origin with an identity transform (the stage floor is y = 0, and effects are authored at metre scale), so what you see is the effect as it will look on an unrotated, unscaled entity. Drag to orbit, scroll to zoom.
Because every edit writes a whole new effect object that the preview re-reads each frame, rate, colour and size changes appear instantly - no prefab, no scene, no Play. The same preview appears on the compact effect card in the Inspector.
The control groups
Each group is a card; the groups flow into as many columns as the dock leaf is wide and collapse to one column when narrow. Every field maps 1:1 to a ParticleEffect field, where the units and behaviour are documented in full.
Emission
rate (particles/second), maxParticles (the live-pool cap - changing it rebuilds the pool, restarting the effect), duration (seconds; rate emission stops past this for non-looping effects), loop, and oneShot (a lifecycle hint that nothing currently reads).
Bursts
Timed one-shot spawns. + Burst adds a row of time (seconds into the effect's life) and count; ✕ removes one. Rows are kept sorted by time as you edit, which is what the integrator requires. An effect with rate: 0 and a single burst at t = 0 is the classic impact/api.burst shape.
Shape
The emission volume. Picking a kind rebuilds the shape at that kind's defaults, then its own fields appear: radius for a sphere, half.x/y/z for a box, and angleDeg + radius for a cone. The tooltips spell out the cone's split personality - angleDeg is a half-angle added to spreadDeg for the launch direction, while radius only spreads the spawn positions across the cone's base disc.
Per-particle
The per-particle initial state: lifetime and lifetimeVariance, speed and speedVariance, spreadDeg, sizeStart, rotationSpeed and rotationVariance. Every …Variance field is a 0–1 fraction applied as ±, so 0.5 on a 2 s lifetime gives 1–3 s.
Forces
gravity as an X/Y/Z triple (a constant acceleration, unrelated to physics gravity - fire uses a positive Y) and drag (exponential damping, v *= exp(-drag · dt)).
Color over life
The gradient bar at the top of the group is the readout - the stops are edited as numbers below it and the ramp is the only way to judge the result. Each stop row is t (0–1 over the particle's life), a colour swatch, an alpha box, and ✕ to remove. + Stop adds one.
Stops must stay sorted ascending by t; alpha is clamped to 0–1, while RGB may exceed 1 (additive blending legitimately over-drives a hot core).
📸 Screenshot - save as img/editor-particle-gradient.png
The Color over life group for the Fire effect: the ramp bar showing yellow-white → orange → deep red → transparent, with its four stop rows (t, colour swatch, alpha) beneath it.
Size curve
A small SVG plot of the size multiplier over life, with a dot per key, above the editable key rows (t, v, ✕) and + Key. The plot and dots share one Y scale, so a curve that overshoots 1 still fits inside the box. v multiplies sizeStart - a 1 → 0 curve shrinks a spark to nothing, a 0.45 → 1 → 0.18 curve makes a flame puff swell then taper.
Render
blend (additive or alpha), texture (a dropdown of the project's textures; (procedural round) is the default and needs no asset), worldSpace, softness (0–1 soft depth-fade, clamped as you type) and stretch (velocity streaks).
worldSpace is shown because the field exists on the asset and importers set it, but this version always behaves as world-space - see Limitations.
Live mirroring - no Save button
There is no explicit save. Every control writes the whole effect back into the asset store, which bumps the asset revision, so the preview, any emitter in the scene, and a running Play session all re-read it on the next frame. Only maxParticles restarts anything (it resizes the particle pool).
Renaming changes the display name only - the effect's stable id never moves, so ParticleEmitter references and api.burst("<id>") calls keep resolving. That id, not the file name, is the binding key.
Getting effects in and out
- Import a
.awakenfxvia Assets ▸ Import or drag-and-drop. Import is keyed by the file's id, so re-importing an edited effect updates every emitter already pointing at it rather than forking a copy. - Export one from the Asset Browser: right-click the effect ▸ Export… writes a portable
.awakenfx- the same format the starter content ships. - Nothing here is built in. Even the starter Fire and Sparks arrive as imported files, so tuning them edits your project's copy and the project save keeps it.
See also
- Particles - the effect/emitter/burst model, the simulation, and the billboard pass
- Inspector - the ParticleEmitter component and the compact effect card
- Asset Browser - creating, exporting and deleting effect assets
- Shader Editor - the same list-workspace layout for hook materials
- ScriptApi Reference - firing an effect with
api.burst