Quick answer: The most common cause is that the Emission module's rate over time is zero or the module is disabled. Other causes include Play On Awake being off without a manual Play() call, the Renderer module being disabled, or Max Particles set to zero.

Here is how to fix Unity particle system not playing. You call ParticleSystem.Play() or enable Play On Awake, but nothing appears. The system exists, the inspector preview works, yet at runtime the particle count stays at zero. Five distinct settings can silently prevent emission, and none of them produce an error.

The Symptom

A ParticleSystem component on an active GameObject produces no visible particles at runtime. The console is clean — no null references, no warnings. Your code reaches the Play() call, the GameObject is active, yet the Particle Effect panel shows zero particles alive.

What Causes This

1. Play On Awake is off and Play() is never called. If someone disabled Play On Awake and your spawn code skips the Play() call, the system sits idle. This is common with pooled effects where the prefab expects manual triggering.

2. Emission rate is zero. Both Rate over Time and Rate over Distance are zero, and no bursts are configured. The system runs but spawns nothing.

3. Renderer module is disabled. Particles simulate internally but never draw. The particle count shows active particles, yet the screen is empty.

4. Max Particles is zero. The Main module's Max Particles field caps allocation. At zero, no particles can exist.

5. Camera culling mask excludes the layer. The particles simulate and render, but your camera cannot see the layer they are on.

The Fix

Step 1: Verify emission and trigger playback.

using UnityEngine;

public class ParticleFixer : MonoBehaviour
{
    [SerializeField] private ParticleSystem _ps;

    void Start()
    {
        var emission = _ps.emission;
        emission.enabled = true;
        if (emission.rateOverTime.constant == 0 && emission.burstCount == 0)
            emission.rateOverTime = 10f;

        _ps.Play();
    }
}

Step 2: Check renderer and max particles.

var renderer = _ps.GetComponent<ParticleSystemRenderer>();
if (!renderer.enabled)
    renderer.enabled = true;

var main = _ps.main;
if (main.maxParticles == 0)
    main.maxParticles = 1000;

Step 3: Verify camera culling includes the particle layer.

int layer = _ps.gameObject.layer;
var cam = Camera.main;
if ((cam.cullingMask & (1 << layer)) == 0)
    cam.cullingMask |= (1 << layer);

Related Issues

If particles play but the camera stutters while tracking the player, see Cinemachine camera jitter and stutter. If you load particle prefabs via Addressables and get null, see Addressables failed to load asset.

If particle count reads zero, the system is fine. The emission config is the problem.