Under Construction
Unity45 min130 views

Unity Particle System Component: from the basics to enough to use

Minh Khoa

Minh Khoa

Author

For people new to Unity VFX. Written in an easy-to-read blog style, but still covering almost all of the important parts of the Particle System component.

The current project uses Unity 6000.3.13f1. The content below is based on the modern Unity Particle System in Unity 6; a few field names may differ slightly if you open the project with an older Unity version.


image.png## 1. What is a Particle System?

Particle System is a component used to create very many small “particles” called particle.

Each particle is usually just:

  • A small image facing the camera, for example smoke, dust, light, sparks.
  • Or a small mesh, for example rock fragments, leaves, debris.

A single particle looks very simple. But when Unity creates many particles, moves them, changes their color, fades them out, rotates them, makes them expand, collide… the human eye sees a large effect such as:

  • Cooking smoke.
  • Fire.
  • Dust when a character runs.
  • Coins flying out.
  • Twinkling stars.
  • Hit effects when slashing a monster.
  • Bubbles, snow, rain, fireworks.

Imagine Particle System like a confetti machine. You do not control each piece of paper by hand. You adjust the machine: how much it sprays, where it sprays from, how fast it flies, what color it is, how long it lives, and what happens when it dies.


2. Built-in Particle System or Visual Effect Graph?

Unity has 2 main approaches for making particles:

SystemWhen should you use
Built-in Particle SystemMedium and small effects, easy to tweak in the Inspector, need scripts to read/write each particle, suitable for mobile and everyday VFX gameplay.
Visual Effect GraphVery large effects, hundreds of thousands or millions of particles, run GPU, suitable PC/console/URP/HDRP depending on configuration.

For games like idle/mobile such as Sushi Bar Idle, most gameplay effects should start with Built-in Particle System: lightweight, familiar, easy to prefab, easy to pool.


3. Mental model: How does Particle System run?

A particle usually goes through this lifecycle:

Emitter sinh particle
        ↓
Particle nhận giá trị ban đầu
        ↓
Particle sống trong vài giây
        ↓
Các module thay đổi nó theo thời gian
        ↓
Renderer vẽ particle ra màn hình
        ↓
Particle hết lifetime và biến mất

Example with smoke:

  1. Emission spawn 20 particles/second.
  2. Shape set the particles to spawn from a small circle.
  3. Main set lifetime to 2 seconds, slow speed, gray color.
  4. Size over Lifetime make the particles grow larger over time.
  5. Color over Lifetime make the particles fade out over time.
  6. Noise make the particles drift naturally.
  7. Renderer render with a smoke material.

4. How to create a Particle System in Unity

There are 2 common ways:

  • Create new: GameObject > Effects > Particle System.
  • Add to an existing object: select the object, Add Component > Effects > Particle System.

When selecting an object with Particle System, in Scene View Unity there is a small preview panel:

  • Play / Pause / Stop to preview.
  • Playback Speed to fast-forward nhanh/chslowly.
  • Playback Time to drag the simulation time.
  • Particle Count to see how many particles are currently alive.

This is where you tune the effect like tuning a musical instrument: adjust the numbers, look at the result, adjust again.


5. Reading the Particle System Inspector

Particle System in the Inspector is divided into many blocks called module.

Each module is responsible for a group of behaviors:

  • Main: overall configuration and initial values.
  • Emission: how many particles to spawn, when to spawn.
  • Shape: what shape to spawn from, initial flight direction.
  • Color over Lifetime: change color over the lifetime.
  • Size over Lifetime: change size over the lifetime.
  • Renderer: render particles to the screen with material/mesh/billboard.

Some modules have an enable/disable checkbox. If a module is disabled, that part does not affect the particles. For example, turning off Size over Lifetime means particles will not automatically shrink to/thu over lifetime anymore.


6. Important value input types

Many fields in Particle System do not accept only a fixed number. Unity gives you several input types:

TypeEasy-to-understand meaning
ConstantA fixed value. For example, speed is always 5.
CurveA value that changes over time. For example, small at the beginning, large in the middle, small at the end.
Random Between Two ConstantsEach particle randomly picks a number between two values. For example, size from 0.8 to 1.2.
Random Between Two CurvesEach particle randomly picks between two curves. Use this when you want a more natural effect.
ColorA fixed color.
GradientColor changes over time. For example yellow → orange → transparent.
Random Between Two ColorsEach particle chooses a random color between two colors.
Random Between Two GradientsEach particle uses a random variation between two gradients.

