Teqvault.study โ€” Bonus Course

Particle Systems Mastery

Create stunning visual effects in Unity โ€” rain, fire, snow, magic, ocean, glow, lights, and more. Every effect explained from scratch.

๐Ÿ”ฅ ๐Ÿ’ง โ„๏ธ โœจ ๐ŸŒŠ ๐Ÿ’ซ ๐ŸŒŸ โšก
FX Progress
0%
MODULE 01

Particle System Fundamentals

Every property explained โ€” emission, shape, lifetime, velocity, color over life, size over life, and the Shader setup that makes particles look great.

โœจ What Is a Particle System?

A Particle System is a component that spawns many small sprites (called particles) and simulates them independently โ€” each with its own position, velocity, rotation, color, and lifetime. Together they create the illusion of fluids, smoke, fire, magic, and weather.

Unity's built-in particle system is called Shuriken. For advanced VFX, Unity 6 includes the Visual Effect Graph (VFX Graph) โ€” GPU-based, supports millions of particles.

SystemMax ParticlesBest For
Shuriken (ParticleSystem)~10,000Mobile, simple FX
VFX GraphMillionsPC/console, cinematic FX
๐Ÿ“ฆ The Core Modules
Main Module

Duration, Looping, Lifetime, Speed, Gravity. The master settings.

Emission

Rate over Time, Rate over Distance, Burst spawning.

Shape

Where particles spawn: Sphere, Cone, Box, Edge, Circle, Mesh.

Velocity over Lifetime

Add velocity curves โ€” make fire rise, snow drift sideways.

Color over Lifetime

Gradient from spawn to death โ€” fire goes orangeโ†’redโ†’black.

Size over Lifetime

Start big, shrink to nothing. Or start small, expand.

Rotation over Lifetime

Spin particles. Great for leaves, debris, embers.

Noise

Turbulence โ€” makes motion organic. Essential for smoke & magic.

Renderer

Material, sorting, render mode (Billboard, Mesh, Stretched).

Sub Emitters

Particles that spawn other particles on birth/death โ€” sparks on impact.

Trails

Each particle leaves a ribbon trail. Magic streaks, comet tails.

Lights

Each particle emits a real-time light. Glowing embers, fireflies.

๐ŸŽจ The Particle Material โ€” Additive Blending

Most glowing FX use Additive blending โ€” particles add their color to whatever's behind them. Black = invisible, white = full brightness. This is how fire, magic, and glow work.

  1. Create a Material โ†’ Shader: Universal Render Pipeline/Particles/Unlit.
  2. Set Surface Type: Transparent, Blending Mode: Additive.
  3. Assign a particle texture (soft circle, flame shape, star, etc.) to Base Map.
  4. Set color to white โ€” color control comes from the Particle System's Color over Lifetime.
  5. Assign this material in the Particle System's Renderer module.
๐Ÿ’ก
Premade TexturesUnity's default Particles material includes useful textures: Default-Particle, Default-ParticleSystem, smoke texture. Find them in your project's Packages folder under Universal RP โ†’ Runtime โ†’ Textures.
โŒจ๏ธ Scripting Particle Systems
C# โ€” Controlling Particles
public class FXController : MonoBehaviour
{
    public ParticleSystem rain;
    public ParticleSystem fire;

    void StartRain() {
        rain.Play();
    }
    void StopRain() {
        rain.Stop(withChildren: true,
                     stopBehavior: ParticleSystemStopBehavior.StopEmitting);
    }

    // Change emission rate at runtime
    void SetRainIntensity(float rate) {
        var em = rain.emission;
        em.rateOverTime = rate;
    }

    // Change fire color at runtime
    void SetFireColor(Color c) {
        var main = fire.main;
        main.startColor = c;
    }

    // One-shot burst at position
    void SpawnImpact(Vector3 pos) {
        ParticleSystem ps = Instantiate(fire, pos, Quaternion.identity);
        ps.Play();
        Destroy(ps.gameObject, ps.main.duration + ps.main.startLifetime.constantMax);
    }
}
MODULE 02

๐ŸŒง๏ธ Rain Effect

Directional streaks, splash sub-emitters, puddle ripples, and a wet-surface shader โ€” create a full rain storm system.

