パーティクルシステム(Shuriken) で桜吹雪を作ったら、数を増やした途端にフレームレートが落ちた。星空も、雪原の吹雪も、「あと一桁多く粒が欲しい」ところでCPUが悲鳴を上げる——物量の壁にぶつかったら、それがVFX Graphの出番です。
VFX Graph は、Unity公式のノードベースのビジュアルエフェクト作成ツールです。パーティクルの計算をGPUで行うため、Shurikenでは数千個が限界だった粒を、数十万〜数百万個の規模で動かせます。
この記事でわかること
- Particle System(Shuriken)との違いと使い分けの基準
- VFX Graphの基本構造(Spawn / Initialize / Update / Output)
- 基本的な使い方とスクリプトからの制御
- システム要件とモバイルでの注意点
- 実践:夜の森に数万匹の蛍を飛ばす
従来のParticle Systemとの違い

Particle System(Shuriken)
- CPUベースのパーティクルシステム
- Unity初期から存在
- インスペクターで設定
- モジュール式の設計
- 衝突検出が可能
- 設定が簡単、情報が豊富
- 処理負荷が高くなりがち(数千個が限界)
VFX Graph
- GPUベースのパーティクルシステム
- ノードベースのグラフで設定
- 大量のパーティクルを表示可能(数百万個も可能)
- 衝突検出は限定的
- 学習コストが高い
- Shader Graphと統合可能
- より高度な表現が可能
パフォーマンス比較
| シナリオ | 推奨システム |
|---|---|
| 大量のパーティクルを1つのシステムで表示 | VFX Graph(圧倒的に軽い) |
| 多数の異なるエフェクトを同時に表示 | Particle System(軽い場合がある) |
| 同じエフェクトを大量に配置 | VFX Graph(インスタンシングで軽い) |
使い分けのポイント
VFX Graphを使うべき場合
- 大量のパーティクルを表示したい(爆発、炎、煙、魔法など)
- 高度な表現が必要
- Shader Graphと連携したい
- 同じエフェクトを大量に配置する
Particle Systemを使うべき場合
- 衝突検出が必要
- 素早く設定したい
- シンプルなエフェクトで十分
- 多数の異なるエフェクトを同時に表示する
VFX Graphの基本構造
2つの要素
VFX Graphは2つの要素で構成されます。
| 要素 | 説明 |
|---|---|
| Visual Effectコンポーネント | GameObjectにアタッチ |
| Visual Effect Asset | エフェクトの設定を格納 |
4つのコンテキストノード
VFX Graphのノードは 上から下 に向かってデータが流れます。Shurikenの 「パーティクルの一生」 と同じ考え方が、そのまま縦のグラフになった構造です。

1. Spawnコンテキストノード
フレームごとの生成数を決定し、Initialize Particleに渡します。
- Constant Spawn Rate - 一定の割合でSpawnイベントを発行
- Burst - 一度に大量のパーティクルを生成
その他のSpawnブロック:
Periodic Burst(一定間隔でバースト)、Variable Spawn Rate(動的に変化する生成レート)なども利用可能です。
2. Initialize Particleコンテキストノード
パーティクルの初期化を行います。
- Capacity - 同時に表示できるパーティクルの最大数(下記目安参照)
プラットフォーム別Capacity目安:
| プラットフォーム | 実用的なCapacity目安 | 備考 |
|---|---|---|
| ハイエンドPC | 100万〜500万 | GPU 性能に大きく依存 |
| ミドルレンジPC | 10万〜50万 | |
| コンソール | 10万〜100万 | プラットフォームによる |
| モバイル | 1万〜5万 | 発熱・バッテリーにも注意 |
Capacityの見積もり: Capacityは「最大同時存在数」です。生成レート×寿命で実際の表示数を見積もり、過剰に設定するとVRAMを無駄に消費します。
- Set LifeTime - パーティクルの寿命
- Set Position Shape - パーティクルの初期位置(形状から生成)
- Set Velocity - パーティクルの初期速度
3. Update Particleコンテキストノード
パーティクルの毎フレーム更新処理を行います。
- Gravity - 重力を適用
- Linear Drag - 抵抗を適用
- Force - 力を適用
- Collision - 衝突検出(限定的)
4. Output Particleコンテキストノード
パーティクルの最終的な描画設定を行います。
Outputの種類:
| Output | 用途 |
|---|---|
| Output Particle Quad | 板ポリゴン(最も一般的) |
| Output Particle Mesh | 3Dメッシュを使用 |
| Output Particle Strip | 軌跡・リボン表現 |
| Output Particle Point | ポイントスプライト |