A very useful rule:

  • Over Lifetime meaning it changes according to the particle's age percentage.
  • By Speed meaning it changes according to the particle's speed.
  • Rate over Time meaning it spawns over time.
  • Rate over Distance meaning it spawns according to how far the object has moved.

7. Main module: the heart of the system

Main is the module that is always present. It determines the initial state and the overall behavior of the Particle System.

PropertyEffect
DurationThe duration of one system run cycle. If Looping enabled, when the duration ends it repeats.
LoopingMakes the system run forever in a loop. Used for smoke, fire, flowing water, aura.
PrewarmIf enabled together with Looping, the effect appears as if it had already run through one cycle. Very useful for fire/smoke that should not start from an empty state.
Start DelayWait for a period of time before starting to emit particles.
Start LifetimeHow long a particle lives. Short lifetime creates a nhanh/gsharp effect; long lifetime creates a trailing streak or lingering smoke.
Start SpeedThe particle's initial speed.
3D Start SizeAllows separate size adjustment on each axis X/Y/Z. If disabled, a single size is used.
Start SizeThe initial size.
3D Start RotationAllows separate rotation adjustment on each axis. Often used when rendering mesh particles.
Start RotationThe initial rotation angle. Used to randomize textures so they do not look fake due to repetition.
Flip RotationMakes some particles rotate in the opposite direction, helping movement feel more natural.
Start ColorThe initial color. Can use gradient/random color.
Gravity ModifierThe degree of gravity influence. 0 means no falling; 1 uses the default Physics gravity; negative values make it rise.
Simulation SpaceSimulation space: Local, Worldor Custom.
Simulation SpeedThe speed of the entire system. 0.5 half speed, 2 double speed.
Delta TimeUse time Scaled or Unscaled. Unscaled suitable for effects UI when the game is paused.
Scaling ModeHow Transform scale affects particles: by hierarchy, local, or shape only.
Play On AwakeAs soon as the object is active, the particle runs automatically. If turned off, you must call Play() with a script or manually via trigger.
Emitter VelocityHow Unity calculates the emitter's velocity, used for Inherit Velocity and Rate over Distance.
Max ParticlesThe maximum number of particles that can live at the same time. This is a “fuse” to prevent the effect from exploding.
Auto Random SeedIf enabled, each run looks a little different; if disabled, the effect repeats exactly the same according to Random Seed.
Random SeedA fixed random seed when disabled Auto Random Seed. Use when you want a deterministic effect.
Stop ActionWhen all particles die, what to do: None, Disable, Destroyor invoke a callback.
Culling ModeWhen off-screen can simulation continue? Extremely important for performance.
Ring Buffer ModeInstead of dying when lifetime ends, old particles can wait to be reused when reaching Max Particles.

Local or World Simulation Space?

ModeSimply putUse when
LocalParticles follow the parent object.Aura attached to a character, flame attached to a torch.
WorldOnce spawned, particles stay in the world even if the emitter moves.Smoke from a moving car, footsteps dust, movement trails.
CustomThe particle simulates relative to another Transform.The effect needs to follow a separate reference.

Memory tip: if the character runs and the smoke must be left behind, use WorldIf the aura must stick to the character, use Local.


8. Emission module: how many particles to spawn?

Emission determines the particle spawn rate and timing.

PropertyEffect
Rate over TimeSpawns particles over time. For example 10 means about 10 particles per second.
Rate over DistanceSpawns particles over the distance the emitter moves. Very useful for footsteps dust, tire tracks, trails when the object moves.
BurstsSpawns a burst of particles at a specific time. Used for explosions, pops, coin bursts, hit impacts.
Burst TimeThe burst timing counted from when the system starts running.
Burst CountThe number of particles in the burst.
Burst CyclesHow many times the burst repeats.
Burst IntervalThe time interval between burst cycles.
Burst ProbabilityThe probability that the burst occurs. 1 is guaranteed, 0.5 is 50%.

For example:

  • Continuous smoke: Rate over Time = 15; no burst needed.
  • Small explosion: Rate over Time = 0, Burst Count = 30.
  • Foot dust: Rate over Time = 0, Rate over Distance = 4.

9. Shape module: where do particles spawn from?

Shape determines the particle spawn area and the initial velocity direction.

Common shapes

