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の基本的なプロパティを表にまとめました:

プロパティ 説明 デフォルト値
emitting bool パーティクルを発生させるか false
amount int 同時に発生させるパーティクル数 8
lifetime float 各パーティクルの生存時間(秒) 1.0
process_material ParticleProcessMaterial パーティクルの動作・外観を定義 null
draw_pass_1 Mesh パーティクルとして描画するメッシュ null
one_shot bool 1回だけ発生(ループ無し) false
explosiveness float 発生のばらつき度合い(0〜1) 0.0
preprocess float 開始前にシミュレーションする時間 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 発生パターン 用途例
POINT 1点から全方向に放射 爆発、魔法の中心
SPHERE 球体内から放射 爆発(広い範囲)、エネルギー波
BOX 箱内からランダム発生 雨、雪、砂塵
POINTS 指定の3D点から発生 複数箇所の同時発生
RING 円環状に発生 リング状のエフェクト

GPUParticles3D と CPUParticles3D の使い分け

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

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

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

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

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

まとめ

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

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

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

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

シリーズ:Godot 4 ノード解説

001〜040:各種ノード

  • 041:Control
  • 042:Button
  • 043:Label
  • 044:TextEdit
  • 045:Panel
  • 046:VBoxContainer
  • 047:AnimationPlayer
  • 048:Timer
  • 049:Area3D
  • 050:RigidBody3D
  • 051:CharacterBody3D
  • 052:CollisionShape3D
  • 053:MeshInstance3D
  • 054:Node3D
  • 055:Camera3D
  • 056:Sprite3D
  • 057:DirectionalLight3D
  • 058:OmniLight3D
  • 059:ReflectionProbe
  • 060:VisibleOnScreenNotifier3D
  • 061:SpotLight3D
  • 062:WorldEnvironment
  • 063:AudioStreamPlayer3D
  • 064:GPUParticles3D
  • 065:CSGBox3D
  • 066:GridMap
  • 067:Decal
  • 068:OccluderInstance3D
  • 069:LightmapGI
  • 070:SubViewport

コメント