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.