ShapeIn simple termsUsed when
SphereSpawn inside or on a sphere.Aura, round explosion, magic orb.
HemisphereHemisphere.Dust rising from the ground, one-sided splash.
ConeSpawn from a cone.Jet flame, water nozzle, confetti spraying out.
DonutTorus shape.Magic ring, ring aura.
BoxRectangular box.Rain, snow, wide dust area.
MeshSpawn from a selected mesh.Effect on the model surface.
Mesh RendererTake the mesh from an object that has Mesh Renderer.Particles sticking to the rendered model.
Skinned Mesh RendererSpawn from a mesh with skeletal animation.Spark/blood/aura on an animated character.
SpriteSpawn from a sprite.VFX 2D following the sprite shape.
Sprite RendererTake the sprite from an object that has Sprite Renderer.VFX sticking to a sprite in the scene.
CircleFlat circle shape.Ring, ripple, 2D shockwave.
EdgeA line segment.Rain from the screen edge, line emitter.
RectangleFlat rectangle shape.Snow/rain over a plane area.

Common shape properties

PropertyEffect
RadiusRadius of the sphere/circle/cone/donut.
Radius Thickness0 spawn on the surface, 1 spawn throughout the entire volume.
ArcUse only part of the circle. For example 180° is a half ring.
ModeHow Unity distributes spawn positions: random, loop, ping-pongburst spread.
SpreadDivide spawn positions into discrete intervals so particles are more even or rhythmic.
SpeedThe speed at which spawn points move around the arc when using mode loop/ping-pong.
AngleThe cone opening angle. A larger angle sprays wider, a smaller angle focuses the spray.
LengthThe cone length when spawning in volume.
Emit FromSpawn from base, volume, edge, shell… depending on the shape.
TextureUse a texture to tint or exclude spawn positions.
PositionOffset the spawn area relative to the Particle System Transform.
RotationRotate the spawn area.
ScaleScale the spawn area.
Align to DirectionRotate particles along their initial flight direction. Used for debris, streaks, leaves.
Randomize DirectionBlend the flight direction with a random direction. Increase it to make particles spread more naturally.
Spherize DirectionMake the flight direction spread out from the center like a sphere.
Randomize PositionAdd random spawn positions, avoiding a too-even/unnatural look.

Tip: when the effect looks “mechanical”, try a little randomization Start Size, Start Rotation, Start Lifetime, Randomize Position, or Randomize Direction.


10. Velocity over Lifetime: change velocity over time

This module adds or adjusts velocity while the particle is alive.

PropertyEffect
Linear X/Y/ZAdd linear velocity along each axis. For example, positive Y makes particles rise.
SpaceVelocity along Local or World.
Orbital X/Y/ZMake particles rotate around an axis, like a swirl/ring.
Offset X/Y/ZShift the orbit center when using orbital.
RadialPush particles away or pull them closer to the center.
Speed ModifierMultiply the current speed over time.

For example:

  • Rising smoke: Linear Y slightly positive.
  • Magic swirl: add Orbital Y.
  • Explosion dispersing: Radial positive.
  • Implosion inward: Radial downward.

11. Noise: add natural motion

Noise add noise/turbulence to particles. If Velocity it is a deliberate path, Noise it is wind, shaking, chaos, “life is not like a spline.”

PropertyEffect
Separate AxesAdjust noise separately for each axis.
StrengthThe strength of the noise. Higher means particles deviate xa/mmore strongly.
FrequencyThe frequency of direction changes. Low is smooth; high is jittery nhanh/g.
Scroll SpeedMake the noise field drift over time, creating a more lively feel.
DampingKeep the noise more stable when changing frequency/strength.
OctavesThe number of noise layers stacked on top of each other. More layers look better but cost more.
Octave MultiplierHow much the later noise layer weakens.
Octave ScaleHow different the frequency of the later noise layer is.
QualityNoise quality. Lower is lighter; higher looks better but costs more.
RemapRemap the noise value to a different range.
Remap CurveA curve to transform the noise output.
Position AmountHow much the noise affects position.
Rotation AmountHow much the noise affects rotation.
Size AmountHow much the noise affects size.

Mobile tip: only enable noise when truly needed. Octaves High can be expensive.


12. Limit Velocity over Lifetime: limit speed

This module is like a “brake” or “friction.”

PropertyEffect
Separate AxesLimit velocity separately X/Y/Z.
SpeedMaximum speed. Particles that exceed it will be reduced.
SpaceLimit by local/world when separating axes.
DampenThe amount of deceleration when exceeding the limit.
DragLinear drag, causing particles to slow down over time.
Multiply by SizeLarge particles are affected by more drag.
Multiply by VelocityFast particles are affected by more drag.

