Quick answer: Make sure the system is Playing (call ps.Play() before Emit). Confirm Max Particles is high enough. For pooled systems, call ps.Play(true) on each reuse so a previous Stop is cleared.
You spawn a hit VFX prefab and call Emit(20). Nothing renders. The system was Stopped from a previous use and Emit silently no-ops.
The Symptom
ParticleSystem.Emit returns; ParticleCount stays zero. Editor looks blank. Other particle systems in the same scene fire correctly.
The Fix
public class HitVFX : MonoBehaviour
{
public ParticleSystem ps;
public void SpawnHit(Vector3 pos, Vector3 normal)
{
transform.position = pos;
transform.rotation = Quaternion.LookRotation(normal);
ps.Play(true); // restart cleanly if previously stopped
var p = new ParticleSystem.EmitParams
{
position = pos,
velocity = normal * 5f,
startColor = Color.red
};
ps.Emit(p, 20);
}
}
Play(true) restarts. Emit(EmitParams, count) fires with explicit per-particle values.
Max Particles
Main module → Max Particles. Default 1000. If you spawn 20 but the system already has 980 alive (from a long-lived loop), the next 20 may fail to allocate. Raise Max or shorten Lifetime.
Stop Action
If you Stop with StopEmittingAndClear and reuse, the system is in Stopped state. Without Play(true) before Emit, the call is ignored. Set Stop Action = None on the prefab if you want continuous availability without manual Play.
Verifying
Print ps.isPlaying before and after Emit. Should be true. ParticleCount should be > 0 right after. If stuck at 0, Max Particles or system state is the issue.
“Play before Emit. EmitParams for control. Max Particles high enough. Particles fire.”
Related Issues
For pool callback, see pool callback. For sub-emitter color, see sub-emitter.
Play. Emit. Particles spawn.