Quick answer: The ParticleProcessMaterial is shared between instances. Call process_material = process_material.duplicate() before changing it per-instance.

A weather system tweaks a rain emitter’s gravity at runtime to simulate wind. All rain emitters change at once — they share one material resource.

Resources Are Shared

When you assign a ParticleProcessMaterial in the editor and instance the scene multiple times, every instance points at the same resource. Editing it affects all of them.

Duplicate Per Instance

func _ready():
    # make this emitter's material unique
    process_material = process_material.duplicate()

func set_wind(force: Vector3):
    process_material.gravity = force

duplicate() gives this instance its own copy. Now changes are local.

Local to Scene Flag

Alternatively, in the editor select the material resource and enable Local to Scene. Each scene instance then gets its own copy automatically — no code needed.

Deep Duplicate for Nested Resources

If the material references sub-resources (gradients, curves) you also want unique, use duplicate(true) for a deep copy.

Verifying

Change one emitter’s wind. Only that emitter responds. Others keep their own settings. Memory shows one material per emitter (expected with duplication).

“Resources are shared by default. Duplicate or mark Local to Scene for per-instance edits.”

If every emitter needs unique runtime tweaks, Local to Scene in the editor is the cleanest — no _ready() boilerplate.