Use for:

  • Dust or smoke that initially bursts forward then slows down.
  • Debris that does not fly forever.
  • Magic particles that should drift more and more slowly.

13. Inherit Velocity: inherit velocity

This module is often used for Sub Emitters. It lets child particles inherit velocity from the parent particle or parent emitter.

PropertyEffect
Mode: CurrentEach frame, particles continue to receive the current velocity of emitter/parent. If the parent slows down, the particles slow down too.
Mode: InitialOnly inherit the velocity at the moment the particle is spawned. After that, it flies on its own.
MultiplierInheritance ratio. 0 do not inherit, 1 inherit fully, 0.5 inherit half.

Example: a moving vehicle creates smoke. The smoke can inherit a bit of the vehicle’s velocity to look more natural, but it should not inherit too much if you want the smoke to lag behind.


14. Lifetime by Emitter Speed: lifetime based on emitter speed

This module adjusts Start Lifetime based on the emitter’s speed when the particle is spawned.

PropertyEffect
MultiplierLifetime multiplier. Can be constant, curve, random constants, random curves.
Speed RangeThe emitter speed range mapped into the curve multiplier.

Example:

  • When the character runs fast, dust lasts longer.
  • When the object is standing still, particles barely appear or die quickly.

15. Force over Lifetime: apply force over time

This module adds force to particles, like wind, attraction, repulsion.

PropertyEffect
X/Y/ZForce per axis.
SpaceForce in local or world space.
RandomizeWhen using random between two constants/curves, each frame chooses a new force direction within the range, creating more chaotic motion.

Unlike Velocity over Lifetime, Force it is like acceleration: it gradually changes velocity over time.


16. Color over Lifetime: change color/fade over lifetime

This is a very commonly used module.

PropertyEffect
ColorColor/alpha gradient over the particle’s lifetime. The left side is when it is newly spawned, the right side is when it is about to die.

For example:

  • Fire: bright yellow → orange → dark red → transparent.
  • Smoke: light gray, high alpha → dark gray, low alpha → transparent.
  • Spark: very bright white/yellow → orange → disappears.

Important tip: if you want particles to fade out smoothly, pull alpha toward 0 at the end of the gradient.


17. Color by Speed: change color according to speed

This module changes color based on the current speed.

PropertyEffect
ColorColor gradient by speed.
Speed RangeLow/high speed correspond to the start/end of the gradient.

For example:

  • Fast-flying particles are brighter/yellower.
  • When particles slow down, they turn red/darker.
  • Used for slash, spark, speed trail.

18. Size over Lifetime: change size by lifetime

This module appears in almost every beautiful effect.

PropertyEffect
Separate AxesAdjust size separately for each axis.
SizeCurve the size over lifetime.

Example curve:

  • Smoke: small at first → gradually larger → fades away.
  • Hit flash: very fast growth → quickly smaller/disappears.
  • Bubble: slight expansion → bursts.

A simple formula to use:

Start nhỏ → giữa lớn → cuối giữ lớn hoặc giảm nhẹ
Alpha cuối = 0

19. Size by Speed: change size according to speed

PropertyEffect
Separate AxesAdjust size separately for each axis.
SizeCurve the size by speed.
Speed RangeLow/high speed correspond to the start/end of the curve.

Use this when you want faster particles to be longer/larger, and slower particles to become smaller.


20. Rotation over Lifetime: rotate by lifetime

PropertyEffect
Separate AxesRotate separately X/Y/Z.
Angular VelocityRotation speed, measured in degrees/second.

Used for:

  • Rotating spark.
  • Falling leaves rotate.
  • Coin/mDebris pieces spin.
  • Randomly rotate smoke textures slowly to reduce repetition.

21. Rotation by Speed: rotate according to speed

PropertyEffect
Separate AxesRotate separately on each axis.
Angular VelocityRotation speed based on speed.
Speed RangeMap the speed range to a rotation curve.

For example: debris flying fast rotates quickly, and when it slows down it rotates slowly.


22. External Forces: affected by external forces

This module lets the Particle System receive effects from Wind Zone or Particle System Force Field.

PropertyEffect
MultiplierMultiply the strength of the external force.
Influence FilterSelect the force field by Layer Mask or a specific list.
ListThe force field list affects the system.
Influence MaskThe layer mask determines which force fields affect it.

