Skip to content

第12回 VFX Graph入門

前回: 第11回 描画バッファとポストエフェクト

今回の授業内容

  • 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 SystemVFX Graph
主な処理CPUGPU
編集方法InspectorのModuleノードグラフ
得意な規模小〜中規模大量のパーティクル
ゲーム処理との連携C#やColliderと連携しやすいGPU上の属性としてまとめて処理する
調整方法Moduleごとに値を設定するContextへBlockを追加し、値を接続する

ノードグラフ上で、パーティクルの発生、初期状態、時間変化、描画方法を組み立てます
パーティクルの寿命や属性の扱いの概念はParticle Systemと同じですが、VFX Graphでは処理の順序や値の接続方法が異なります

ParticleSystemのエフェクトを移植する

第02回から第06回までに制作したParticle System製のエフェクトを一つ選び、VFX Graphに移植してみましょう
手元にない場合は、講師が用意したループする火花、または煙のエフェクトを使用してください

  1. Particle Systemを再生し、発生位置と移動方向を確認する
  2. Rate over TimeまたはBurstsを確認する
  3. Start LifetimeStart SpeedStart Sizeを記録する
  4. Shapeと、使用している力やNoiseを確認する
  5. Color over LifetimeまたはSize over Lifetimeの変化を確認する

このParticle Systemを、以降のVFX Graphと比較する基準にします

Particle SystemのModuleをVFX Graphに対応させる

今回は、これまでに制作したParticle Systemを参考にして、同じ表現意図をVFX Graphで作り直します
システムごとの差があるため設定値をそのままコピーすることはできない場合がありますが、基本的な概念は共通しています
適時読み替え、設定してください

Particle SystemVFX Graph共通する役割
EmissionSpawn Context発生数と発生タイミング
MainStart LifetimeStart SizeInitialize Particle Context寿命と初期サイズ
ShapeInitialize Particle ContextのPosition Block発生位置と形状
MainStart SpeedInitialize Particle ContextのVelocity Block初速
Gravity ModifierForce over LifetimeNoiseUpdate Particle ContextのBlock生存中の動き
Color over LifetimeSize over LifetimeUpdateまたはOutputのBlock生存時間に応じた変化
RendererOutput Particle Context粒子の形と描画方法
Max ParticlesCapacity同時に保持できる粒子数

Particle Systemでは機能別のModuleをInspectorで開いて設定します
VFX Graphでは、処理する時点をContextで選び、その中へBlockを追加します

VFX Graphの基本構造

VFX Graphアセットを作成する

VFX Graphアセットの作成メニューVFX Graphアセットの作成メニュー

VFX Graphのテンプレート選択VFX Graphのテンプレート選択

VFX Graphでは、エフェクトをVisual Effect Graphアセットとして扱い、Visual Effectコンポーネントを通じてシーンで再生します

  1. ProjectウィンドウでCreate > Visual Effects > Visual Effect Graphを選ぶ
  2. テンプレート選択画面が表示された場合はSimple Loopを選ぶ
  3. 作成したGraphアセットをシーンへドラッグする
  4. 生成されたGameObjectのVisual Effectコンポーネントを確認する
  5. GraphアセットをダブルクリックしてVisual Effect Graphウィンドウを開く

テンプレート名やメニューの配置はVFX Graphのバージョンによって異なる場合があります
Simple Loopがない場合は、ループ再生する基本テンプレートを選んでください

同じGraphアセットを複数のGameObjectへ設定すると、処理を共有しながら個別に値を調整できます

Graphウィンドウの要素

要素役割
ContextSpawn、Initialize、Update、Outputなど、処理段階を表す大きなノード
BlockContextの中で属性を設定または更新する処理
Operator計算、ランダム化、値の変換などを行い、入力へ結果を渡すノード
BlackboardGraphで使用するプロパティを管理するパネル
FlowContext同士を接続し、処理の流れを作る線

Contextの中へBlockを追加し、必要に応じてOperatorやBlackboardのプロパティを接続します
Shader Graphと似た操作を使いますが、VFX Graphではパーティクルのライフサイクルもグラフ上に表示されます

4つのContext

基本的なパーティクルシステムは、次の順で処理されます

Context実行される時点主な役割設定例
Spawnパーティクルを発生させるとき発生数と発生タイミングを決めるConstant Spawn Rate
Initialize Particleパーティクルごとに最初の1回初期状態を決めるPositionLifetimeSizeVelocity
Update Particle生存中の毎フレーム動きや値を変化させるGravityForceTurbulenceDrag
Output Particle毎フレーム描画するとき形と見た目を決めるQuadMeshColorTexture

VFX Graphの4つのContextVFX Graphの4つのContext

Initialize Particleで初期値を与え、Update Particleで時間変化させ、Output Particleが現在の属性を使って描画します
PositionVelocityColorSizeAgeLifetimeなど、パーティクルごとに保持される値を属性と呼びます

LoopとBurst

