【Unity】Unity VFX Graph入門:GPUベースの高性能パーティクルシステム

作成: 2026-02-05最終更新: 2026-10-10

Unity VFX Graphの使い方を解説。GPUベースで大量のパーティクルを高パフォーマンスで表示できるビジュアルエフェクト作成ツールの基本構造、従来のParticle Systemとの違い、実践的な使い方を紹介します。

パーティクルシステム(Shuriken) で桜吹雪を作ったら、数を増やした途端にフレームレートが落ちた。星空も、雪原の吹雪も、「あと一桁多く粒が欲しい」ところでCPUが悲鳴を上げる——物量の壁にぶつかったら、それがVFX Graphの出番です。

VFX Graph は、Unity公式のノードベースのビジュアルエフェクト作成ツールです。パーティクルの計算をGPUで行うため、Shurikenでは数千個程度が目安だった粒を、数十万〜数百万個の規模で動かせます。

VFX Graphのイメージ。ノードグラフのパネルを操作すると、数え切れないほどの粒が巨大な渦を巻いて吹き上がっている

この記事でわかること

  • Particle System(Shuriken)との違いと使い分けの基準
  • VFX Graphの基本構造(Spawn / Initialize / Update / Output)
  • 基本的な使い方とスクリプトからの制御
  • システム要件とモバイルでの注意点
  • 実践:夜の森に数万匹の蛍を飛ばす

Sponsored

従来のParticle Systemとの違い

Particle SystemとVFX Graphの物量比較。Particle System(CPU)は数千個までで衝突検出が可能、VFX Graph(GPU)は数百万個の粒を圧倒的な密度で表示できる

Particle System(Shuriken)

  • CPUベースのパーティクルシステム
  • Unity初期から存在
  • インスペクターで設定
  • モジュール式の設計
  • 衝突検出が可能
  • 設定が簡単、情報が豊富
  • 処理負荷が高くなりがち(数千個程度が目安)

VFX Graph

  • GPUベースのパーティクルシステム
  • ノードベースのグラフで設定
  • 大量のパーティクルを表示可能(数百万個も可能)
  • 衝突はColliderではなく、形や深度バッファとの判定
  • 学習コストが高い
  • Shader Graphと統合可能
  • より高度な表現が可能

パフォーマンス比較

シナリオ推奨システム
大量のパーティクルを1つのシステムで表示VFX Graph(圧倒的に軽い)
多数の異なるエフェクトを同時に表示Particle System(軽い場合がある)
同じエフェクトを大量に配置VFX Graph(インスタンシングで軽い)

使い分けのポイント

VFX Graphを使うべき場合

  • 大量のパーティクルを表示したい(爆発、炎、煙、魔法など)
  • 高度な表現が必要
  • Shader Graphと連携したい
  • 同じエフェクトを大量に配置する

Particle Systemを使うべき場合

  • 衝突検出が必要
  • 素早く設定したい
  • シンプルなエフェクトで十分
  • 多数の異なるエフェクトを同時に表示する
Sponsored

VFX Graphの基本構造

2つの要素

VFX Graphは2つの要素で構成されます。

要素説明
Visual EffectコンポーネントGameObjectにアタッチ
Visual Effect Assetエフェクトの設定を格納

4つのコンテキストノード

VFX Graphのノードは 上から下 に向かってデータが流れます。Shurikenの 「パーティクルの一生」 と同じ考え方が、そのまま縦のグラフになった構造です。

VFX Graphの4つのコンテキスト。Spawn(何個生む?)→Initialize(生まれた瞬間の状態)→Update(毎フレームの変化)→Output(どう描くか)が上から下へ流れる

1. Spawnコンテキストノード

フレームごとの生成数を決定し、Initialize Particleに渡します。

  • Constant Spawn Rate - 一定の割合でSpawnイベントを発行
  • Single Burst - 一度に大量のパーティクルを生成

その他のSpawnブロック: Periodic Burst(一定間隔でバースト)、Variable Rate(動的に変化する生成レート)なども利用可能です。

2. Initialize Particleコンテキストノード

パーティクルの初期化を行います。

  • Capacity - 同時に存在できるパーティクルの最大数(下記目安参照)。ブロックではなく、Initialize Particleコンテキスト自体の設定項目で、超えた分の新しい粒は生まれません

プラットフォーム別Capacity目安:

プラットフォーム実用的なCapacity目安備考
ハイエンドPC100万〜500万GPU性能に大きく依存
ミドルレンジPC10万〜50万
コンソール10万〜100万プラットフォームによる
モバイル1万〜5万発熱・バッテリーにも注意