Used for:

  • Smoke blown by the wind.
  • Magic fields attracting/repelling particles.
  • Vortex areas making particles swirl.

23. Collision: particle collision

Collision lets particles react with planes or colliders in the scene.

Type

TypeMeaning
PlanesCollide with the planes you specify. Lighter and better controlled.
WorldCollide with real colliders in the world, with mode 2D/3D. More realistic but more expensive.

Planes properties

PropertyEffect
PlanesA list of Transforms serving as collision planes.
VisualizationDisplay the plane as wireframe or solid in Scene View.
Scale PlaneScale the plane preview shape.
DampenHow much speed the particle loses after a collision.
BounceHow strongly the particle bounces back.
Lifetime LossHow much lifetime is lost on collision.
Min Kill SpeedAfter a collision, if slower than this value, the particle is killed.
Max Kill SpeedIf faster than this value, the particle is killed.
Radius ScaleScale the particle’s collision radius to match the visuals.
Send Collision MessagesAllow scripts to receive OnParticleCollision.
Visualize BoundsDisplay the collision bounds of each particle.

World property

PropertyEffect
Collision ModeChoose collision 2D or 3D.
Dampen, Bounce, Lifetime LossSimilar to Planes.
Min/Max Kill SpeedKill the particle based on post-collision speed.
Radius ScaleThe particle’s virtual collider size.
Collision QualityHigh the most accurate but the most expensive; Medium/Low lighter for static colliders.
Collides WithParticle layer allowed to collide.
Max Collision ShapesMaximum number of collision shapes considered.
Enable Dynamic CollidersEnable collisions with dynamic colliders. More expensive than static.
Voxel SizeGrid cache size when using Medium/Low. Smaller is more accurate but uses more memory.
Collider ForceThe particle applies force to physical colliders.
Multiply by Collision AngleThe force depends on the collision angle.
Multiply by Particle SpeedFaster particles push harder.
Multiply by Particle SizeLarger particles push harder.
Send Collision MessagesAllow scripts to receive collisions.
Visualize BoundsView collision bounds in the Scene View.

Performance tip: if you only need the particle to disappear when it hits a flat ground, use Planes instead of World.


24. Triggers: particles entering/exiting trigger zones

Triggers is not the same as Collision. It lets you handle particles when they:

  • Are inside the collider.
  • Are outside the collider.
  • Have just entered the collider.
  • Have just exited the collider.
PropertyEffect
InsideAction when the particle is inside the collider.
OutsideAction when the particle is outside the collider.
EnterAction on the frame the particle just enters the collider.
ExitAction on the frame the particle just exits the collider.
Collider Query ModeWhether to get information about the collider the particle interacts with. Disabled the lightest.
Radius ScaleScale the particle’s trigger bounds.
Visualize BoundsDisplay trigger bounds in the Scene View.

Common actions include:

ActionMeaning
CallbackAdd the particle to a list for the script to process with OnParticleTrigger().
KillDelete the particle.
IgnoreIgnore.

Example: when a “falling leaf” particle enters a water zone, change the effect; or when a snowflake enters a trigger near the camera, make it disappear.


25. Sub Emitters: particles spawning other particles

Sub Emitters to let a parent particle create another Particle System at its position.

For example:

  • A bullet flies and spawns an explosion on impact.
  • A firework flies upward and spawns a burst of fireworks when it dies.
  • A spark hits the ground and spawns a small puff of smoke.
PropertyEffect
Spawn conditionWhen the parent particle spawns child particles.
InheritWhat properties the child particle inherits from the parent particle.
Emit ProbabilityProbability of spawning the sub emitter. 0 do not spawn, 1 always spawn.

Spawn condition

ConditionMeaning
BirthSpawn the sub emitter when the parent particle is spawned.
CollisionSpawn when the parent particle collides.
DeathSpawn when the parent particle dies.
TriggerSpawn when the parent particle interacts with a trigger.
ManualSpawn only when the script calls ParticleSystem.TriggerSubEmitter.

A mild warning: Sub Emitters can very easily multiply the number of particles extremely fast. One particle spawns 10 particles, then each of those spawns more… the toaster FPS starts working.


26. Texture Sheet Animation: animate the particle’s texture

A particle does not have to be a static image. This module lets the texture be split into multiple frames, then the particle plays the frames like an animation.

Grid mode