Live Preview
๐ŸŒง๏ธ
๐ŸŒง๏ธ Rain Particle โ€” Step by Step
  1. Main Module: Duration: 5, Loop: โœ…, Start Lifetime: 1.5, Start Speed: 15, Start Size: 0.05, Gravity: 1, Max Particles: 2000.
  2. Emission: Rate over Time: 400. For a storm, use 600โ€“800.
  3. Shape: Box. Width: 20, Height: 1, Depth: 20. Position Y: 8 (above the scene). This rains down over a 20ร—20 meter area.
  4. Renderer: Render Mode: Stretched Billboard, Speed Scale: 0.5, Length Scale: 2. This makes drops look like streaks moving downward.
  5. Color over Lifetime: Start: rgba(180,220,255,0.9), End: rgba(180,220,255,0). Fades out at the end.
  6. Sub Emitters: Enable โ†’ Birth: assign a "Splash" particle system (small upward burst of 3โ€“5 tiny white particles).
๐Ÿ’ก
Rain Rotation TrickRotate the entire Particle System GameObject to match your rain angle. For sideways rain, tilt it 20โ€“30ยฐ on X. The Shape always emits in local space, so the whole rain tilts together.
๐Ÿ’ฆ Splash Sub-Emitter
  1. Create a child Particle System called "RainSplash".
  2. Main: Duration: 0.3, Loop: โŒ, Start Lifetime: 0.4, Start Speed: 1.5, Start Size: 0.08, Gravity: 2.
  3. Emission: Burst at time 0 โ†’ Count: 5.
  4. Shape: Hemisphere, Radius: 0.1. Particles spread outward and upward.
  5. Color: white โ†’ transparent. Size over Lifetime: big โ†’ small.
  6. In the parent Rain system โ†’ Sub Emitters โ†’ + โ†’ set Splash here. Condition: Collision.
๐ŸŒŠ Puddle Ripple Effect
  1. Create another child Particle System: "RainRipple".
  2. Main: Lifetime: 1.2, Start Size: 0.3, Start Speed: 0, Max Particles: 100.
  3. Shape: Circle, Radius: 0 (emit from center point).
  4. Size over Lifetime: 0 โ†’ 1 (ring expands outward).
  5. Color over Lifetime: solid โ†’ fully transparent (ring fades as it expands).
  6. Renderer: Material using a ring sprite (white circle with hole in center). Render Mode: Billboard.
๐ŸŽ›๏ธ Rain Settings Reference
PropertyLight RainStormHurricane
Rate over Time150400800
Start Speed101522
Start Lifetime21.51
Gravity0.511.5
Max Particles50020004000
Tilt (X rotation)0ยฐ10ยฐ30ยฐ
MODULE 03

โ„๏ธ Snow Effect

Soft drifting flakes, turbulence noise for organic movement, accumulation decals, and a blizzard variant.

โ„๏ธ Snow Particle โ€” Step by Step
  1. Main Module: Duration: 5, Loop: โœ…, Start Lifetime: min 4, max 8 (random between two constants), Start Speed: min 0.5, max 2, Start Size: min 0.03, max 0.12, Gravity: 0.05, Max Particles: 500.
  2. Emission: Rate over Time: 60. (Snow is gentler than rain โ€” fewer, slower particles.)
  3. Shape: Box, Width: 20, Depth: 20, Height: 0. Position Y: 8. Emit from the Volume (not just the Surface).
  4. Velocity over Lifetime: X: curve oscillating between -0.5 and 0.5 (drift left/right). Y: -0.5 constant (gentle fall).
  5. Noise Module: Strength: 0.3, Frequency: 0.5, Scroll Speed: 0.1. This makes flakes drift organically.
  6. Rotation over Lifetime: Angular Velocity: random between -30 and 30. Flakes spin slowly.
  7. Size over Lifetime: Stays roughly constant (use a flat curve, slight fade at end).
  8. Color over Lifetime: Start rgba(255,255,255,0.9), End rgba(255,255,255,0). Fades gently.
  9. Renderer: Material with a soft white circle sprite. Mode: Billboard.
๐ŸŒจ๏ธ Blizzard Variant
PropertyGentle SnowBlizzard
Rate over Time60300
Start Speed0.5 โ€“ 25 โ€“ 12
Noise Strength0.31.5
Gravity0.050.3
System Tilt X5ยฐ40ยฐ
Velocity Xยฑ0.5ยฑ4
๐Ÿ“œ Snow Accumulation (Decal Shader)

For surfaces that accumulate snow over time, use a URP Decal Projector:

  1. Add โ†’ 3D Object โ†’ Decal Projector to the scene.
  2. Create a Decal material: Shader Graph โ†’ URP Decal. Set Base Map to a white noise snow texture.
  3. In C#, animate the Decal Projector's fadeFactor from 0โ†’1 over 10 seconds to show snow building up.
MODULE 04

๐Ÿ”ฅ Fire Effect

Three-layer fire (core, mid, smoke), heat distortion, embers, and a campfire system with dynamic light flickering.

๐Ÿ”ฅ The Three-Layer Fire System

