Godot入門:GPUParticles3Dの使い方と活用法

はじめに

ゲームの視覚効果において、爆発、炎、魔法、天候——こうした「多数の小さなオブジェクトが動く効果」を効率的に表現するのがGPUParticles3Dです。GPU側で処理されるため、CPUパーティクルより高速で、複雑な演出が可能になります。

本記事では、GPUParticles3Dの基本から、パーティクルシステムの細かなチューニングまで、実装パターンを交えて解説します。

GPUParticles3Dとは?

GPUParticles3Dは、GPU を使用して高速に処理する 3D パーティクルエフェクトノードです。ParticleProcessMaterial で各パーティクルの動作(初期速度、重力、回転、スケール、色)を定義し、メッシュを指定することで、多彩なビジュアルエフェクトが実現できます。

継承ツリー:

GPUParticles3D → GeometryInstance3D → VisualInstance3D → Node3D → Node → Object

2D版の GPUParticles2D と似ていますが、GPUParticles3D は完全に 3D 空間で動作し、カメラの視点変化に応じてパーティクルが立体的に表現されます。

このノードを使うべき場面

活躍する場面:

  • 爆発エフェクト(炎、烟、衝撃波)
  • 魔法・スキルエフェクト(光の粒子、エネルギー波)
  • 環境効果(雨、雪、砂塵、霧)
  • 血しぶき、スパーク、ダメージ表現
  • ボスキャラの特殊な演出

使わない場面:

  • 単一のメッシュオブジェクト(MeshInstance3D を使う)
  • 数個のみの単純なオブジェクト移動(AnimationPlayer や Tween で十分)

主なプロパティと機能

GPUParticles3Dの基本的なプロパティを表にまとめました:

プロパティ説明デフォルト値
emittingboolパーティクルを発生させるかfalse
amountint同時に発生させるパーティクル数8
lifetimefloat各パーティクルの生存時間(秒)1.0
process_materialParticleProcessMaterialパーティクルの動作・外観を定義null
draw_pass_1Meshパーティクルとして描画するメッシュnull
one_shotbool1回だけ発生(ループ無し)false
explosivenessfloat発生のばらつき度合い(0〜1)0.0
preprocessfloat開始前にシミュレーションする時間0.0

基本的な使用例:


extends Node3D

@onready var particles = $GPUParticles3D

func _ready():
	# パーティクルの基本設定
	particles.amount = 32            # 32個のパーティクル
	particles.lifetime = 2.0         # 2秒生存
	particles.one_shot = true        # 1回だけ発生
	particles.emitting = false       # 初期状態は発生させない

	# メッシュの指定(SphereMesh を使う例)
	var sphere_mesh = SphereMesh.new()
	sphere_mesh.radius = 0.1
	particles.draw_pass_1 = sphere_mesh

func trigger_explosion():
	# 爆発トリガー
	particles.restart()
	particles.emitting = true

func stop_particles():
	particles.emitting = false
ParticleProcessMaterialの重要パラメータ
ParticleProcessMaterial で各パーティクルの動作と外観が決定されます

爆発エフェクト実装例:


extends Node3D

@onready var particles = $GPUParticles3D

func _ready():
	# ParticleProcessMaterial を作成
	var mat = ParticleProcessMaterial.new()

	# 発生形状:球形(中心から放射状に広がる)
	mat.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE
	mat.emission_shape_scale = Vector3.ONE * 0.5

	# 初期速度:ランダムな方向に放射
	mat.initial_velocity_min = 10.0
	mat.initial_velocity_max = 20.0

	# 重力:下方へ引っ張る
	mat.gravity = Vector3(0, -9.8, 0)

	# スケール:パーティクルのサイズ
	mat.scale_min = 0.2
	mat.scale_max = 0.8

	# 色:明るい黄→赤→透明へ変化
	var gradient = Gradient.new()
	gradient.add_point(0.0, Color.YELLOW)
	gradient.add_point(0.5, Color.RED)
	gradient.add_point(1.0, Color.TRANSPARENT)
	mat.color_ramp = gradient

	particles.process_material = mat
	particles.amount = 64
	particles.lifetime = 3.0
	particles.one_shot = true

	# メッシュ:小さな球
	var sphere = SphereMesh.new()
	sphere.radius = 0.1
	particles.draw_pass_1 = sphere

func trigger_explosion():
	particles.restart()
	particles.emitting = true

emission_shape の種類と使い分け

パーティクルがどこから、どの方向に発生するかは emission_shape で決まります:

emission_shape発生パターン用途例
POINT1点から全方向に放射爆発、魔法の中心
SPHERE球体内から放射爆発(広い範囲)、エネルギー波
BOX箱内からランダム発生雨、雪、砂塵
POINTS指定の3D点から発生複数箇所の同時発生
RING円環状に発生リング状のエフェクト

GPUParticles3D と CPUParticles3D の使い分け

Godot には CPU パーティクルもありますが、GPU パーティクルの方が高速です:

ノード処理場所パフォーマンス柔軟性用途例
GPUParticles3DGPU高速(数千個可能)中程度爆発、大量エフェクト
CPUParticles3DCPU低速(数百個程度)高い(GDScript制御可)カスタム挙動、物理連携

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ設定値の例効果
damping0.0 〜 1.0空気抵抗。高いほど素早く速度が落ちる
hue_variation0.0 〜 1.0色のばらつき(パーティクルごとに色が異なる)
angular_velocity_min/max-10.0 〜 10.0回転速度。メッシュを回転させる
scale_curveCurve リソース時間経過に応じたスケール変化
explosiveness0.0 〜 1.00で均等発生、1で瞬間発生
randomness0.0 〜 1.0パラメータのランダムばらつき度合い

まとめ

GPUParticles3D は、GPU の高速処理を活用して、複雑で動的なビジュアルエフェクトをゲームに追加するノードです。ParticleProcessMaterial で細かいコントロールが可能であり、リアルで印象的な演出が実現されます。

  • emission_shape を使い分けることで、爆発・雨・魔法など多彩なエフェクトが表現できる
  • ParticleProcessMaterial の色・スケール・速度を Curve やGradient で時間変化させることで、ダイナミックな演出が可能
  • パフォーマンスが必要な場合は GPU パーティクルを、カスタム挙動が必要な場合は CPU パーティクルを選択

次回は CSGBox3D について解説します。CSG(ブーリアン演算)を使って、簡単に 3D の形状を組み合わせるノードです。

この記事はGodot 4.xをもとに執筆しています。

関連性の高いノード解説記事

コメント