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

Node解説

はじめに

ゲームの「派手な瞬間」—爆発、炎、魔法、雨、雪—を表現するために欠かせないのがパーティクルエフェクトです。数百〜数千の小さな粒子を同時に動かす処理は、通常のアニメーションでは重く、フレームレートが落ちてしまいます。そこで登場するのが GPUParticles2D—グラフィックスカード(GPU)の力を使って高速処理するパーティクルノードです。

この記事では、GPUParticles2Dの基本設定から、ParticleProcessMaterialを使ったカスタマイズ、CPUParticles2Dとの使い分けまで、実践的な解説をお届けします。

GPUParticles2Dとは?

GPUParticles2D は、GPU(グラフィックスカード)を使って2Dパーティクルを高速処理するノードです。CPUではなくGPUで計算するため、数千個のパーティクルでも高いフレームレートを維持できます。

例えるなら、懐中電灯の光源。1つの粒子(光の点)が小さく、数千個集まると壮大な光の流れになる—それがパーティクルです。

継承ツリー:

GPUParticles2D → Node2D → Node → Object

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

使うべき場面

  • 爆発エフェクト:敵撃破時の爆発、プレイヤーのダメージ表現
  • 炎・火のエフェクト:キャンプファイア、ダメージゾーン、魔法攻撃
  • 天候表現:雨、雪、あられなどの環境エフェクト
  • 魔法・エネルギーエフェクト:魔法の軌跡、スキル発動時の視覚効果
  • その他の演出:星、ホタル、スパークなど

使わない場面

  • モバイル・ローエンド環境:GPU処理が重い場合はCPUParticles2Dを検討
  • WebGL対応が必須な場合:GPUサポートに不安がある場合はCPUParticles2Dの方が安全

主なプロパティと機能

プロパティ説明
emittingboolパーティクル放射中かどうか。trueで粒子を放出開始
amountint一度に作成できるパーティクル数の上限(多いほど重い)
lifetimefloat1つのパーティクルが存続する時間(秒)
process_materialParticleProcessMaterialパーティクルの動き、速度、色などを制御するマテリアル
textureTexture2D各パーティクルに使用するテクスチャ画像
one_shotbooltrue=一度だけ放射して終了、false=emittingがtrueの間ずっと放射
explosivenessfloat0〜1。高いほど粒子が一気に放出される(爆発的)
randomnessfloatパーティクル放出のランダム性(lifetimeのばらつき)

基本的な使用例1:爆発エフェクト


extends Node2D

@onready var explosion = $GPUParticles2D

func _ready():
    # 爆発の初期設定
    explosion.amount = 100
    explosion.lifetime = 2.0
    explosion.one_shot = true
    explosion.explosiveness = 0.8  # 爆発的な放出
    explosion.emitting = false

func trigger_explosion():
    explosion.global_position = global_position
    explosion.emitting = true
    explosion.restart()  # パーティクルをリセットして再開始

カスタムParticleProcessMaterial例2:上昇する炎


extends Node2D

func _ready():
    var particles = $GPUParticles2D
    var material = ParticleProcessMaterial.new()

    # 基本設定
    material.direction = Vector3(0, -1, 0)  # 上向き
    material.spread_degrees = 45.0  # 45度の広がり角
    material.initial_velocity_min = 100
    material.initial_velocity_max = 200
    material.gravity = Vector3(0, -100, 0)  # 重力(下向きに加速)

    # 色の時間変化
    var color_gradient = Gradient.new()
    color_gradient.add_point(0.0, Color.YELLOW)
    color_gradient.add_point(0.5, Color.ORANGE)
    color_gradient.add_point(1.0, Color(1, 0, 0, 0))  # 赤 → 透明
    material.color_ramp = color_gradient

    # サイズの時間変化
    var scale_curve = Curve.new()
    scale_curve.add_point(Vector2(0.0, 1.0))
    scale_curve.add_point(Vector2(1.0, 0.0))  # 消えるにつれて小さく
    material.scale_curve = scale_curve

    particles.process_material = material
    particles.emitting = true
GPUParticles2Dのプロパティ構成
エディタでプロパティを視覚的に設定できます

もっと使いこなす:ParticleProcessMaterialのカスタマイズ

パラメータ説明
directionVector3粒子の発射方向(例:(0,-1,0)は上向き)
spread_degreesfloat中心からの広がる角度(0=一直線、180=全方向)
initial_velocity_min / maxfloat粒子の初速のランダム範囲
gravityVector3重力方向と大きさ(例:(0,-980,0)は現実的な落下)
color_rampGradient粒子の色を時間経過で変化させるグラデーション
scale_curveCurve粒子のサイズを時間経過で変化させるカーブ
tangential_accel_min / maxfloat接線方向の加速度(渦巻き効果)
anim_speed_min / maxfloatアニメーション速度(スプライトシートの場合)
方向と広がり角度の設定
spread_degreesを0〜180で調整して、放出パターンを制御できます

GPUParticles2D vs CPUParticles2D

項目GPUParticles2DCPUParticles2D
処理速度高速(GPU処理)低速(CPU処理)
大量パーティクル数千個まで快適数百個が限界
モバイル対応注意(GPU不足時は落ちる)安全
WebGL対応完全サポートより安全
推奨用途PC・高性能ゲームモバイル・軽量ゲーム

まとめ

GPUParticles2D は、PC向け高性能ゲームの視覚効果を担う重要なノードです。ParticleProcessMaterial を使いこなせば、爆発から雨まで、あらゆる演出を実現できます。

  • GPU高速処理:数千個のパーティクルをフレームレート維持で動作させる
  • ParticleProcessMaterialの柔軟性:direction、gravity、color_ramp など豊富なパラメータでカスタマイズ
  • one_shot と emitting の使い分け:一度だけの爆発か継続放出か、シーンに合わせて選択

次回は「CPUParticles2D」をお届けします。モバイルやローエンド環境でも安定動作するパーティクルシステムの実装方法を解説します!

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

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

コメント