Capacityの見積もり: Capacityは「最大同時存在数」です。生成レート×寿命で実際の表示数を見積もり、過剰に設定するとGPU側のメモリを余計に確保します。

  • Set LifeTime - パーティクルの寿命
  • Set Position Shape - パーティクルの初期位置(形状から生成)
  • Set Velocity - パーティクルの初期速度

3. Update Particleコンテキストノード

パーティクルの毎フレーム更新処理を行います。

  • Gravity - 重力を適用
  • Linear Drag - 抵抗を適用
  • Force - 力を適用
  • Collide with Plane など - 平面・球・箱などの形や、深度バッファとの衝突

4. Output Particleコンテキストノード

パーティクルの最終的な描画設定を行います。

Outputの種類:

Output用途
Output Particle Quad板ポリゴン(最も一般的)
Output Particle Mesh3Dメッシュを使用
Output Particle Strip軌跡・リボン表現
Output Particle Pointポイントスプライト
Outputの4種類の見た目比較。Quad=常にカメラを向く板ポリゴン(最も一般的)、Mesh=3Dモデルの粒(岩・破片)、Strip=つながった軌跡・リボン(斬撃・トレイル)、Point=極小の点スプライト(星屑・塵)

VFX Graph 17 の実際のノード名は「Output Particle Unlit Quad」「Output ParticleStrip Quad」のように、描き方(UnlitやLit)の入った名前で並びます。

主なブロック:

  • Orient - パーティクルの向き(Face Camera Planeでビルボードなど)
  • Set Size over Life - 寿命に応じたサイズ変化
  • Set Color over Life - 寿命に応じた色変化
  • Main Texture - 使用するテクスチャ
  • Blend Mode - アルファブレンドの設定

インストール方法

  1. Window > Package Management > Package Manager を開く(Unity 6.0 では Window > Package Manager)
  2. Unity Registryを選択
  3. Visual Effect Graphを選択
  4. Installボタンをクリック

URPプロジェクトで使う場合

Unity 6(URP 17)では、URPプロジェクトでも特別な設定なしで動作します。Project SettingsのColor Spaceは Linear(Unity 6 の新規プロジェクトの既定)にしておきます。Gammaは対応外で、色がずれます。

Sponsored

基本的な使い方

エフェクトの作成

  1. GameObject > Visual Effects > Visual Effect を選択
  2. Visual Effectコンポーネントがアタッチされたゲームオブジェクトが作成される
  3. Visual Effectコンポーネントの「New」ボタンをクリック
  4. テンプレートを選択(Simple Loop、Simple Burst、Minimal Systemなど)
  5. ファイル名を付けて保存

グラフの編集

  1. ProjectウィンドウのVisual Effect Assetをダブルクリック
  2. VFX Graphウィンドウが開く
  3. ノードを追加・編集してエフェクトをカスタマイズ

Learning Templatesの活用

Unity公式の学習用テンプレートを使って学習できます。

  1. Assets > Create > Visual Effects > Visual Effect Graph を選択
  2. Create New VFX Assetウィンドウで「Install Learning Templates」をクリック
  3. 様々なテンプレートが追加される

プログラムからの制御

イベントの送信

using UnityEngine;
using UnityEngine.VFX;

public class VFXController : MonoBehaviour
{
    VisualEffect visualEffect;

    void Start()
    {
        visualEffect = GetComponent<VisualEffect>();
    }

    public void Play()
    {
        // デフォルトイベント
        visualEffect.SendEvent(VisualEffectAsset.PlayEventName);  // OnPlay
    }

    public void Stop()
    {
        visualEffect.SendEvent(VisualEffectAsset.StopEventName);  // OnStop
    }

    public void SendCustomEvent()
    {
        // カスタムイベント
        visualEffect.SendEvent("CustomEventName");
    }
}

高パフォーマンスな方法(IDを使用)

public static readonly int CustomEventID = Shader.PropertyToID("CustomEventName");

void SendEvent()
{
    visualEffect.SendEvent(CustomEventID);
}

プロパティの設定

VFX GraphのBlackboardで定義したプロパティをスクリプトから設定できます。

// 各種プロパティの設定
visualEffect.SetFloat("SpawnRate", 100f);
visualEffect.SetVector3("EmitterPosition", transform.position);
visualEffect.SetTexture("MainTexture", myTexture);
visualEffect.SetGradient("ColorGradient", myGradient);

// プロパティの取得
float rate = visualEffect.GetFloat("SpawnRate");