PropertyEffect
TilesSplit the texture into how many columns/rows. For example, a 4x4 spritesheet.
AnimationWhole Sheet run the entire sheet; Single Row run only one row.
Time Mode: LifetimeSelect frames based on particle age.
Time Mode: SpeedSelect frames based on particle speed.
Time Mode: FPSRun by number frame/giof seconds.
Row ModeSelect a specific row, a random row, or by mesh index.
Random RowEach particle picks a random row when using Single Row.
RowSelect a fixed row.
Frame over TimeThe curve determines frame progression over time.
Start FrameStarting frame. Can be randomized so particles are not synchronized too mechanically.
CyclesHow many times the animation loops over the lifetime.
Affected UV ChannelsWhich UV stream this module affects.

Sprites mode

PropertyEffect
Frame over TimeSelect the sprite frame over time.
Start FrameInitial sprite frame.
CyclesNumber of animation loops.
Enabled UV ChannelsUV channel used.

Used for:

  • Flipbook-style explosions.
  • Animated fire.
  • Smoke flipbook.
  • Animating magic runes.

27. Lights: particles emit real light

This module attaches real-time Light to part of a particle.

PropertyEffect
LightLight prefab used for particles.
RatioRatio of particles with light. 0.1 means about 10%.
Random DistributionOn: random particles get light; off: distributed cyclically.
Use Particle ColorLight takes its color from the particle.
Size Affects RangeA larger particle makes the light range larger.
Alpha Affects IntensityA more transparent particle makes the light weaker.
Range MultiplierCurve multiplies light range over the lifetime.
Intensity MultiplierCurve multiplies light intensity over the lifetime.
Maximum LightsLimit the maximum number of lights to avoid lag FPS.

Mobile tip: real-time lights are very expensive. If you only need glow, additive material or a glow sprite is usually cheaper.


28. Trails: trails left behind particles

Trails for particles to leave a trail behind.

PropertyEffect
Mode: ParticleEach particle has its own trail.
Mode: RibbonConnect particles into a ribbon based on age.
RatioRatio of particles with trails.
LifetimeHow long a trail vertex lives, usually based on particle lifetime.
Minimum Vertex DistanceHow far a particle moves before the trail adds a new vertex.
World SpaceTrail vertices remain in world space, not pulled along with the object.
Die With ParticlesWhen the particle dies, the trail disappears immediately; if disabled, the trail fades out naturally over its lifetime.
Ribbon CountNumber of ribbons when using ribbon mode.
Split Sub Emitter RibbonsWith sub emitters, particles sharing the same parent share one ribbon.
Texture ModeHow the texture is laid out on the trail: stretch, tile, repeat per segment, distribute per segment.
Size affects WidthA larger particle makes the trail wider.
Size affects LifetimeA larger particle makes the trail live longer.
Inherit Particle ColorThe trail takes its color from the particle.
Color over LifetimeThe color of the whole trail over particle age.
Width over TrailTrail width along the trail length.
Color over TrailTrail color along the trail length.
Generate Lighting DataCreate normal/tangent so the trail receives lighting.
Shadow BiasShadow bias to reduce artifacts.

Used for:

  • Slash trails.
  • Shooting stars.
  • Spark trails.
  • Coin sparkle.

29. Custom Data: custom data for particles

This module lets you add custom data to each particle through 2 channels:

  • Custom1
  • Custom2

This data is usually used for shaders or special gameplay.

PropertyEffect
Mode: DisabledNo custom data.
Mode: VectorVector data with up to 4 components: X/Y/Z/W.
Mode: ColorHDR color/gradient data.
Number of ComponentsNumber of vector components used, from 1 to 4.
X/Y/Z/WCurve or random value for each component.
ColorColor/gradient/custom color data.

Advanced example:

  • Shader reads Custom1.x to dissolve particles.
  • Shader reads Custom1.y to choose a noise variant.
  • Gameplay uses custom data to store “temperature,” “damage scale,” or “id.”

Note: if you want to set custom data entirely by script, Unity recommends disabling the module Custom Data.


30. Renderer: how are particles drawn?

Renderer is the module that determines the final image. A particle may be flying very nicely, but if the Renderer material/sort mode is wrong, it still looks broken.