パーティクルの発生方法は、大きく2種類に分けられます

発生方法動作使用例
Loop一定の間隔で発生し続ける雨、煙、炎、オーラ
Burst一度に指定数を発生させる爆発、ヒット、着地

今回は変化を観察しやすいLoopを使います
実習が完成した後で、余裕があればBurstへ変更して違いを確認してください

基本実習:Particle SystemをVFX Graphへ移植する

完成例:4つのContextで作る火花

VFX Graphで制作した火花エフェクトの例VFX Graphで制作した火花エフェクトの例
基本の火花に残光を追加してさらに発展させている

火花は基本的なパラメーター設定で比較的簡単に作れる表現です
VFX GraphではGPU上で効率的に処理されるため、より大量の粒子を扱えます
この完成例はBurstですが、実習1から実習3では変化を確認しやすいLoopから作り始めます

Context火花での役割設定例
Spawn衝突した瞬間にまとめて発生させるBurst
Initialize Particle発生位置、寿命、初速、サイズを決める上方向を含むランダムな速度
Update Particle放物線運動と減速を作るGravityLinear Drag
Output Particle明るい粒子を描画する小さなQuad、黄からオレンジの色

画像の細長い残光はGPU Eventを使った発展要素であり、今回の完成条件には含めません

Particle SystemではMainEmissionShapeなど複数のModuleを移動しながら設定します
VFX Graphでは、発生時の処理をInitialize Particle、生存中の処理はUpdate Particleで行います

実習1:最小構成を再生する

最初に、単純な位置からQuadを発生させます
この段階では派手な見た目よりも、4つのContextが接続され、変更した値が結果へ反映されることを優先します

  1. Spawn Contextで一定数のパーティクルを発生させる
  2. Initialize ContextでLifetimeSizeを設定する
  3. Initialize ContextへSphereまたはAABoxのPosition Blockを追加する
  4. Update Contextは初期状態のままにする
  5. Output Particle Quadを接続して表示する
  6. Graphを保存し、SceneビューまたはGameビューで再生を確認する

まず次の値を変更し、画面上の変化を確認してください

設定確認する変化
Spawn Rate1秒間に発生する数
Lifetime発生してから消えるまでの時間
Size1粒の大きさ
Positionの範囲パーティクルが発生する空間

Block名はVFX Graphのバージョンによって異なる場合があります
追加メニューの検索欄へSpawn RateLifetimeSizePositionを入力して探してください

実習2:初速と力で動きを作る

Initialize Contextへ速度を設定すると、パーティクルは発生した時点から移動します
Update ContextへGravityやDragを追加すると、生存中の動きが毎フレーム変化します

text
Initialize: 発生方向と初速を決める
Update:     重力で落下させ、Dragで減速させる

Initialize Contextで初速を設定する例

  1. Initialize Contextへ速度を設定するBlockを追加する
  2. 上方向を基本に、方向へランダムな広がりを加える
  3. Speedに最小値と最大値を設定する
  4. Update ContextへGravityを追加する
  5. Update ContextへLinear Dragを追加する
  6. GravityとDragを一度無効にし、それぞれが動きへ与える影響を比較する

Update ContextでGravityとLinear Dragを設定する例

速度を大きくしただけでは粒子が画面外へ飛び続けます
Gravityは移動方向を変え、Dragは速度を徐々に減らします
複数のBlockを一度に強くせず、一つずつ有効と無効を切り替えて効果を確認してください

実習3:生存時間に応じて見た目を変える

パーティクルが突然現れて突然消えると、動きが硬く見えます
Lifetime中の色、Alpha、Sizeを変化させ、出現と消滅を調整します

  1. Lifetime中のColorまたはAlphaを変化させるBlockを追加する
  2. 発生直後のAlphaを0から上げる
  3. 消滅直前のAlphaを0へ戻す
  4. Lifetime中のSizeを変化させるBlockを追加する
  5. 最初と最後を小さくし、途中で最大になるカーブを作る
  6. 明るい色を使う場合は、第11回のBloomを有効にして画面全体を確認する

Color、Alpha、Sizeをすべて大きく変える必要はありません
どの変化が見た目を作っているか説明できるよう、一つずつ調整します

公開プロパティでGraphを再利用する

Blackboardで公開プロパティを作る

Blackboardへ追加したプロパティは、Graph内の複数箇所で利用できます
プロパティをExposedにすると、シーンのVisual Effectコンポーネントから値を変更できます

今回の実習では、次のうち2つ以上を公開してください

プロパティ調整する内容
SpawnRate発生数
Speed初速
ParticleSize粒子サイズ
EffectColor

公開プロパティを接続する

  1. Blackboardへ必要な型のプロパティを追加する
  2. 内容が分かる名前へ変更する
  3. Exposedを有効にする
  4. プロパティをGraphへドラッグする
  5. 対応するBlockの入力へ接続する
  6. Graphを保存する
  7. Visual Effectコンポーネントから値を変更する