// デバッグ: 現在のパーティクル数を確認
// aliveParticleCountはGPU Readbackで取得するため、
// 数フレーム遅れることがあります。
// パーティクルにLifetimeが設定されていない場合、
// すべてのパーティクルが永続的にaliveとなります。
int aliveCount = visualEffect.aliveParticleCount;

Exposed Property: Blackboardでプロパティを作成する際、Exposed にチェックを入れないとスクリプトからアクセスできません。

パフォーマンス: 頻繁に呼び出す場合はShader.PropertyToID()でIDを事前取得し、SetFloat(int id, float value)を使用してください。

パラメータ付きイベントの送信

VFXEventAttributeを使って、位置や色などのパラメータを動的に渡せます。

public void SpawnAtPosition(Vector3 position, Color color)
{
    VFXEventAttribute eventAttribute = visualEffect.CreateVFXEventAttribute();
    eventAttribute.SetVector3("position", position);
    eventAttribute.SetVector3("color", new Vector3(color.r, color.g, color.b)); // colorはRGBの3つ
    eventAttribute.SetFloat("alpha", color.a);                                 // 透明度は別のalpha
    visualEffect.SendEvent("OnSpawn", eventAttribute);
}

VFX Graph側の設定: Initialize Particleコンテキストで、Get Attributeオペレーター(LocationをSourceにする)を使って、Eventから渡された position や color を読み取ります。

初期状態で停止させる方法

以下のいずれかの方法を使用します:

  1. Initial Event Nameを空に設定 - 自動再生を無効化
  2. Initial Event Nameに独自のイベント名を設定 - 手動でイベントを送信するまで開始しない

よくある使用例

大規模なパーティクルエフェクト

  • 爆発、炎、煙
  • 魔法エフェクト
  • 雨、雪
  • 星空、花火

環境エフェクト

  • 霧
  • 風に舞う葉
  • 塵
  • 蛍

UI エフェクト

  • ボタンのパーティクル
  • トランジション
  • 背景エフェクト

システム要件

対応レンダーパイプライン

パイプライン対応
Universal Render Pipeline (URP)○
High Definition Render Pipeline (HDRP)○
Built-in Render Pipeline×(非対応)

Built-in RPは非対応: VFX GraphはURP/HDRP専用です(Render Pipelineの記事 の機能比較表と同じ結論です)。Built-inプロジェクトで大量パーティクルが必要になったら、URPへの移行を検討してください。本記事の検証はUnity 6(6000.0)+Visual Effect Graph 17系時点です。

対応プラットフォーム

  • PC(Windows、Mac、Linux)
  • コンソール(PlayStation、Xbox)
  • モバイル(iOS、Android)- 一部制限あり
  • Web - WebGLでは動かない(WebGPUを使えば動く版がある)

GPU要件

  • Compute ShaderをサポートするGPU
  • DirectX 11以上、Vulkan、Metal(OpenGL ESには非対応)

モバイルでの注意点

項目推奨値
最小要件Vulkan(Android)/ Metal(iOS)。OpenGL ESには非対応
パーティクル数端末で大きく変わるので、少ない数から実測する
Capacity設定必要最小限に抑える

モバイル最適化: モバイルではCapacityを小さく設定し、複雑なノードグラフを避けてください。古いデバイスではCompute Shaderが非対応の場合があります。

「数十万〜数百万」という粒子数はあくまでGPU性能に依存する目安です。数字を鵜呑みにせず、 対象端末でCapacityを段階的に増やしてフレームレートを計測し、「自分のゲームの限界値」を実測する のが確実です。10万→30万→100万と増やしながら Profiler で見る——それ自体がVFX Graphの楽しい実験になります。

モバイルでの主な制限:

  • Compute Shader非対応の古いデバイスでは動作しない
  • SampleGradientノードの精度が低い場合がある
  • デバイスの発熱によりGPUスロットリングが発生しやすい

Shader Graphとの連携

VFX GraphはShader Graphと統合でき、カスタムシェーダーでパーティクルを描画できます。

連携手順

  1. Shader Graph作成: 普通のShader Graph(URPならLitやUnlit)を作り、Graph Settingsで Support VFX Graph を有効にする(「VFX Shader Graph」という専用のメニューはありません)
  2. Outputの設定: Output ParticleコンテキストでShader Graphオプションを選択
  3. シェーダーの割り当て: 作成したShader Graphをドラッグ&ドロップ

用途: ディストーション、カスタムライティング、特殊な歪みエフェクトなど、標準のブレンドモードでは実現できない表現に使用します。

SDF(Signed Distance Field)の活用