Realistic fire is three stacked particle systems, each representing a different part of the flame:

Layer 1: Core Flame

Bright white-yellow center. Small, fast, hot. Additive blend. 50 particles max.

Layer 2: Mid Flame

Orange-red body. Medium speed, drifts upward. Soft additive. 80 particles.

Layer 3: Smoke

Dark gray, expands, rises. Alpha blend. Slow, large, noisy. 30 particles.

๐Ÿ”ฅ Core Flame Settings
  1. Main: Lifetime: 0.5โ€“0.8, Speed: 2โ€“4, Size: 0.3โ€“0.6, Max: 50. Simulation Space: World.
  2. Emission: Rate: 80.
  3. Shape: Cone, Angle: 10, Radius: 0.1. Tight upward stream.
  4. Velocity over Lifetime: Y: 1.5 (rises fast). Add slight X wobble: sin curve ยฑ0.3.
  5. Color over Lifetime: #ffffff โ†’ #fffba0 โ†’ #ffaa00 โ†’ #ff4400 โ†’ transparent. White hot โ†’ yellow โ†’ orange โ†’ fades.
  6. Size over Lifetime: Ramp up from 0 โ†’ 1 โ†’ 0 (grows then shrinks).
  7. Noise: Strength: 0.4, Frequency: 2. Makes flame flicker organically.
  8. Renderer: Additive material, billboard, Sorting Layer: VFX.
๐Ÿ’จ Smoke Settings
  1. Main: Lifetime: 3โ€“5, Speed: 0.5โ€“1, Start Size: 0.4โ€“0.8, Max: 30. Gravity: -0.1 (floats upward).
  2. Shape: Cone, Angle: 30, Radius: 0.15. Wider spread than core.
  3. Color over Lifetime: rgba(80,80,80,0) โ†’ rgba(80,80,80,0.5) โ†’ rgba(0,0,0,0). Appears mid-life, fades out.
  4. Size over Lifetime: 0.5 โ†’ 2.5. Smoke expands as it rises.
  5. Velocity over Lifetime: Y: 0.8. Noise Strength: 1.2, Frequency: 0.3. Very turbulent.
  6. Renderer: Alpha Blend material (not additive โ€” smoke is opaque, not glowing). Sort in front of environment, behind characters.
๐ŸŒŸ Ember Sub-Emitter
  1. Small, bright orange-white dots. Main: Lifetime: 1.5โ€“3, Speed: 2โ€“5, Size: 0.04, Max: 50.
  2. Emission: Burst mode โ€” spawn 2โ€“4 every 0.2 seconds.
  3. Velocity over Lifetime: Y: 0.5โ€“2, X: random ยฑ1. Embers fly upward and sideways.
  4. Rotation over Lifetime: ยฑ180 deg/sec โ€” they spin.
  5. Color: white-orange โ†’ transparent. Additive blend.
  6. Lights module: Enable โ†’ Ratio: 0.3. 30% of embers emit a real point light! Max Lights: 4. Intensity: 0.5, Range: 0.5. This creates real flickering light from embers.
๐Ÿ’ก Flickering Fire Light (Script)
C# โ€” FireLightFlicker.cs
public class FireLightFlicker : MonoBehaviour
{
    public Light  fireLight;
    public float baseIntensity  = 3f;
    public float flickerAmount  = 1.5f;
    public float flickerSpeed   = 12f;
    private float noise;

    void Update()
    {
        noise = Mathf.PerlinNoise(Time.time * flickerSpeed, 0);
        fireLight.intensity = baseIntensity + (noise - 0.5f) * flickerAmount;
        // Optional: slight color shift hotโ†’cool
        fireLight.color = Color.Lerp(
            new Color(1f, 0.5f, 0.1f),
            new Color(1f, 0.8f, 0.3f),
            noise);
    }
}
MODULE 05

๐Ÿ’ง Water & Bubbles

Drips, splashes, water jets, rising bubbles, and underwater ambient particles.

๐Ÿ’ง Water Drip Effect
  1. Main: Lifetime: 0.8, Speed: 4, Start Size: 0.08, Gravity: 2, Max: 20.
  2. Emission: Burst โ€” 1 particle every 0.5 seconds (drip drip drip).
  3. Shape: Point (single emission point).
  4. Velocity: Y: -5 (falls down), no X deviation for clean drip.
  5. Color: rgba(100,180,255,0.9) โ†’ transparent. Size over Lifetime: constant then rapid shrink at end (splat).
  6. Sub Emitters โ†’ Collision: tiny splash burst (5 particles in cone, upward, size 0.04, lifetime 0.3).
