Appearance
第12回 VFX Graph入門
今回の授業内容
- VFX GraphとParticle Systemの違いを理解する
- VFX Graphの4つのContextとパーティクルの処理順を理解する
- Particle SystemのModuleをVFX GraphのContextとBlockへ置き換える
- 同じGraphアセットから公開プロパティの異なるバリエーションを作る
- CapacityとBoundsが表示や粒子数へ与える影響を確認する
授業を始める前の確認
第01回ではVisual Effect Graphパッケージを導入し、Graphをシーンで再生できるところまで確認しています
セットアップが完了していない場合は、先に第01回のVFX Graphセットアップを行ってください
次の状態になれば準備完了です
- URPを使用している
- Visual Effect Graphパッケージがインストールされている
- Visual Effect Graphアセットを作成できる
- Graphをシーンへ配置してもConsoleにエラーが出ない
VFX Graphとは
VFX Graphは、GPUを使ってパーティクルを処理するUnityのエフェクト制作機能です
- GPU上で大量のパーティクルを処理できる
- ノードとBlockを使って処理を視覚的に構成できる
- 再生中に値を変更し、結果をリアルタイムに確認できる
- メッシュ、テクスチャー、Shader Graphなどを組み合わせて、より高度な表現も実現可能
総じてParticle Systemよりも大規模で複雑なエフェクトを制作できます
一方でCompute Shaderに対応した環境が必要なため、古いハードウェアでは動作しない場合があります
Particle Systemとの違い
| 項目 | Particle System | VFX Graph |
|---|---|---|
| 主な処理 | CPU | GPU |
| 編集方法 | InspectorのModule | ノードグラフ |
| 得意な規模 | 小〜中規模 | 大量のパーティクル |
| ゲーム処理との連携 | C#やColliderと連携しやすい | GPU上の属性としてまとめて処理する |
| 調整方法 | Moduleごとに値を設定する | ContextへBlockを追加し、値を接続する |
ノードグラフ上で、パーティクルの発生、初期状態、時間変化、描画方法を組み立てます
パーティクルの寿命や属性の扱いの概念はParticle Systemと同じですが、VFX Graphでは処理の順序や値の接続方法が異なります
ParticleSystemのエフェクトを移植する
第02回から第06回までに制作したParticle System製のエフェクトを一つ選び、VFX Graphに移植してみましょう
手元にない場合は、講師が用意したループする火花、または煙のエフェクトを使用してください
- Particle Systemを再生し、発生位置と移動方向を確認する
Rate over TimeまたはBurstsを確認するStart Lifetime、Start Speed、Start Sizeを記録するShapeと、使用している力やNoiseを確認するColor over LifetimeまたはSize over Lifetimeの変化を確認する
このParticle Systemを、以降のVFX Graphと比較する基準にします
Particle SystemのModuleをVFX Graphに対応させる
今回は、これまでに制作したParticle Systemを参考にして、同じ表現意図をVFX Graphで作り直します
システムごとの差があるため設定値をそのままコピーすることはできない場合がありますが、基本的な概念は共通しています
適時読み替え、設定してください
| Particle System | VFX Graph | 共通する役割 |
|---|---|---|
Emission | Spawn Context | 発生数と発生タイミング |
MainのStart Lifetime、Start Size | Initialize Particle Context | 寿命と初期サイズ |
Shape | Initialize Particle ContextのPosition Block | 発生位置と形状 |
MainのStart Speed | Initialize Particle ContextのVelocity Block | 初速 |
Gravity Modifier、Force over Lifetime、Noise | Update Particle ContextのBlock | 生存中の動き |
Color over Lifetime、Size over Lifetime | UpdateまたはOutputのBlock | 生存時間に応じた変化 |
Renderer | Output Particle Context | 粒子の形と描画方法 |
Max Particles | Capacity | 同時に保持できる粒子数 |
Particle Systemでは機能別のModuleをInspectorで開いて設定します
VFX Graphでは、処理する時点をContextで選び、その中へBlockを追加します
VFX Graphの基本構造
VFX Graphアセットを作成する
VFX Graphアセットの作成メニュー
VFX Graphのテンプレート選択
VFX Graphでは、エフェクトをVisual Effect Graphアセットとして扱い、Visual Effectコンポーネントを通じてシーンで再生します
- Projectウィンドウで
Create > Visual Effects > Visual Effect Graphを選ぶ - テンプレート選択画面が表示された場合は
Simple Loopを選ぶ - 作成したGraphアセットをシーンへドラッグする
- 生成されたGameObjectの
Visual Effectコンポーネントを確認する - GraphアセットをダブルクリックしてVisual Effect Graphウィンドウを開く
テンプレート名やメニューの配置はVFX Graphのバージョンによって異なる場合がありますSimple Loopがない場合は、ループ再生する基本テンプレートを選んでください
同じGraphアセットを複数のGameObjectへ設定すると、処理を共有しながら個別に値を調整できます
Graphウィンドウの要素
| 要素 | 役割 |
|---|---|
| Context | Spawn、Initialize、Update、Outputなど、処理段階を表す大きなノード |
| Block | Contextの中で属性を設定または更新する処理 |
| Operator | 計算、ランダム化、値の変換などを行い、入力へ結果を渡すノード |
| Blackboard | Graphで使用するプロパティを管理するパネル |
| Flow | Context同士を接続し、処理の流れを作る線 |
Contextの中へBlockを追加し、必要に応じてOperatorやBlackboardのプロパティを接続します
Shader Graphと似た操作を使いますが、VFX Graphではパーティクルのライフサイクルもグラフ上に表示されます
4つのContext
基本的なパーティクルシステムは、次の順で処理されます
| Context | 実行される時点 | 主な役割 | 設定例 |
|---|---|---|---|
Spawn | パーティクルを発生させるとき | 発生数と発生タイミングを決める | Constant Spawn Rate |
Initialize Particle | パーティクルごとに最初の1回 | 初期状態を決める | Position、Lifetime、Size、Velocity |
Update Particle | 生存中の毎フレーム | 動きや値を変化させる | Gravity、Force、Turbulence、Drag |
Output Particle | 毎フレーム描画するとき | 形と見た目を決める | Quad、Mesh、Color、Texture |
VFX Graphの4つのContext
Initialize Particleで初期値を与え、Update Particleで時間変化させ、Output Particleが現在の属性を使って描画しますPosition、Velocity、Color、Size、Age、Lifetimeなど、パーティクルごとに保持される値を属性と呼びます
LoopとBurst
パーティクルの発生方法は、大きく2種類に分けられます
| 発生方法 | 動作 | 使用例 |
|---|---|---|
| Loop | 一定の間隔で発生し続ける | 雨、煙、炎、オーラ |
| Burst | 一度に指定数を発生させる | 爆発、ヒット、着地 |
今回は変化を観察しやすいLoopを使います
実習が完成した後で、余裕があればBurstへ変更して違いを確認してください
基本実習:Particle SystemをVFX Graphへ移植する
完成例:4つのContextで作る火花
VFX Graphで制作した火花エフェクトの例
基本の火花に残光を追加してさらに発展させている
火花は基本的なパラメーター設定で比較的簡単に作れる表現です
VFX GraphではGPU上で効率的に処理されるため、より大量の粒子を扱えます
この完成例はBurstですが、実習1から実習3では変化を確認しやすいLoopから作り始めます
| Context | 火花での役割 | 設定例 |
|---|---|---|
Spawn | 衝突した瞬間にまとめて発生させる | Burst |
Initialize Particle | 発生位置、寿命、初速、サイズを決める | 上方向を含むランダムな速度 |
Update Particle | 放物線運動と減速を作る | Gravity、Linear Drag |
Output Particle | 明るい粒子を描画する | 小さなQuad、黄からオレンジの色 |
画像の細長い残光はGPU Eventを使った発展要素であり、今回の完成条件には含めません
Particle SystemではMain、Emission、Shapeなど複数のModuleを移動しながら設定します
VFX Graphでは、発生時の処理をInitialize Particle、生存中の処理はUpdate Particleで行います
実習1:最小構成を再生する
最初に、単純な位置からQuadを発生させます
この段階では派手な見た目よりも、4つのContextが接続され、変更した値が結果へ反映されることを優先します
- Spawn Contextで一定数のパーティクルを発生させる
- Initialize Contextで
LifetimeとSizeを設定する - Initialize ContextへSphereまたはAABoxのPosition Blockを追加する
- Update Contextは初期状態のままにする
- Output Particle Quadを接続して表示する
- Graphを保存し、SceneビューまたはGameビューで再生を確認する
まず次の値を変更し、画面上の変化を確認してください
| 設定 | 確認する変化 |
|---|---|
Spawn Rate | 1秒間に発生する数 |
Lifetime | 発生してから消えるまでの時間 |
Size | 1粒の大きさ |
Positionの範囲 | パーティクルが発生する空間 |
Block名はVFX Graphのバージョンによって異なる場合があります
追加メニューの検索欄へSpawn Rate、Lifetime、Size、Positionを入力して探してください
実習2:初速と力で動きを作る
Initialize Contextへ速度を設定すると、パーティクルは発生した時点から移動します
Update ContextへGravityやDragを追加すると、生存中の動きが毎フレーム変化します
text
Initialize: 発生方向と初速を決める
Update: 重力で落下させ、Dragで減速させる
- Initialize Contextへ速度を設定するBlockを追加する
- 上方向を基本に、方向へランダムな広がりを加える
- Speedに最小値と最大値を設定する
- Update ContextへGravityを追加する
- Update ContextへLinear Dragを追加する
- GravityとDragを一度無効にし、それぞれが動きへ与える影響を比較する

