はじめに
ゲームの視覚効果において、爆発、炎、魔法、天候——こうした「多数の小さなオブジェクトが動く効果」を効率的に表現するのが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

爆発エフェクト実装例:
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


コメント