๐Ÿซง Bubbles (Rising)
  1. Main: Lifetime: 2โ€“4, Speed: 0.5โ€“1.5, Start Size: 0.05โ€“0.2 (random), Gravity: -0.5 (negative = floats up), Max: 80.
  2. Emission: Rate: 15.
  3. Shape: Box (represents underwater floor area). Width/Depth: 5, Height: 0.
  4. Velocity over Lifetime: Y: 1. Slight X wobble (sin oscillation ยฑ0.2).
  5. Color: rgba(150,220,255,0.6) โ†’ rgba(200,240,255,0.1). Semi-transparent, fades at top.
  6. Size over Lifetime: small โ†’ grows slightly โ†’ pops (shrinks to 0 at end).
  7. Renderer: Material with a circle sprite, set to Transparent blend (not additive โ€” bubbles aren't glowing).
๐Ÿซง
Bubble PopUse Sub Emitters โ†’ Death: spawn a tiny 1-frame sparkle burst (4 particles, outward, white, size 0.03). This gives the satisfying "pop" visual when a bubble reaches the surface.
๐Ÿ’ฆ Water Jet / Fountain
  1. Main: Lifetime: 1โ€“2, Speed: 8โ€“12, Gravity: 2, Start Size: 0.1โ€“0.15, Max: 200.
  2. Emission: Rate: 150.
  3. Shape: Cone, Angle: 5โ€“15 (tight stream), Radius: 0.02.
  4. Velocity over Lifetime: Limit over Lifetime: 0.5 (drag โ€” slows particles naturally like water).
  5. Collision Module: Enable โ†’ Type: World. Dampen: 0.2, Bounce: 0.1. Particles collide with the ground/pool surface.
  6. Sub Emitters โ†’ Collision: splash burst.
MODULE 06

๐ŸŒŠ Ocean & Water Surface

Ocean uses a combination of a shader-animated mesh + particle foam/spray โ€” not a pure particle system.

๐ŸŒŠ Ocean Architecture

Real game oceans combine three systems:

1. Wave Mesh Shader

A subdivided plane animated by a Shader Graph vertex displacement using sine waves.

2. Foam Particles

White particle sprites along wave crests and shorelines.

3. Spray Particles

Fine mist particles above wave crests, additive blend.

๐ŸŒŠ Ocean Shader (Shader Graph)
  1. Create a Shader Graph: URP Lit. Set Surface: Transparent.
  2. In Vertex stage: add a Position node (object space). Feed the Y into a Sine node driven by Time ร— waveSpeed + X ร— waveFrequency. Output to Vertex Position Y. This makes the mesh ripple.
  3. For depth color: sample screen-space depth, blend between shallow color (light cyan) and deep color (dark blue) based on depth value.
  4. Add Normal Map from a tiling water normal texture, scrolling over time (two UV sets scrolling in opposite directions for complex ripple).
  5. Set Smoothness: 0.95. Specular: high. This gives the glossy water look.
๐Ÿ’ก
Mobile OceanFor mobile, skip vertex displacement (expensive on lower-end GPUs). Use a flat plane with a good scrolling normal map + color gradient. Add foam particles along edges. This looks 90% as good at 10% the cost.
๐Ÿ„ Foam & Spray Particles
  1. Foam: Large, white, soft-edged circle sprites. Lifetime: 2โ€“4, Speed: 0, Size: 0.5โ€“1.5. Shape: Edge along shoreline or wave crest. Alpha blend, not additive. Slow fade-in and fade-out.
  2. Spray/Mist: Tiny white dots. Lifetime: 0.5โ€“1, Speed: 1โ€“3 (upward + outward from wave). Additive blend. Size: 0.03โ€“0.08. Noise Strength: 1. Creates fine water mist that catches light beautifully.
MODULE 07

๐Ÿ”ด Fireballs & Projectiles

A moving fireball with trailing fire, a glowing core, and an impact explosion โ€” all driven from a prefab that travels through the scene.

๐Ÿ”ด Fireball Prefab Structure
Fireball (GameObject) โ”œโ”€โ”€ SphereCollider โ€” hit detection โ”œโ”€โ”€ Rigidbody (Kinematic) โ€” position controlled by script โ”œโ”€โ”€ Light โ€” orange point light, range 3, intensity 5 โ”œโ”€โ”€ FireballCore (PS) โ€” glowing sphere sprite, additive โ”œโ”€โ”€ FireTrail (PS) โ€” fire particles streaming backward โ””โ”€โ”€ FireballScript โ€” moves forward, triggers explosion on hit
๐Ÿ”ฅ Fireball Trail Settings
  1. Main: Lifetime: 0.6, Speed: 0, Start Size: 0.4โ€“0.8, Max: 100. Simulation Space: World (critical โ€” trail stays behind in world space as fireball moves).
  2. Emission: Rate: 60.
  3. Shape: Sphere, Radius: 0.1. Emits in all directions from the fireball center.
  4. Velocity over Lifetime: Orbital mode โ€” slight spiral for swirling fire trail.
  5. Color over Lifetime: white โ†’ yellow โ†’ orange โ†’ red โ†’ transparent.
  6. Size over Lifetime: 1 โ†’ 0. Shrinks as the trail ages (particles get smaller as they fall behind).
  7. Noise: Strength: 0.8, Frequency: 3. Organic swirling motion.
๐Ÿ’ฅ Impact Explosion (On Hit)
C# โ€” FireballController.cs
public class Fireball : MonoBehaviour
{
    public float         speed     = 12f;
    public ParticleSystem explosion;
    public float         damage    = 40f;
    public float         blastRadius = 3f;

    void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player") || other.CompareTag("Environment"))
        {
            Explode();
        }
    }

    void Explode()
    {
        // Detach explosion, disable travel
        var vfx = Instantiate(explosion, transform.position, Quaternion.identity);
        vfx.Play();
        Destroy(vfx.gameObject, 3f);

        // Area damage
        Collider[] hits = Physics.OverlapSphere(transform.position, blastRadius);
        foreach (var h in hits)
        {
            var hp = h.GetComponent<Health>();
            if (hp != null) hp.TakeDamage(damage);
        }

        Destroy(gameObject);
    }
}
๐Ÿ’ฅ Explosion Particle System
  1. Shape: Sphere, Radius: 0.3. Emits in all directions.
  2. Emission: Burst โ€” Count: 60, Time: 0. One massive simultaneous burst.
  3. Main: Lifetime: 0.6โ€“1.2, Speed: 5โ€“15 (fast outward), Size: 0.3โ€“0.8, Gravity: 0.5.
  4. Color: white โ†’ orange โ†’ dark red โ†’ transparent (fast fade).
  5. Add a separate Shockwave: a single disc particle, starts small, expands quickly, flat, additive white. Size over Lifetime: 0 โ†’ 3 over 0.3 seconds.
  6. Add Debris sub-system: dark gray chunks, gravity 2, bounce collision, slow rotation. Stays on the ground after explosion.