速度を大きくしただけでは粒子が画面外へ飛び続けます
Gravityは移動方向を変え、Dragは速度を徐々に減らします
複数のBlockを一度に強くせず、一つずつ有効と無効を切り替えて効果を確認してください
実習3:生存時間に応じて見た目を変える
パーティクルが突然現れて突然消えると、動きが硬く見えます
Lifetime中の色、Alpha、Sizeを変化させ、出現と消滅を調整します
- Lifetime中のColorまたはAlphaを変化させるBlockを追加する
- 発生直後のAlphaを0から上げる
- 消滅直前のAlphaを0へ戻す
- Lifetime中のSizeを変化させるBlockを追加する
- 最初と最後を小さくし、途中で最大になるカーブを作る
- 明るい色を使う場合は、第11回のBloomを有効にして画面全体を確認する
Color、Alpha、Sizeをすべて大きく変える必要はありません
どの変化が見た目を作っているか説明できるよう、一つずつ調整します
公開プロパティでGraphを再利用する
Blackboardで公開プロパティを作る
Blackboardへ追加したプロパティは、Graph内の複数箇所で利用できます
プロパティをExposedにすると、シーンのVisual Effectコンポーネントから値を変更できます
今回の実習では、次のうち2つ以上を公開してください
| プロパティ | 調整する内容 |
|---|---|
SpawnRate | 発生数 |
Speed | 初速 |
ParticleSize | 粒子サイズ |
EffectColor | 色 |
公開プロパティを接続する
- Blackboardへ必要な型のプロパティを追加する
- 内容が分かる名前へ変更する
Exposedを有効にする- プロパティをGraphへドラッグする
- 対応するBlockの入力へ接続する
- Graphを保存する
- Visual Effectコンポーネントから値を変更する
調整値をBlockへ直接書くだけでなく公開プロパティへまとめると、Graphを開かずにバリエーションを作れます
同じGraphから2つのバリエーションを作る
VFX Graphは処理をGraphアセットへ保存し、シーン上のVisual Effectコンポーネントから公開プロパティを上書きできます
- 完成したVFX GraphのGameObjectを複製する
- 2つが同じVisual Effect Graphアセットを参照していることを確認する
- 一方の
SpawnRateとEffectColorを変更する - Graphを編集せず、2つの見た目を変えられることを確認する
- Particle Systemで同じ変更を行う場合、どのModuleを編集するか確認する
この比較では、Graphが処理内容、公開プロパティがインスタンスごとの調整値を担当していることを確認します
CapacityとBoundsを比較する
Capacity
Initialize ContextのCapacityは、そのシステムが同時に保持できるパーティクル数です
おおよその同時生存数は、次のように見積もれます
text
同時生存数 ≒ 1秒間の発生数 × Lifetime例えば、1秒間に100個発生し、Lifetimeが2秒なら、約200個が同時に存在します
Capacityが小さすぎると必要な数を保持できず、大きすぎると余分なメモリを確保します
Bounds
Boundsは、VFX Graphのシステム全体がカメラから見えるかを判定するためのバウンディングボックスです
実際の粒子が広がる範囲より小さいと、まだ画面に粒子が見える位置でもシステム全体がカリングされ、描画やシミュレーションが止まる場合があります
個々の粒子をBoundsの境界で消す機能ではありません
粒子が動く範囲を含む大きさへ設定してください
問題が起きたときに無制限に広げるのではなく、速度とLifetimeから必要な範囲を考えます
CapacityとBoundsの影響を確認する
Particle SystemのMax Particlesに相当する上限を、VFX GraphではCapacityで設定します
また、VFX GraphではGPU上の粒子を効率よくカリングするため、Boundsの確認が特に重要です
Spawn RateとLifetimeから、おおよその同時生存数を計算するCapacityを計算結果より小さくし、粒子数が頭打ちになるか確認するCapacityを必要な値へ戻すBoundsを意図的に小さくし、カメラやGameObjectを動かしてエフェクト全体がカリングされる状態を確認する- 粒子の移動範囲が収まるように
Boundsを調整する Spawn Rateを段階的に増やし、見た目と動作の変化を確認して元へ戻す
Particle SystemとVFX Graphの性能を単純な粒子数だけで断定することはできません
透明な粒子の大きさ、画面上の重なり、Blockの処理、対象端末によって負荷が変わるため、この実習では設定方法と変化の観察を目的にします
発展例
フリップブック:既習のテクスチャーアニメを移植する
第05回と第06回では、Particle SystemのTexture Sheet Animationを使って煙や爆発を再生しました
VFX Graphでも、同じフリップブックテクスチャーを利用できます
5×5に並べた爆発のフリップブック
出典: Unity「無料のVFX画像シーケンスとフリップブック」(CC0 1.0)