PropertyEffect
Render Mode: BillboardParticle is always a quad rotated to match the alignment direction. Most commonly used.
Render Mode: Stretched BillboardParticle is stretched along camera/velocity. Used for speed lines, rain, fast sparks.
Render Mode: Horizontal BillboardQuad lies parallel to the XZ plane.
Render Mode: Vertical BillboardQuad stands upright along the Y axis and faces the camera.
Render Mode: MeshParticle is rendered as a 3D mesh.
Render Mode: NoneDo not draw particles, usually used only when you want to draw Trails.
Normal DirectionHow billboard lighting is calculated: like a sphere or a plane.
MaterialMain material used to render particles. This is where shader/blend mode takes effect.
Trail MaterialMaterial used for trails.
Sort ModeRender order of particles within the same system: by distance, oldest, youngest, by depth…
Sorting FudgeSort order bias between the Particle System and other transparent objects.
Min Particle SizeMinimum size on the viewport.
Max Particle SizeMaximum size on the viewport.
Render AlignmentParticle rotates according to camera, world, local, facing, or velocity.
Enable Mesh GPU InstancingWhen rendering mesh particles, use GPU instancing if the shader supports it.
FlipMirror part of the particle along an axis to create variants.
Allow RollAllow particles to camera-facing rotate around the camera axis. Disabling this is useful in VR.
PivotMove the particle’s rotation pivot.
Visualize PivotShow the pivot in the Scene View.
MaskingParticle interacts with Sprite Mask: no mask, visible inside, visible outside.
Apply Active Color SpaceWhen in Linear Color Space, convert particle colors from Gamma before sending GPU.
Custom Vertex StreamsChoose the particle data sent to the shader. Very important when writing custom shaders.
Cast ShadowsWhether the particle casts shadows.
Shadow BiasReduce shadow artifacts of billboard/trail.
Motion VectorsWhether to write motion vectors for the renderer.
Receive ShadowsWhether the particle receives shadows. Usually only works well with opaque materials.
Sorting Layer IDRenderer sorting layer, very important in 2D.
Order in LayerOrder within the sorting layer.
Light ProbesHow particles receive lighting from light probes.
Reflection ProbesHow to receive reflection probe.
Anchor OverrideTransform used as the probe interpolation point.

Stretched Billboard settings

PropertyEffect
Camera ScaleStretch particles according to camera movement.
Velocity ScaleStretch particles according to speed.
Length ScaleStretch according to the current size along the velocity direction.
Freeform StretchingKeeps the stretch looking better when viewed head-on.
Rotate With StretchRotate particles according to the stretch direction.

Mesh render settings

PropertyEffect
Mesh Distribution: Uniform RandomRandomize meshes evenly.
Mesh Distribution: Non-uniform RandomRandomize by weight.
Mesh WeightingsMeshes with higher weight appear more often.

Tip: if particles do not appear, check Renderer > Material first. Many “missing” particle bugs are due to material/shader/blend/sorting.


31. Particle System Force Field component

This is not a module inside the Particle System, but a separate component for creating a force area that affects particles when External Forces enabled.

GroupPropertyEffect
ShapeShapeShape of the affected area.
ShapeStart RangeInner area where the effect starts.
ShapeEnd RangeOuter area where the effect ends.
ShapeDirection X/Y/ZLinear force along the axis.
GravityStrengthDegree of attraction of particles toward the focal point.
GravityGravity FocusWhether the attraction point is at the center or the edge of the shape.
RotationSpeedSpin speed around the vortex.
RotationAttractionThe force that pulls particles into the swirling motion.
RotationRotation RandomnessRandomize the spin axis.
DragStrengthDrag slows particles down.
DragMultiply Drag by SizeLarger particles experience stronger drag.
DragMultiply Drag by VelocityFaster particles experience stronger drag.
Vector FieldVolume TextureThe 3D texture contains a vector field.
Vector FieldSpeedThe strength when particles pass through the vector field.
Vector FieldAttractionThe force that pulls particles into the vector field motion.

32. Controlling the Particle System with C

ParticleSystem is a component in UnityEngine.

Basic example:

using UnityEngine;

public class ParticleExample : MonoBehaviour
{
    [SerializeField] private ParticleSystem effect;

    public void PlayEffect()
    {
        effect.Play();
    }

    public void StopEffect()
    {
        effect.Stop();
    }
}

Enable/disable modules by script

Modules in scripts are special structs. You need to take the module out into a local variable and then set it:

var emission = effect.emission;
emission.enabled = true;
emission.rateOverTime = 20f;

Do not write it like this:

// Không compile:
// effect.emission.enabled = true;

Some API commonly used

APIEffect
Play()Play particles.
Pause()Pause.
Stop()Stop.
Clear()Clear living particles.
Emit(count)Spawn a number of particles immediately.
Simulate(time)Simulate forward to a specific point in time.
IsAlive()Check whether there are still living particles or whether it will continue emitting.
particleCountThe number of particles currently alive.
TriggerSubEmitter()Manually activate the sub emitter.