MODULE 08

๐Ÿ”ฎ Magic & Spells

Portal vortex, floating rune particles, energy beams, magic circle, and a fully scripted spell casting system.

โœจ Magic Sparkle Effect (Basic)
  1. Main: Lifetime: 1โ€“2, Speed: 0.5โ€“2, Start Size: 0.05โ€“0.15, Max: 150.
  2. Emission: Rate: 40. Also add 3 Bursts spaced 0.5s apart, Count: 8.
  3. Shape: Sphere, Radius: 0.5. Particles spawn in a sphere around the caster.
  4. Velocity over Lifetime: Orbital โ€” X: 2, Y: 2. Particles orbit the center like electrons around an atom.
  5. Color: random from gradient: purple, cyan, white, gold. Use "Random Between Two Colors" mode for magical variety.
  6. Noise: Strength: 0.5, Frequency: 1.5. Subtle shimmer movement.
  7. Trails Module: Enable โ†’ Lifetime: 0.3, Width: 0.02. Each sparkle leaves a short glowing trail.
  8. Renderer: Star or cross sprite, Additive blend.
๐ŸŒ€ Portal Vortex
  1. Main: Lifetime: 2, Speed: 1โ€“3, Gravity: 0, Max: 300.
  2. Shape: Circle, Radius: 2, Emit from Edge. Particles start at the outer edge.
  3. Velocity over Lifetime: Orbital โ€” spin particles. Also add Linear Y: slight pull toward center.
  4. Color: outer starts dark, inner goes bright cyan/purple. Over Lifetime: dark purple โ†’ bright cyan โ†’ white.
  5. Size over Lifetime: starts large, shrinks to 0 as they reach center (sucked in).
  6. Rotation over Lifetime: 180 deg/sec. Particles spin as they spiral inward.
  7. Add a second system with larger, slower particles (ring wisps) for layered depth.
โšก Energy Beam (Line Renderer + Particles)

A beam is a LineRenderer for the core, plus particle systems for charge-up and impact.

C# โ€” MagicBeam.cs
public class MagicBeam : MonoBehaviour
{
    public LineRenderer  beam;
    public Transform     target;
    public ParticleSystem impactVFX;
    public float         widthPulse = 0.05f;

