Particles2D in Godot 4: it is GPUParticles2D now
By Eduardo Orellana · Updated
Particles2D is called GPUParticles2D in Godot 4, beside CPUParticles2D, and Particles is GPUParticles3D. In a Godot 4 project, Particles2D.new() fails to parse with Identifier "Particles2D" not declared in the current scope. Did you mean to use "GPUParticles2D"?.
AppImage, x86_64. Ubuntu 22.04, Debian 12, Fedora 39 or newer.
Intel or AMD Chromebook, with Linux turned on.
What Godot is checking
GDScript resolves every name when the script loads. Particles2D is not a class in Godot 4, so the analyzer stops before anything runs, and because the name is in Godot's own table of Godot 3 renames, the message names the replacement.
The converter carries Particles2D to GPUParticles2D. It still takes a ParticleProcessMaterial in process_material, Godot 3's ParticlesMaterial renamed. CPUParticles2D runs on the CPU for the Compatibility renderer and low-end devices.
Reproduce it
A Godot 3 script that creates a Particles2D in code, in a Godot 4 project.
extends Node
func _ready():
var particles = Particles2D.new()
print(particles)
What Godot 4.7.2 prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
SCRIPT ERROR: Parse Error: Identifier "Particles2D" not declared in the current scope. Did you mean to use "GPUParticles2D"?
at: GDScript::reload (res://answers/particles2d-in-godot-4/repro.gd:4)
ERROR: Failed to load script "res://answers/particles2d-in-godot-4/repro.gd" with error "Parse error".
at: load (modules/gdscript/gdscript_resource_format.cpp:46)Fix it
A one-shot GPUParticles2D burst with a ParticleProcessMaterial.
More on this: Godot 4.6 to 4.7: every API change, class by class
extends Node2D
func _ready() -> void:
var particles := GPUParticles2D.new()
var material := ParticleProcessMaterial.new()
material.direction = Vector3(0, -1, 0)
particles.process_material = material
particles.amount = 32
particles.one_shot = true
add_child(particles)
print(particles.get_class(), " amount ", particles.amount, ", material ", particles.process_material.get_class())
What the fixed script prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
GPUParticles2D amount 32, material ParticleProcessMaterialVerified on Godot 4.7.2
Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 18 October 2026, and the output above is what Godot printed, unedited.
Where the check lives in Godot's source: [gdscript_analyzer.cpp line 4687, the message with its hint](https://github.com/godotengine/godot/blob/4.7.2-stable/modules/gdscript/gdscript_analyzer.cpp#L4687), [renames_map_3_to_4.cpp line 1561, Particles2D to GPUParticles2D](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1561), [GPUParticles2D class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/GPUParticles2D.xml).
Questions
- What happened to ParticlesMaterial?
- It is ParticleProcessMaterial in Godot 4.
- How do I restart a one-shot burst?
- Call restart(), or set emitting = true again after it finishes.
Related
- Light2D in Godot 4: it is PointLight2D now
- Sprite in Godot 4: it is Sprite2D now
- Every verified Godot 4 answer
- Particles in Godot 4: it is GPUParticles3D now
- Path in Godot 4: it is Path3D now
- Identifier "…" not declared in the current scope in Godot 4
- ToolButton in Godot 4: use a flat Button
- RayCast in Godot 4: it is RayCast3D now
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free