主なブロック:
- Orient - パーティクルの向き(ビルボードなど)
- Set Size Over Life - 寿命に応じたサイズ変化
- Set Color Over Life - 寿命に応じた色変化
- Main Texture - 使用するテクスチャ
- Blend Mode - アルファブレンドの設定
インストール方法
- Window > Package Manager を開く
- Unity Registryを選択
- Visual Effect Graphを選択
- Installボタンをクリック
URPプロジェクトでの追加設定
バージョン注記: URP 14以降(Unity 2023.1+)では、VFX Graphは特別な設定なしで動作します。以下はそれ以前のバージョン向けの手順です。
URPプロジェクトでは、URP Assetでの設定が必要な場合があります。
- URP Asset(Universal Render Pipeline Asset)を選択
- Renderer List から使用しているRendererを選択
- Renderer Features でVFX Graphが有効になっていることを確認
基本的な使い方
エフェクトの作成
- GameObject > Visual Effects > Visual Effect を選択
- Visual Effectコンポーネントがアタッチされたゲームオブジェクトが作成される
- Visual Effectコンポーネントの「New」ボタンをクリック
- テンプレートを選択(Simple Loop、Burst、Continuousなど)
- ファイル名を付けて保存
グラフの編集
- ProjectウィンドウのVisual Effect Assetをダブルクリック
- VFX Graphウィンドウが開く
- ノードを追加・編集してエフェクトをカスタマイズ
Learning Templatesの活用
Unity公式の学習用テンプレートを使って学習できます。
- Assets > Create > Visual Effects > Visual Effect Graph を選択
- Create New VFX Assetウィンドウで「Install Learning Templates」をクリック
- 様々なテンプレートが追加される
プログラムからの制御
イベントの送信
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で取得するため、
// 1〜2フレームの遅延があります。
// パーティクルに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.SetVector4("color", new Vector4(color.r, color.g, color.b, color.a));
visualEffect.SendEvent("OnSpawn", eventAttribute);
}
VFX Graph側の設定: Initialize Particleコンテキストで
Get Source Attributeブロック(position、colorなど)を追加し、Eventから渡されたパラメータを受け取ります。
初期状態で停止させる方法
以下のいずれかの方法を使用します:
- Initial Event Nameを空に設定 - 自動再生を無効化
- 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)- 一部制限あり
- WebGL - 一部制限あり
GPU要件
- Compute ShaderをサポートするGPU
- DirectX 11以上、OpenGL ES 3.1以上、Vulkan、Metal
モバイルでの注意点
| 項目 | 推奨値 |
|---|---|
| 最小要件 | OpenGL ES 3.1以上(Android)/ Metal(iOS) |
| パーティクル数 | 1万〜5万個程度が実用的な上限 |
| Capacity設定 | 必要最小限に抑える |
モバイル最適化: モバイルではCapacityを小さく設定し、複雑なノードグラフを避けてください。古いデバイスではCompute Shaderが非対応の場合があります。
「数十万〜数百万」という粒子数はあくまでGPU性能に依存する目安です。数字を鵜呑みにせず、 対象端末でCapacityを段階的に増やしてフレームレートを計測し、「自分のゲームの限界値」を実測する のが確実です。10万→30万→100万と増やしながら Profiler で見る——それ自体がVFX Graphの楽しい実験になります。
モバイルでの主な制限:
- Output Particle Stripが非対応の場合がある
- Compute Shader非対応の古いデバイスでは動作しない
- SampleGradientノードの精度が低い場合がある
- デバイスの発熱によりGPUスロットリングが発生しやすい
Shader Graphとの連携
VFX GraphはShader Graphと統合でき、カスタムシェーダーでパーティクルを描画できます。
連携手順
- Shader Graph作成: VFX Graph用のShader Graphを作成
- URP:
Create > Shader Graph > URP > VFX Shader Graph - HDRP:
Create > Shader Graph > HDRP > VFX Shader Graph
- URP:
- Outputの設定: Output Particleコンテキストで
Shader Graphオプションを選択 - シェーダーの割り当て: 作成したVFX Shader Graphをドラッグ&ドロップ
用途: ディストーション、カスタムライティング、特殊な歪みエフェクトなど、標準のブレンドモードでは実現できない表現に使用します。
SDF(Signed Distance Field)の活用
VFX Graphの特徴的な機能として、SDFを使ってメッシュの形状に沿ったパーティクル生成や衝突検出が可能です。
Window > Visual Effects > Utilities > SDF Bake ToolでメッシュからSDFテクスチャを生成できます。
Output Event
パーティクルが消滅したタイミングでC#側にイベントを送信できます。ダメージ数値の表示やサウンドの再生トリガーなどに使用します。
注意点
衝突検出の制限
VFX Graphの衝突検出は限定的です。複雑な衝突が必要な場合はParticle Systemを使用してください。
学習コスト
ノードベースのため、最初は学習コストが高いです。Particle Systemに慣れている人は、最初は戸惑うかもしれません。Learning Templatesを活用して学習することをお勧めします。
レンダー パイプライン
URPまたはHDRPで使用します(Built-in Render Pipelineは非対応です)。
実践:夜の森に蛍を飛ばす
オープンワールドの夜の森に漂う蛍、和風ゲームの桜吹雪、ダンジョンに舞う塵——「主張しないけど大量にいる」環境エフェクトは、VFX Graphの一番おいしい使いどころです。ここでは蛍を例に、テンプレートから最短で組みます。

- テンプレートから作る: 「GameObject > Visual Effects > Visual Effect」でオブジェクトを作り、「New」からSimple Loop系テンプレートを選択します。
- Spawn:
Constant Spawn Rateを200前後に。蛍は一斉には生まれず、常に湧き続けるのでBurstではなくRateです。 - Initialize: Capacityを10,000に(湧き数×寿命で見積もり)。
Set Position ShapeをBoxにして森全体を覆うサイズへ広げ、Set Lifetimeを20〜40秒のランダムに。 - Update:
Turbulence(乱流)ブロックを追加して、ふわふわと不規則に漂わせます。直線的に飛ぶと虫ではなく弾に見えます。 - Output: サイズを小さく(0.02〜0.05)、色をHDRの淡い黄緑にしてBloomで光らせます。
Set Color Over Lifeで明滅(点いて消える)を作ると、一気に蛍らしく なります。
仕上げに、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 |
プロジェクトの要件に応じて、適切なパーティクルシステムを選択してください。あなたのゲームの空気感、粒をあと一桁増やせたら何が変わりますか?