33. Practical formulas for some effects

Soft cooking smoke

ModuleSuggestion
MainStart Lifetime 2-4s, Start Speed low, Simulation Space = World.
EmissionRate over Time 5-20.
ShapeCircle or Cone small.
Velocity over LifetimeA slight upward Y.
NoiseLow Strength-medium, low Frequency.
Size over LifetimeSmall → gradually larger.
Color over LifetimeLight gray with high alpha → alpha 0.
RendererSoft smoke material, transparent/additive depending on the style.

Spark when receiving coin reward

ModuleSuggestion
MainLifetime 0.3-0.8s, random speed.
EmissionBurst 10-30, Rate over Time 0.
ShapeSphere/Circle small.
Color over LifetimeGold/white → transparent.
Size over LifetimeScale up quickly, then shrink/disappear.
TrailsLow Ratio-medium if you want sparkle.
RendererAdditive material.

Foot dust when the character runs

ModuleSuggestion
MainSimulation Space = World, Lifetime 0.4-1s, light Gravity.
EmissionRate over Distance instead of Rate over Time.
ShapeCircle/Edge at the feet.
Velocity over LifetimePush outward horizontally and slightly upward.
NoiseVery light.
Size over LifetimeSmall → large → fade.
Color over LifetimeBrown/gray → alpha 0.

Fast hit impact

ModuleSuggestion
MainVery short Lifetime 0.1-0.4s.
EmissionSingle Burst.
ShapeCone or Sphere.
Start SpeedQuite high, random.
Color over LifetimeBright white/gold → alpha 0.
Size over LifetimePop quickly and then disappear.
RendererAdditive or alpha blend depending on the style.

34. Debug checklist when particles are not as intended

SymptomCheck
No particles visiblePlay On Awake, Emission, Renderer Material, layer/camera/sorting, alpha in color.
Particles are spawned too fewRate over Time, Bursts, Max Particles, lifetime is too short.
Particles are spawned too manyRate, Bursts, Sub Emitters, Looping, Max Particles.
The effect is being attached to the wrong objectSimulation SpaceTry World instead of Local.
Particles are cut off when they go outside the screen/cameraBounds/culling, Culling Mode, material/sorting.
Looks too even/fakeRandom Start Size, Start Lifetime, Start Rotation, add a light Noise.
Drop FPSReduce Max Particles, reduce overdraw/size, disable Lights, reduce Collision, reduce Noise Octaves, limit Sub Emitters.
2D particles are on the wrong layerRenderer > Sorting Layer ID and Order in Layer.
Transparent sort is wrongSort Mode, Sorting Fudge, material render queue, sorting layer.

35. Performance optimization checklist

Particles look nice, but they can be very resource-intensive because of overdraw and particle count.

Prioritize checking:

  1. Max Particles is too high?
  2. Are the particles too large, covering too much of the screen?
  3. Does the material additive/transparent cause heavy overdraw?
  4. Is Collision World High enabled?
  5. Are there too many Sub Emitters ?
  6. Is Lights enabled for many particles?
  7. Noise Octaves is too high?
  8. Are many Particle Systems running in a loop even while off-screen not?
  9. Have you used effect pooling instead of instantiate/destroy continuously yet?
  10. Is object/effect turned off when not in use?

For mobile idle games, you usually should:

  • Use sprite/material fake glow instead of real-time light.
  • Use small bursts, short lifetimes.
  • Use pooling for effect prefabs.
  • Limit real collision.
  • Test on a real device, not just in the Editor.

36. Suggested learning path

If you're just starting out, don't enable all modules at once. Learning in this order will help it stick better:

  1. Main: lifetime, speed, size, color, simulation space.
  2. Emission: rate and burst.
  3. Shape: spawn area and flight direction.
  4. Color over Lifetime: fade in/out.
  5. Size over Lifetime: scale over time.
  6. Renderer: material, sorting, billboard.
  7. Noise: natural motion.
  8. Velocity/Force: advanced flight-direction control.
  9. Trails: trailing.
  10. Collision/Trigger/Sub Emitters: advanced interaction.

A small exercise:

  • Create Smoke.
  • Create Coin Spark.
  • Create Hit Impact.
  • Create Foot Dust.

After these 4 effects, you'll understand most of the real-world particle workflow.