調整値をBlockへ直接書くだけでなく公開プロパティへまとめると、Graphを開かずにバリエーションを作れます

同じGraphから2つのバリエーションを作る

VFX Graphは処理をGraphアセットへ保存し、シーン上のVisual Effectコンポーネントから公開プロパティを上書きできます

  1. 完成したVFX GraphのGameObjectを複製する
  2. 2つが同じVisual Effect Graphアセットを参照していることを確認する
  3. 一方のSpawnRateEffectColorを変更する
  4. Graphを編集せず、2つの見た目を変えられることを確認する
  5. 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の確認が特に重要です

  1. Spawn RateLifetimeから、おおよその同時生存数を計算する
  2. Capacityを計算結果より小さくし、粒子数が頭打ちになるか確認する
  3. Capacityを必要な値へ戻す
  4. Boundsを意図的に小さくし、カメラやGameObjectを動かしてエフェクト全体がカリングされる状態を確認する
  5. 粒子の移動範囲が収まるようにBoundsを調整する
  6. Spawn Rateを段階的に増やし、見た目と動作の変化を確認して元へ戻す

Particle SystemとVFX Graphの性能を単純な粒子数だけで断定することはできません
透明な粒子の大きさ、画面上の重なり、Blockの処理、対象端末によって負荷が変わるため、この実習では設定方法と変化の観察を目的にします

発展例

フリップブック:既習のテクスチャーアニメを移植する

第05回と第06回では、Particle SystemのTexture Sheet Animationを使って煙や爆発を再生しました
VFX Graphでも、同じフリップブックテクスチャーを利用できます

爆発の5×5フリップブックテクスチャー5×5に並べた爆発のフリップブック
出典: Unity「無料のVFX画像シーケンスとフリップブック」CC0 1.0

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

Output Particle QuadのFlipbook設定Output Particle Quadへフリップブックの分割数とテクスチャーを設定する例

基本的な対応は次のとおりです

Particle SystemVFX Graph
Texture Sheet AnimationFlipbook Player Block
TilesFlip 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を使用している
  • SpawnInitialize ParticleUpdate ParticleOutput Particleの4つのContextを確認できる
  • Sphere、Box、Coneなど、発生位置の形を一つ設定している
  • 初速、Gravity、Force、Turbulenceのいずれかで動きを作っている
  • Lifetime中にColor、Alpha、Sizeのいずれかが変化する
  • 発生数、速度、色、サイズのうち2つ以上を公開プロパティで調整できる
  • 同じGraphアセットを使った2つのバリエーションを確認できる
  • Particle SystemのModuleとVFX GraphのContextの対応を3つ以上説明できる
  • CapacityBoundsを必要な範囲へ設定している
  • Particle System版とVFX Graph版を比較できるスクリーンショットまたは短い動画を提出する

確認観点

  • Particle SystemのどのModuleを、VFX GraphのどのContextへ置き換えたか
  • InspectorのModule編集と、ContextへBlockを追加する編集の違いを説明できるか
  • 発生位置と移動方向が意図した表現に合っているか
  • Gravity、Drag、Turbulenceなどの効果を説明できるか
  • 出現と消滅が不自然に途切れていないか
  • 同じGraphを参照する2つのGameObjectを公開プロパティで変更できるか
  • Spawn RateLifetimeに対してCapacityが不足していないか
  • Boundsを小さくしたときに起きる変化を説明できるか
  • BloomやAdditiveによって形が白く潰れていないか

よくある問題

問題確認する場所
何も表示されないSpawn RateLifetimeSizeOutput Particleの接続
原点に固まっているInitialize Particle ContextのPositionVelocity
すぐに消えるLifetimeVelocityBounds
動きが激しすぎるSpeedGravityForceTurbulenceを個別に確認
粒子数が増えないCapacitySpawn RateLifetime
Inspectorの値が反映されないExposed、プロパティの接続、Graphの保存
全体が白く潰れるColorAlphaAdditiveBloom、粒子サイズ
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アセットを共有したバリエーションで変更した項目
  • CapacityBoundsで確認した変化
  • Particle SystemとVFX Graphがそれぞれ扱いやすいと感じた点
  • 追加で改善したい点

今回のまとめ:4つのContextでパーティクルの一生を組み立てる

  • VFX GraphはGPUを使って大量のパーティクルを処理できます
  • Particle SystemのModuleに相当する処理を、VFX Graphでは4つのContextへ分けて構成します
  • SpawnInitialize ParticleUpdate ParticleOutput Particleの順で、発生から描画までを構成します
  • LoopとBurstはSpawn Contextで使い分けます
  • Blackboardの公開プロパティを使うと、Graphを開かずに値を調整できます
  • 同じGraphアセットを共有しながら、GameObjectごとに公開プロパティを変更できます
  • Capacityは保持できる粒子数、Boundsはパーティクルが存在する空間範囲です
  • 最初に最小構成を表示し、Blockを一つずつ追加して効果を確認することが重要です

参考資料