Think In Pools
Each particle system has a maximum particle count. That count defines the pool size. When the pool is full, new particles are clamped or reuse dead slots when available.
Use the smallest Max Particles value that supports the effect.
Examples:
- pickup sparkle:
24to64 - landing dust:
16to48 - torch embers:
64to128 - rain zone: hundreds, but only when needed
- large explosion: split into multiple systems with clear limits
Avoid setting every effect to a huge max count. That hides tuning problems and increases worst-case cost.
Lifetime Drives Density
Visible particle count is roughly:
emission rate * lifetime
If an effect emits 100 particles per second and each particle lives 4 seconds, the system can hold around 400 living particles before bursts are considered.
When an effect is too dense, lower emission rate, lower lifetime, or both.
Watch Overdraw
Overdraw happens when many transparent particles cover the same pixels. Smoke, fog, fire, glows, and magic effects can cause heavy overdraw because their textures are soft and translucent.
Reduce overdraw by:
- lowering particle count
- shortening lifetime
- shrinking particle size
- using fewer large transparent quads
- splitting effects by distance or importance
- avoiding full-screen transparent effects in gameplay cameras
Use Bounds And Culling
Particle systems need bounds so the renderer can skip effects outside the view. Effects with huge movement, long lifetimes, or large particles need bounds that honestly cover where particles can go.
If particles disappear too early, their bounds may be too small. If many off-screen effects remain expensive, their bounds may be too large or culling may not be effective.
When tuning bounds, test:
- the first frame of the effect
- the largest particle size
- the farthest particle travel
- camera movement around the effect
- world-space effects after the emitter moves away
Local Versus World Simulation
Local simulation keeps particles relative to the emitter. This is useful for attached effects.
World simulation leaves particles in world space after spawn. This is useful for smoke, debris, dust, and rain.
If particles appear to drag along with a moving object when they should stay behind, use World. If particles appear to detach from an effect that should stay glued to an object, use Local.
Deterministic Seeds
Use fixed seeds for repeatable previews, tests, or scripted moments. Use automatic seeds when variation matters more.
If an effect changes every time you restart preview and that makes tuning difficult, disable automatic random seed and set a known seed.
Debug Checklist
Particles do not appear:
- component is disabled
- GameObject is inactive
Play On Awakeis off and no script callsplay()oremit()Max Particlesis too low- lifetime is too short
- start size is too small
- color alpha is zero
- texture path is invalid
- 2D sorting layer/order hides the particles
- 3D particles are outside the camera view
Particles appear once and never again:
Loopingis offDurationended- script emitted once but never restarted
- pool is filled with long-lived particles
Particles move in the wrong direction:
- emission angle is wrong
- shape rotation is wrong
- force or velocity over lifetime is stronger than start speed
- local/world space is not what you expect
Particles look too uniform:
- add random lifetime, speed, size, or rotation
- add a color gradient
- use random texture-sheet start frames
- use multiple emitters for complex effects
Particles are too expensive:
- lower max particles
- lower emission rate
- shorten lifetime
- reduce size and overdraw
- disable unnecessary modules
- split large effects into smaller systems that can be culled independently
Production Habits
For important effects, create a profile and test it in a real scene. The effect should be readable from the gameplay camera, with real lighting, real background art, and realistic object counts.
Do not tune every effect in isolation against an empty scene. Particles compete with the rest of the game for attention and frame time.