Godot粒子系统技能Skill godot-particles

这个技能提供了使用Godot游戏引擎创建高性能GPU粒子系统的专家指南,用于视觉特效(VFX)、环境效果和视觉反馈。关键词包括GPUParticles2D、ParticleProcessMaterial、emission_shape、color_ramp、sub_emitter、one_shot。

游戏开发 0 次安装 0 次浏览 更新于 3/23/2026

name: godot-particles description: “GPU粒子系统的专家蓝图(爆炸、魔法效果、天气、轨迹)使用GPUParticles2D/3D、ParticleProcessMaterial、渐变、子发射器和自定义着色器。在创建VFX、环境效果或视觉反馈时使用。关键词GPUParticles2D、ParticleProcessMaterial、emission_shape、color_ramp、sub_emitter、one_shot。”

粒子系统

GPU加速渲染、基于材质的配置和子发射器定义了高性能的VFX。

可用脚本

vfx_shader_manager.gd

高级粒子VFX的专家自定义着色器集成。

particle_burst_emitter.gd

一次性粒子爆发与自动清理 - VFX系统的基础。

粒子系统中绝对不要做的事

  • 绝对不要对性能关键的效果使用CPUParticles2D — 100+个godot-particles使用CPU = 延迟峰值。除非目标平台是移动设备且没有GPU支持,否则使用GPUParticles2D。
  • 绝对不要忘记为一击godot-particles设置emitting = false — 默认emitting = true的爆炸场景 = godot-particles在instantiate()时立即发射,在定位之前。设置为false,定位,然后发射。
  • 绝对不要在没有在目标平台上测试的情况下使用高amount — 1000个godot-particles在桌面上正常,在移动设备上卡顿。早期测试,基于OS.get_name()缩放amount
  • 绝对不要忘记queue_free()一击godot-particles — 爆炸持续1秒但节点永远留在树中 = 内存泄漏。await create_timer(lifetime).timeout然后queue_free()
  • 绝对不要对爆炸使用emission_shape = POINT — 所有godot-particles在同一位置生成 = 看起来扁平。使用EMISSION_SHAPE_SPHERE带半径以获得3D扩散。
  • 绝对不要忘记颜色渐变中的alpha — 粒子在结束时突然消失 = 生硬。在1.0处添加渐变点,使用Color(r, g, b, 0.0)以实现平滑淡出。

基本设置

# 添加GPUParticles2D节点
# 设置数量: 32
# 设置生命周期: 1.0
# 设置一击: true(用于爆炸)

粒子材质

# 创建ParticleProcessMaterial
var material := ParticleProcessMaterial.new()

# 发射形状
material.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE
material.emission_sphere_radius = 10.0

# 重力
material.gravity = Vector3(0, 98, 0)

# 速度
material.initial_velocity_min = 50.0
material.initial_velocity_max = 100.0

# 颜色
material.color = Color.ORANGE_RED

# 应用到godot-particles
$GPUParticles2D.process_material = material

常见效果

爆炸

extends GPUParticles2D

func _ready() -> void:
    one_shot = true
    amount = 64
    lifetime = 0.8
    explosiveness = 0.9
    
    var mat := ParticleProcessMaterial.new()
    mat.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE
    mat.emission_sphere_radius = 5.0
    mat.initial_velocity_min = 100.0
    mat.initial_velocity_max = 200.0
    mat.gravity = Vector3(0, 200, 0)
    mat.scale_min = 0.5
    mat.scale_max = 1.5
    
    process_material = mat
    emitting = true

烟雾轨迹

extends GPUParticles2D

func _ready() -> void:
    amount = 16
    lifetime = 2.0
    
    var mat := ParticleProcessMaterial.new()
    mat.direction = Vector3(0, -1, 0)
    mat.initial_velocity_min = 20.0
    mat.initial_velocity_max = 40.0
    mat.scale_min = 0.5
    mat.scale_max = 1.0
    mat.color = Color(0.5, 0.5, 0.5, 0.5)
    
    process_material = mat

火花/星星

var mat := ParticleProcessMaterial.new()
mat.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_BOX
mat.emission_box_extents = Vector3(100, 100, 0)
mat.gravity = Vector3.ZERO
mat.angular_velocity_min = -180
mat.angular_velocity_max = 180
mat.scale_min = 0.1
mat.scale_max = 0.5

# 使用星星纹理
$GPUParticles2D.texture = load("res://textures/star.png")
$GPUParticles2D.process_material = mat

按需生成粒子

# player.gd
const EXPLOSION_EFFECT := preload("res://effects/explosion.tscn")

func die() -> void:
    var explosion := EXPLOSION_EFFECT.instantiate()
    get_parent().add_child(explosion)
    explosion.global_position = global_position
    explosion.emitting = true
    queue_free()

3D粒子

extends GPUParticles3D

func _ready() -> void:
    amount = 100
    lifetime = 3.0
    
    var mat := ParticleProcessMaterial.new()
    mat.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_BOX
    mat.emission_box_extents = Vector3(10, 0.1, 10)
    mat.direction = Vector3.UP
    mat.initial_velocity_min = 2.0
    mat.initial_velocity_max = 5.0
    mat.gravity = Vector3(0, -9.8, 0)
    
    process_material = mat

颜色渐变

var mat := ParticleProcessMaterial.new()

# 创建渐变
var gradient := Gradient.new()
gradient.add_point(0.0, Color.YELLOW)
gradient.add_point(0.5, Color.ORANGE)
gradient.add_point(1.0, Color(0.5, 0.0, 0.0, 0.0))  # 淡出到透明红色

var gradient_texture := GradientTexture1D.new()
gradient_texture.gradient = gradient

mat.color_ramp = gradient_texture

子发射器

# 生成godot-particles的粒子(烟花)
$ParentParticles.sub_emitter = $ChildParticles.get_path()
$ParentParticles.sub_emitter_mode = GPUParticles2D.SUB_EMITTER_AT_END

最佳实践

1. 使用纹理作为形状

# 添加纹理到godot-particles
$GPUParticles2D.texture = load("res://textures/particle.png")

2. 生命周期管理

# 自动删除一击godot-particles
if one_shot:
    await get_tree().create_timer(lifetime).timeout
    queue_free()

3. 性能

# 为移动设备减少数量
if OS.get_name() == "Android":
    amount = amount / 2

参考

相关