    void Update()
    {
        // Draw beam from caster to target
        beam.SetPosition(0, transform.position);
        beam.SetPosition(1, target.position);

        // Pulse the width for energy feel
        float w = widthPulse + Mathf.Sin(Time.time * 20f) * 0.01f;
        beam.startWidth = w;
        beam.endWidth   = w * 0.5f;

        // Move impact VFX to beam endpoint
        impactVFX.transform.position = target.position;
    }
}

Set the LineRenderer material to Additive + a beam texture (white gradient from center to edge). Add a blue/purple point light to the target impact VFX.

๐Ÿ”ฏ Magic Circle Ground Effect
  1. Create a flat quad at Y=0.01 (just above ground). Material: Additive, with a magic circle rune texture. Animate rotation via script.
  2. Add a particle system on the circle edge (Shape: Circle, Radius: 1.5, Emit from Edge). Slow-rising magical wisps.
  3. Add rising rune sprites (Texture Sheet Animation module, multiple rune frames, random start frame). Particles float up and fade.
MODULE 09

โœจ Glow & Bloom

URP Bloom post-processing, emissive materials, glowing particles, HDR colors, and the full pipeline for making things luminous.

๐Ÿ’ก How Glow Works in Unity

Glow is not a particle effect โ€” it's a post-processing effect called Bloom. Here's how the pipeline works:

  1. Objects use HDR (High Dynamic Range) colors โ€” values above 1.0 in the color picker. Normal colors max at 1.0; HDR goes to 3.0, 5.0, 10.0+.
  2. URP renders the scene normally.
  3. Bloom post-process reads all pixels brighter than a threshold and bleeds their light outward โ€” creating the glow halo.
  4. Result: anything emitting HDR light glows. Regular colored objects don't.
โš™๏ธ Setting Up Bloom
  1. Project Settings โ†’ Graphics โ†’ Scriptable Render Pipeline Settings โ†’ your URP asset. Ensure HDR: On and Post Processing: On.
  2. In Scene: Add โ†’ Volume โ†’ Global Volume. Add a new Profile.
  3. Add Override โ†’ Bloom. Set Threshold: 1.0 (glow anything above this), Intensity: 0.5โ€“1.5, Scatter: 0.7.
  4. Also add Color Adjustments (slight saturation +10) and Vignette for atmosphere.
  5. On Camera: ensure Post Processing: โœ….
โš ๏ธ
Enable HDR on CameraEdit โ†’ Project Settings โ†’ Quality โ†’ HDR must be enabled, AND the Camera component must have Allow HDR checked. Without both, Bloom won't work.
๐ŸŽจ Making Things Glow

Emissive Material:

  1. Material โ†’ URP/Lit โ†’ enable Emission.
  2. Set Emission Color using the HDR color picker โ€” drag intensity above 1.0.
  3. This material now glows wherever Bloom is active.

Glowing Particle:

  1. Additive particle material automatically glows with Bloom enabled.
  2. Set Start Color to HDR white (intensity 3.0+).
  3. White additive particles become intense bloom halos.
โœจ Glowing Firefly Effect
  1. Main: Lifetime: 4โ€“8, Speed: 0.2โ€“0.8, Size: 0.06โ€“0.1, Max: 30, Simulation Space: World.
  2. Shape: Box covering scene area.
  3. Velocity over Lifetime: Random between (-1,-0.5,-1) and (1,0.5,1). Gentle drifting.
  4. Noise: Strength: 0.5, Frequency: 0.3, Scroll Speed: 0.1. Organic flight pattern.
  5. Color over Lifetime: starts transparent, peaks at HDR yellow-green (R:0.6, G:1.0, B:0.2, A:1.0, Intensity: 2.5), fades out. Pulsing blink effect.
  6. Lights Module: Ratio: 0.5. Half of fireflies emit a real point light (range 0.8, intensity 0.6, color warm green).
MODULE 10

๐Ÿ’ก Dynamic Lights

Particle-driven lights, animated light patterns, color-shifting dramatic effects, and the Lights module deep dive.

๐Ÿ’ก The Particle Lights Module

The Lights module in a Particle System lets each particle emit a real-time Unity Light. Used carefully, this creates incredible interactive lighting from effects.

PropertyDescription
LightAssign a Point Light prefab here
Ratio0.0โ€“1.0 โ€” what fraction of particles get a light. Keep below 0.3 for performance.
Random DistributionWhich particles get lights (random vs all)
Use Particle ColorLight color matches particle color (great for fire!)
Size Affects RangeBigger particles = bigger light radius
Alpha Affects IntensityFading particles dim their lights (very realistic)
Range MultiplierScale the light radius
Intensity MultiplierScale brightness
Maximum LightsHard cap โ€” never exceed 8 for mobile
๐Ÿ•ฏ๏ธ Candle / Torch System
  1. Create the flame particle system (see Fire module). Layer: Core, Mid, Embers.
  2. On the Embers system โ†’ Lights Module โ†’ assign a warm orange Point Light prefab. Ratio: 0.2. Max: 3.
  3. On a parent GameObject, attach FireLightFlicker.cs. Perlin noise drives intensity fluctuation.
  4. Result: 2โ€“3 dynamic lights from embers, plus the base flicker, creates convincingly real torch lighting.
