authoring-godot-prompt…
Use when writing or editing a SKILL.md, a skill's references/*.md, or an agent definition in this repo — required frontmatter,…
Use when implementing particle effects — GPUParticles2D/3D, ParticleProcessMaterial, emission shapes, subemitters, trails, attractors, collision, and common VFX recipes
Claude Code
$ npx -y skills add jame581/GodotPrompter --skill particles-vfx --agent claude-code
Codex
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a codex -y
Cursor
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a cursor -y
Gemini CLI
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a gemini-cli -y
GitHub Copilot
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a github-copilot -y
OpenCode
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a opencode -y
Windsurf
$ npx skills add jame581/GodotPrompter --skill particles-vfx -a windsurf -y
name: particles-vfx description: Use when implementing particle effects — GPUParticles2D/3D, ParticleProcessMaterial, emission shapes, subemitters, trails, attractors, collision, and common VFX recipes
All examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, then C#.
> **Related skills:** **shader-basics** for custom particle shaders, **3d-essentials** for lighting and environment that affect particles, **2d-essentials** for 2D rendering context, **tween-animation** for code-driven VFX timing, **godot-optimization** for particle performance tuning.
---
| Node | Processing | Features | Use For | |---------------------|------------|-----------------------------------------|--------------------------------| | `GPUParticles2D` | GPU | Full features, high counts, trails | Most 2D effects | | `GPUParticles3D` | GPU | Full features, attractors, collision | Most 3D effects | | `CPUParticles2D` | CPU | Simpler, no trails/attractors | Low-end devices, few particles | | `CPUParticles3D` | CPU | Simpler, no trails/attractors | Low-end devices, few particles |
**Rule of thumb:** Use GPU particles by default. Switch to CPU particles only for low-end/web targets. Neither node exposes per-particle positions to scripts, so spawning objects at particle locations needs your own simulation.
> You can convert between GPU and CPU particles in the editor: select the node → toolbar → **Convert to CPUParticles2D/3D** (or vice versa).
GPUParticles2D/3D ├── Process Material (ParticleProcessMaterial) ← physics, emission, color ├── Draw Pass 1 (Mesh) ← what each particle looks like └── (Optional) Draw Pass 2-4 ← additional meshes
1. Add a **GPUParticles2D** (or 3D) node 2. In Inspector → Process Material → **New ParticleProcessMaterial** 3. Set **Amount** (number of particles) 4. Configure emission, direction, velocity, gravity 5. (2D) Set **Texture** for particle appearance 6. (3D) Set **Draw Pass 1** mesh (QuadMesh for billboards, or custom mesh)
---
| Property | Type | Description | |-------------------|----------|-----------------------------------------------------| | `emitting` | `bool` | Start/stop emission | | `amount` | `int` | Total particles alive at once | | `lifetime` | `float` | Seconds each particle lives | | `one_shot` | `bool` | Emit once then stop | | `preprocess` | `float` | Simulate this many seconds before first frame | | `speed_scale` | `float` | Time multiplier for particle physics | | `explosiveness` | `float` | 0.0 = spread over lifetime, 1.0 = all at once | | `fixed_fps` | `int` | Lock particle update rate (0 = match render FPS) | | `local_coords` | `bool` | Particles move with the node (true) or stay in world (false) | | `draw_order` | `enum` | Index, Lifetime, or Reverse Lifetime | | `amount_ratio` | `float` | Fraction of particles to emit (0.0–1.0) |
# Continuous emitter (fire, smoke, ambient dust) $GPUParticles2D.one_shot = false $GPUParticles2D.emitting = true # One-shot burst (explosion, impact splash) $GPUParticles2D.one_shot = true $GPUParticles2D.emitting = false # arm it # Later, trigger: $GPUParticles2D.restart() $GPUParticles2D.emitting = true
// Continuous
var particles = GetNode<GpuParticles2D>("GPUParticles2D");
particles.OneShot = false;
particles.Emitting = true;
// One-shot burst
particles.OneShot = true;
particles.Emitting = false;
// Trigger:
particles.Restart();
particles.Emitting = true;`GPUParticles3D` gains `TRANSFORM_ALIGN_LOCAL_BILLBOARD` (`= 4`): each particle's Z axis faces the camera while preserving a given axis — X or Y, chosen via `transform_align_axis`. For billboarded particles, `transform_align_channel_filter` selects which custom channel to read to calculate their angle. `ParticleProcessMaterial` pairs this with per-axis rotation velocity: enable `use_rotation_velocity_3d`, then set `rotation_velocity_3d_min/max` (`Vector3`, on the particle's local axes) and optionally `rotation_velocity_3d_curve` (per-axis curve over lifetime).
# 3D only — billboard toward the camera while keeping the Y axis fixed. # Assumes a ParticleProcessMaterial is assigned (section 1 setup). $GPUParticles3D.transform_align = GPUParticles3D.TRANSFORM_ALIGN_LOCAL_BILLBOARD $GPUParticles3D.transform_align_axis = RenderingServer.PARTICLES_ALIGN_AXIS_Y var mat: ParticleProcessMaterial = $GPUParticles3D.process_material mat.use_rotation_velocity_3d = true mat.rotation_velocity_3d_min = Vector3(-2.0, 0.0, 0.0) mat.rotation_velocity_3d_max = Vector3(2.0, 0.0, 0.0)
// Assumes a ParticleProcessMaterial is assigned (section 1 setup).
var particles = GetNode<GpuParticles3D>("GPUParticles3D");
particles.TransformAlign = GpuParticles3D.TransformAlignEnum.LocalBillboard;
particles.TransformAlignAxis = RenderingServer.ParticlesTransformAlignAxis.Y;
var mat = (ParticleProcessMaterial)particles.ProcessMaterial;
mat.UseRotationVelocity3D = true;
mat.RotationVelocity3DMin = new Vector3(-2.0f, 0.0f, 0.0f);
mat.RotationVelocity3DMax = new Vector3(2.0f, 0.0f, 0.0f);---
The material drives per-particle behavior: **emission shape** (Point / Sphere / Box / Ring / Poin
Agentic skills framework for Godot 4.x game development. Gives AI coding agents domain-specific expertise for GDScript and C# projects.
Use when writing or editing a SKILL.md, a skill's references/*.md, or an agent definition in this repo — required frontmatter,…
Use when cutting a GodotPrompter release or bumping its version — the version-bump sequence, tag-triggered workflow, and the…
Use when working with 2D-specific systems — TileMaps, parallax scrolling, 2D lights and shadows, canvas layers, particles 2D,…
Use when working with 3D-specific systems — materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion…
Use when building character abilities — Resource-based abilities with cost/cooldown/cast, buffs/debuffs, stat modifiers, gameplay…
Use when creating Godot editor plugins — EditorPlugin, @tool scripts, custom inspectors, and dock panels
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.