Update Particleで再生フレームを進める例

Output Particle Quadへフリップブックの分割数とテクスチャーを設定する例
基本的な対応は次のとおりです
| Particle System | VFX Graph |
|---|---|
Texture Sheet Animation | Flipbook Player Block |
Tiles | Flip Book Size |
| フレームの進行 | Frame Rateまたは寿命に応じた進行 |
| Rendererのマテリアル | Output Particle Quadのテクスチャー |
VFX GraphのバージョンによってBlock名やOutputの設定項目が異なる場合があります
今回は発展例として構成を確認し、基本課題が完成した場合だけ試してください
さらに発展すると作れる表現
2025年度の教材では、VFX Graphを使って次の表現も扱いました
- 複数のパーティクルシステムとフリップブックを組み合わせた爆発
- GPU Eventで、火花や破片から別の粒子を発生させる表現
Output Particle Stripを使った流星、トレイル、ビーム- メッシュサンプリングやSDFを使った形状に沿うエフェクト
これらは、4つのContextと属性の扱いを理解した後に学ぶ発展内容です
今回は作品例として、基本構成がどのように発展するかを確認してください
授業内課題:Particle SystemをVFX Graphで再構成してください
比較実習0で選んだParticle Systemを参考に、同じ種類のエフェクトをVFX Graphで制作します
見た目の完全な再現ではなく、発生、初期状態、時間変化、描画を4つのContextへ対応させることを優先してください
完成後はParticle System版とVFX Graph版を同じシーンへ並べ、設定方法と結果を比較します
完成条件
- 比較元となるParticle SystemとVFX Graph版を同じシーンで確認できる
- VFX Graphを使用している
Spawn、Initialize Particle、Update Particle、Output Particleの4つのContextを確認できる- Sphere、Box、Coneなど、発生位置の形を一つ設定している
- 初速、Gravity、Force、Turbulenceのいずれかで動きを作っている
- Lifetime中にColor、Alpha、Sizeのいずれかが変化する
- 発生数、速度、色、サイズのうち2つ以上を公開プロパティで調整できる
- 同じGraphアセットを使った2つのバリエーションを確認できる
- Particle SystemのModuleとVFX GraphのContextの対応を3つ以上説明できる
CapacityとBoundsを必要な範囲へ設定している- Particle System版とVFX Graph版を比較できるスクリーンショットまたは短い動画を提出する
確認観点
- Particle SystemのどのModuleを、VFX GraphのどのContextへ置き換えたか
- InspectorのModule編集と、ContextへBlockを追加する編集の違いを説明できるか
- 発生位置と移動方向が意図した表現に合っているか
- Gravity、Drag、Turbulenceなどの効果を説明できるか
- 出現と消滅が不自然に途切れていないか
- 同じGraphを参照する2つのGameObjectを公開プロパティで変更できるか
Spawn RateとLifetimeに対してCapacityが不足していないかBoundsを小さくしたときに起きる変化を説明できるか- BloomやAdditiveによって形が白く潰れていないか
よくある問題
| 問題 | 確認する場所 |
|---|---|
| 何も表示されない | Spawn Rate、Lifetime、Size、Output Particleの接続 |
| 原点に固まっている | Initialize Particle ContextのPositionとVelocity |
| すぐに消える | Lifetime、Velocity、Bounds |
| 動きが激しすぎる | Speed、Gravity、Force、Turbulenceを個別に確認 |
| 粒子数が増えない | Capacity、Spawn Rate、Lifetime |
| Inspectorの値が反映されない | Exposed、プロパティの接続、Graphの保存 |
| 全体が白く潰れる | Color、Alpha、Additive、Bloom、粒子サイズ |
| VFX Graphを作成できない | URP、Package Manager、対応GPU、Console |
問題が起きた場合はBlockを追加し続けず、最小構成へ戻して確認します
Spawn、Initialize、Outputだけで表示できれば、UpdateのBlockを一つずつ有効にして原因を絞り込めます
余裕があれば挑戦
基本課題が完成した場合は、次のうち一つだけ追加してください
- LoopをBurstへ変更し、ヒットや爆発に作り替える
- 発生位置の形をSphereからConeやBoxへ変更する
- Unity Profilerを使い、Particle System版とVFX Graph版の処理時間を確認する
- 第11回のEmissionとBloomを利用して発光を加える
- Outputのテクスチャーを変更する
メッシュサンプリング、スキンメッシュ、SDF、GPU Eventは、VFX Graphの基本を理解した後に扱う発展内容です
今回は完成条件に含めません
提出時の説明
- 制作したエフェクトの種類
- 比較元として使用したParticle System
- Particle SystemのModuleをVFX GraphのどのContextへ対応させたか
- LoopとBurstのどちらを使用したか
- 発生位置と移動方向をどのように設定したか
- Update Contextで使用したBlockとその効果
- 公開プロパティで調整できる項目
- Graphアセットを共有したバリエーションで変更した項目
CapacityとBoundsで確認した変化- Particle SystemとVFX Graphがそれぞれ扱いやすいと感じた点
- 追加で改善したい点
今回のまとめ:4つのContextでパーティクルの一生を組み立てる
- VFX GraphはGPUを使って大量のパーティクルを処理できます
- Particle SystemのModuleに相当する処理を、VFX Graphでは4つのContextへ分けて構成します
Spawn、Initialize Particle、Update Particle、Output Particleの順で、発生から描画までを構成します- LoopとBurstはSpawn Contextで使い分けます
- Blackboardの公開プロパティを使うと、Graphを開かずに値を調整できます
- 同じGraphアセットを共有しながら、GameObjectごとに公開プロパティを変更できます
- Capacityは保持できる粒子数、Boundsはパーティクルが存在する空間範囲です
- 最初に最小構成を表示し、Blockを一つずつ追加して効果を確認することが重要です