๐Ÿ’ก
Bake the Main LightFor a dungeon scene with 20 torches: bake a warm orange light contribution from each torch position. Only the flicker (delta from baked) needs to be realtime. This is how games handle many lights โ€” fake it with baking.
๐ŸŽญ Scripted Light Animation (No Particles)
C# โ€” LightAnimator.cs (Police Siren, Alarm, Disco)
public class LightAnimator : MonoBehaviour
{
    public Light lt;
    public enum Mode { Siren, Alarm, Flicker, Pulse }
    public Mode mode;
    public float speed = 3f;

    void Update()
    {
        float t = Time.time * speed;
        switch (mode) {
            case Mode.Siren:
                lt.color = Mathf.Sin(t) > 0
                    ? Color.red : Color.blue;
                lt.intensity = 5f; break;

            case Mode.Alarm:
                lt.intensity = Mathf.PingPong(t * 2, 6f); break;

            case Mode.Flicker:
                lt.intensity = Mathf.PerlinNoise(t, 0) * 5f; break;

            case Mode.Pulse:
                lt.intensity = (1 + Mathf.Sin(t)) * 2.5f; break;
        }
    }
}
MODULE 11

โšก Lightning & Electricity

Procedural lightning bolts, electric arc particles, charged-up VFX, and a Tesla coil effect.

โšก Lightning Bolt โ€” LineRenderer Method
C# โ€” LightningBolt.cs
public class LightningBolt : MonoBehaviour
{
    public LineRenderer lr;
    public Transform    start, end;
    public int          segments    = 12;
    public float        jaggedness  = 0.4f;
    public float        refreshRate = 0.03f;
    private float       timer;

    void Update()
    {
        timer -= Time.deltaTime;
        if (timer > 0) return;
        timer = refreshRate;
        GenerateBolt(start.position, end.position);
    }

    void GenerateBolt(Vector3 a, Vector3 b)
    {
        lr.positionCount = segments;
        for (int i = 0; i < segments; i++)
        {
            float   t    = (float)i / (segments - 1);
            Vector3 mid  = Vector3.Lerp(a, b, t);
            Vector3 perp = Vector3.Cross((b - a).normalized, Vector3.forward);
            mid += perp * Random.Range(-jaggedness, jaggedness);
            mid += Vector3.up * Random.Range(-jaggedness, jaggedness);
            lr.SetPosition(i, mid);
        }
    }
}

Set the LineRenderer material to Additive with a bright blue-white gradient. Set Width: 0.02. The bolt regenerates every 30ms to create the electric flicker.

โšก Electric Sparks Particle System
  1. Main: Lifetime: 0.2โ€“0.5, Speed: 3โ€“8, Start Size: 0.03โ€“0.06, Gravity: 1, Max: 80.
  2. Emission: Rate: 0. Bursts only โ€” 10โ€“20 sparks every 0.05 seconds.
  3. Shape: Point or tiny Sphere (radius 0.05).
  4. Velocity: Random outward in all directions. Speed: 5โ€“12.
  5. Color: white โ†’ blue-white โ†’ transparent. Very fast fade.
  6. Rotation: 360 deg/sec random. Sparks tumble.
  7. Renderer: Stretched Billboard, Speed Scale: 0.8. Sparks leave bright streaks.
MODULE 12

๐Ÿ’ฅ Explosions & Impact Effects

Full explosion prefab system โ€” shockwave, flash, debris, smoke, fire aftermath, and screen shake integration.

๐Ÿ’ฅ Explosion Prefab โ€” Layer Stack
1. Flash

Instant white sphere. Lifetime: 0.1s. Single burst of 1 giant particle. Size: 5. Additive. The eye-searing first frame.

2. Fireball

Expanding orange sphere. Lifetime: 0.6s. Size: 0โ†’3 quickly. Additive fire material.

3. Shockwave

Ring disc expanding outward. Single flat particle, scale 0โ†’6 in 0.2s. Rim-lit additive ring texture.

4. Smoke

Large billowing gray clouds. Lifetime: 3โ€“6s. Size: 2โ†’8. Alpha blend. Slow turbulent rise.

5. Debris

Dark chunks flying outward. Gravity, bounce, real collision. Stays on ground permanently.

6. Sparks

