Particle Emitter Core

The Inspector exposes Duration, Looping, Lifetime, Speed, Size, Color, Simulation Space, and Max Particles.
ParticleEmitter spawns independent TileParticle instances. Its ParticleConfig holds authored values; each emitted instance owns a ParticleRuntime that combines top-level values, module runtimes, custom data, and renderer overrides.
Core Settings
| Setting | Meaning |
|---|---|
duration | Emitter cycle length in ticks. |
looping | Start another cycle after duration. |
prewarm | Simulate initial ticks before the first visible frame. |
startDelay | Function sampled for each emitter start. |
startLifetime | Lifetime assigned to a new particle. |
lifetimeMode | How the lifetime drives the normalized age: Once, Loop or PingPong. See Lifetime Mode. Since 2.2.11 |
startSpeed | Initial velocity magnitude along the shape direction. |
startSize | Initial X/Y/Z size. |
startRotation | Initial X/Y/Z rotation. |
startColor | Initial particle color; multiplied by later color modules/material logic. |
maxParticles | Upper bound for live particles from this emitter. |
parallelUpdate | Allow eligible particle updates to run in parallel. |
Spawn Flow
The SpawnFrame captures the emitter transform and simulation-space conversion at birth. Local/world/custom behaviour is therefore consistent even when the effect root moves later.
Duration and Completion
A non-looping emitter stops spawning after its duration, but the FX remains alive while previously spawned particles or trails are still playing. A looping emitter does not finish naturally; its owning executor must destroy it when appropriate.
Prewarm
Prewarm is useful for looping smoke, aura, or ambient emitters that should look established immediately. It costs simulation work at start and should be kept small for effects spawned frequently.
Parallel Update
Parallel update improves large independent particle systems. Photon keeps world/light access and sub-emitter spawning behind safe handshakes, but custom logic must not introduce unsafe shared mutable state. For small queues, scheduling overhead can exceed the work saved; below 128 particles an emitter updates serially.
Changed 2.2.9 Emitters with collision can run in parallel too. Before 2.2.9 they were always updated serially. The client config option Parallel collision (on by default) can turn this off. See Particle Collision.Runtime Access
ParticleEmitter emitter = (ParticleEmitter) runtime.findObject("sparks");
emitter.runtime().startSpeed.set(new Constant(0.2f));
emitter.runtime().maxParticles.set(256);Clear an override to return to the authored setting. See Runtime Data Injection.