Quick answer: Call particles.restart() for one-shot replays. emitting = true alone won’t replay a finished burst.
Hit effect emits once. Player dies, respawns, hits again. Nothing. emitting = true isn’t enough — the one-shot cycle already ended.
The Symptom
First trigger works. Subsequent triggers do nothing visually. Inspector confirms emitting is true.
The Fix
@onready var hit_particles: GPUParticles2D = $HitFx
func play_hit():
hit_particles.restart() # resets timer + re-emits burst
# Inspector setup:
# one_shot: true
# emitting: true (will turn off after one cycle)
# amount: 32
# lifetime: 0.4
restart() is the API for replay. Setting emitting=true on an already-finished one-shot doesn’t schedule another burst.
Continuous Mode
For looping effects (engine flame, smoke trail), use one_shot = false and toggle emitting. No restart needed.
Verifying
Trigger play_hit several times in a row. Burst plays each time. Without restart: only the first call shows particles.
“One-shot? Restart. Continuous? Toggle emitting.”
Related Issues
For shader instance uniform, see instance uniform. For tween signal, see tween signal.
Restart for one-shots. Burst replays.