Fast bright orange lines. Stretched billboard, Speed Scale 1.5. Short lifetime (0.3s). Sizzle out quickly.

๐Ÿ“ณ Screen Shake (Camera Trauma)
C# โ€” CameraShake.cs (Trauma System)
public class CameraShake : MonoBehaviour
{
    public static CameraShake I;
    private float trauma;
    private float seed;
    public float  maxAngle    = 10f;
    public float  maxOffset   = 0.3f;
    public float  traumaDecay = 1.5f;

    void Awake() => I = this;

    public void AddTrauma(float amount) =>
        trauma = Mathf.Clamp01(trauma + amount);

    void Update()
    {
        if (trauma <= 0f) { trauma = 0; return; }

        float shake = trauma * trauma; // quadratic = natural falloff
        seed += Time.deltaTime;

        transform.localRotation = Quaternion.Euler(
            maxAngle * shake * Mathf.PerlinNoise(seed, 0),
            maxAngle * shake * Mathf.PerlinNoise(seed, 1),
            maxAngle * shake * Mathf.PerlinNoise(seed, 2));

        trauma -= traumaDecay * Time.deltaTime;
    }
}

// Usage anywhere โ€” e.g. in explosion script:
// CameraShake.I.AddTrauma(0.6f);
MODULE 13 ๐Ÿ

๐Ÿ“ฑ Mobile FX Optimization

Hit 60fps with great-looking effects โ€” GPU budgets, LOD particles, culling, pooling, and the mobile FX checklist.

๐Ÿ“Š Mobile Particle Budget
EffectSafe Mobile CountMax Count
Rain5001500
Snow150400
Fire (campfire)80200
Magic sparkles60150
Explosion (one-shot)80200
Simultaneous explosions2 max4 max
Particle lights4 max8 absolute max
Total scene particles<20005000 risk
โ™ป๏ธ Particle Pooling
C# โ€” VFXPool.cs (Singleton)
public class VFXPool : MonoBehaviour
{
    public static VFXPool I;
    [System.Serializable]
    public class VFXEntry {
        public string         id;
        public ParticleSystem prefab;
        public int            poolSize = 5;
    }
    public VFXEntry[] effects;
    private Dictionary<string, Queue<ParticleSystem>> pools;

    void Awake() {
        I     = this;
        pools = new Dictionary<string, Queue<ParticleSystem>>();
        foreach (var e in effects) {
            var q = new Queue<ParticleSystem>();
            for (int i = 0; i < e.poolSize; i++) {
                var ps = Instantiate(e.prefab);
                ps.gameObject.SetActive(false);
                q.Enqueue(ps);
            }
            pools[e.id] = q;
        }
    }

    public void Play(string id, Vector3 pos)
    {
        if (!pools.ContainsKey(id) || pools[id].Count == 0) return;
        var ps = pools[id].Dequeue();
        ps.transform.position = pos;
        ps.gameObject.SetActive(true);
        ps.Play();
        StartCoroutine(Return(id, ps));
    }

    IEnumerator Return(string id, ParticleSystem ps)
    {
        yield return new WaitForSeconds(ps.main.duration + 0.5f);
        ps.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
        ps.gameObject.SetActive(false);
        pools[id].Enqueue(ps);
    }
}

// Usage: VFXPool.I.Play("Explosion", hitPoint);
โœ… Mobile FX Checklist
CheckWhy It Matters
โœ… Max Particles set on every systemPrevents runaway spawn on slow devices
โœ… Culling Mode: Pause And Catch UpStops off-screen particles from simulating
โœ… Ring Buffer mode on looping FXReuses particle slots instead of allocating
โœ… Texture atlases for particle spritesOne draw call for all particle types
โœ… Particle Lights: Max โ‰ค 4 per systemReal-time lights are expensive on mobile
โœ… Bloom Intensity โ‰ค 1.5High bloom = GPU bandwidth spike
โœ… No PolygonCollider on particle collisionUse simplified colliders for particle physics
โœ… All one-shot FX pooledDestroy() causes GC spikes = frame drops
โœ… Profiler tested on real devicePC performance โ‰  phone performance
๐ŸŽฏ Final FX Challenge

Build a Complete Death Road Weather System

  • Rain (400 particles/sec) with splash sub-emitter
  • Distant lightning (LineRenderer bolt + flash + thunder sound)
  • Campfire with 3 layers + flickering point light + embers
  • Magic healing effect on player (orbital sparkles + bloom + circle ground projection)
  • Explosion on enemy death (flash + shockwave + debris + smoke + screen shake)
  • All FX pooled, all particle counts within mobile budget
  • Bloom post-processing enabled and tuned
Roadmap