VFX Graphの特徴的な機能として、SDFを使ってメッシュの形状に沿ったパーティクル生成や衝突検出が可能です。

Window > Visual Effects > Utilities > SDF Bake ToolでメッシュからSDFテクスチャを生成できます。

Output Event

Output Eventコンテキストを使うと、グラフ側で決めたタイミング(スポーンしたときなど)でC#側へイベントを送れます。C#ではvisualEffect.outputEventReceivedで受け取り、サウンドの再生のきっかけなどに使います。粒が1つ消えるたびに知らせる仕組みではありません。

注意点

衝突検出の制限

VFX Graphの衝突は、平面・球・箱などの形や、深度バッファ、SDFとの判定で、ゲームのColliderには当たりません。Colliderに当てたい場合はParticle Systemを使用してください。

学習コスト

ノードベースのため、最初は学習コストが高いです。Particle Systemに慣れている人は、最初は戸惑うかもしれません。Learning Templatesを活用して学習することをお勧めします。

レンダーパイプライン

URPまたはHDRPで使用します(Built-in Render Pipelineは非対応です)。

実践:夜の森に蛍を飛ばす

オープンワールドの夜の森に漂う蛍、和風ゲームの桜吹雪、ダンジョンに舞う塵——「主張しないけど大量にいる」環境エフェクトは、VFX Graphの一番おいしい使いどころです。ここでは蛍を例に、テンプレートから最短で組みます。

夜の森の蛍エフェクトのイメージ。広い空間全体に、小さな光る粒が無数にゆらゆらと漂い、明滅している
  1. テンプレートから作る: 「GameObject > Visual Effects > Visual Effect」でオブジェクトを作り、「New」からSimple Loop系テンプレートを選択します。
  2. Spawn: Constant Spawn Rateを200前後に。蛍は一斉には生まれず、常に湧き続けるのでBurstではなくRateです。
  3. Initialize: Capacityを10,000に(湧き数×寿命で見積もり)。Set Position Shapeの形をBox(VFX Graph 17では Oriented Box)にして森全体を覆うサイズへ広げ、Set Lifetimeを20〜40秒のランダムに(表示名が Set Lifetime Random Uniform に変わります)。Initializeの Bounds も、Boxより一回り大きくしておきます(小さいままだと、カメラの向きによって粒がまとめて消えます)。
  4. Update: Turbulence(乱流)ブロックを追加して、ふわふわと不規則に漂わせます。直線的に飛ぶと虫ではなく弾に見えます。
  5. Output: サイズを小さく(0.02〜0.05)、色をHDRの淡い黄緑にし、Blend ModeをAdditiveにして、ポストプロセスのBloomで光らせます。Set Color over Lifeで明滅(点いて消える)を作ると、一気に蛍らしくなります。グラデーションは寿命全体(20〜40秒)に引き伸ばされるので、点いて消えるを何度も繰り返す形に描きます。

仕上げに、BlackboardにSpawnRate(Float・Exposed)を作ってConstant Spawn Rateにつなげば、本文で紹介したvisualEffect.SetFloat("SpawnRate", ...)で昼は0・夜は200のように時間帯と連動できます。

ポイントは2つです。 「環境系はSpawn Rate+広いShape+長い寿命」 という設計(ヒットエフェクトの真逆で、静かに・広く・長く生かします)と、 「ゲーム側との連携はExposedプロパティで」(グラフの中を書き換えるのではなく、外からつまみを回す形にしておくと昼夜・天候・イベントに反応させ放題です)。粒の見た目をもっと作り込みたくなったら Shader Graph との連携へ進んでください。

まとめ

VFX Graphは、GPUベースの高パフォーマンスなパーティクルシステムです。

  • GPUベース - 大量のパーティクルを高パフォーマンスで表示(数百万個も可能)
  • ノードベース - ビジュアルロジックでエフェクトを作成
  • Shader Graph統合 - カスタムシェーダーと連携可能
  • 4つのコンテキスト - Spawn、Initialize、Update、Outputで構成
  • ゲームとの連携は Exposedプロパティ+SetFloat で「外からつまみを回す」
用途推奨システム
大量パーティクル、高度な表現VFX Graph
衝突検出、シンプルなエフェクトParticle System

プロジェクトの要件に応じて、適切なパーティクルシステムを選択してください。あなたのゲームの空気感、粒をあと一桁増やせたら何が変わりますか?

次に読む学習パスの次の記事
VFX・エフェクト

「攻撃が当たった感じがしない」を直す:ヒットストップ・フラッシュ・揺れ・音のゲームフィール入門

この記事を読む
Unity このセクションのノート100