Hero background image
Unity の VFX Graph の紹介

Visual Effect Graph (VFX Graph) を使用すると、ノードベースのビジュアル ロジックを使用して、単純なエフェクトと複雑なエフェクトの両方を作成できます。Unity で利用できるいくつかの主要なツールセットの 1 つである VFX Graph を使用すると、アーティストやデザイナーはほとんどまたはまったくコーディングせずに作成できます。

視覚効果は、プレイヤーに深い没入感を与える体験を作り出すための鍵となります。そして、ハードウェアの継続的な進歩のおかげで、かつてはハリウッドの大ヒット映画でしか実現できなかったものが、今ではリアルタイムで実現できるようになりました。

この記事は、Unity 2021 LTS バージョンの VFX Graph を使用するアーティスト、テクニカルアーティスト、プログラマー向けのガイドとなる、120 ページの電子書籍 『Unity で高度な視覚効果を作成するための決定版ガイド』からの抜粋です。ゲームに、豊富なレイヤーを備えたリアルタイムの視覚効果を生み出すためのリファレンスとして活用してください。

魔法のランプ VFX サンプルシーン
魔法のランプ VFX サンプルシーン
Unity でリアルタイム VFX を始める

ハイエンド プラットフォームで複雑な AAA レベルの視覚効果を実現するには、VFX Graph を使用して、直感的なノードベースのインターフェイスで GPU アクセラレーション パーティクルを作成します。

具体的には、VFX Graph を 活用して次のことを実現します。

1つまたは複数のパーティクルシステムを作成する

静的メッシュを追加し、シェーダーのプロパティを制御する

C# またはタイムラインでイベントを作成し、エフェクトの一部をオン/オフにします。

よく使用されるノードの組み合わせのサブグラフを作成して機能ライブラリを拡張します。

VFX Graph を別の VFX Graph 内で使用する (例: 小さな爆発を別の大きな効果の一部として使用する)

さまざまなレートでの変更をプレビューしたり、ステップバイステップのシミュレーションを実行したりします。

VFX Graph は、 ユニバーサル レンダー パイプライン (URP)* および 高解像度レンダー パイプライン (HDRP) と連携します。また、URP で利用可能な Lit 出力と 2D レンダラー のサポートも追加されます。すべてのレンダリング パイプラインの VFX Graph 機能の比較については 、こちらでご確認ください。

VFX Graph では、デバイスとの互換性を維持するためにコンピュート シェーダーのサポートが必要です。サポートされているデバイスは次のとおりです:

Metal グラフィックスAPI を使用する macOS および iOS プラットフォーム

VulkanまたはGLES3API を備えた Linux および Windows プラットフォーム

ハイエンドコンピューティング対応デバイスのサブセット向けの Android (URP のみ)

コアグラフィックパッケージ

Unity 2021 LTS 以降では、プロジェクトに VFX Graph を効率的にインストールできます。コア グラフィック パッケージがメインの Unity インストーラー内に組み込まれ、プロジェクトが常に最新の検証済みグラフィック コードで実行されるようになりました。

Unity の最新リリースをインストールすると、URP、HDRP、Shader Graph、VFX Graph などの最新パッケージがインストールに含まれます。

詳細については、「VFX Graph の使い方」 を参照するか、 このブログ投稿をお読みください。

* Unity 2021 LTS 以降では、カメラバッファーへのアクセスは HDRP でのみ利用可能です。VFX Graphの互換性の詳細については、ドキュメンテーション

VFX GRAPH アセットとビジュアルエフェクトコンポーネント
VFX GRAPH アセットとビジュアルエフェクトコンポーネント
VFX Graphアセットとコンポーネント

VFX Graph の視覚効果は、次の 2 つの部分で構成されます。

シーン内のゲームオブジェクトにアタッチされたビジュアルエフェクト(VFX)コンポーネント

プロジェクトレベルで存在する視覚効果 (VFX) グラフ アセット

Unity は各 VFX Graph を Assets フォルダーに保存するため、各アセットをシーン内の Visual Effect コンポーネントに接続する必要があります。実行時に異なる GameObject が同じグラフを参照する可能性があることに注意してください。

新しい視覚効果を作成するには、 プロジェクト ウィンドウを右クリックし、[作成] > [視覚効果] > [視覚効果グラフ]に移動します。これにより、VFX Graph アセットが作成されます。

Unity では、Visual Effect コンポーネントを使用して VFX Graph アセットGameObject に接続する方法がいくつか用意されています。

結果のアセットをシーンビューまたは階層にドラッグします。新しいデフォルトの GameObject が階層ウィンドウに表示されます。

インスペクターで既存のビジュアルエフェクトコンポーネントにアセットを割り当てます。GameObjectを別途作成し、[コンポーネントの追加]メニューを使用します。

GameObjectを選択した状態で、アセットをInspectorウィンドウにドラッグ アンド ドロップします。これにより、ビジュアル効果コンポーネントが作成され、1 回のクイック アクションでアセットが割り当てられます。

VFX Graph アセットにはすべてのロジックが含まれています。動作を編集するには、次のいずれかの方法を選択します。

-プロジェクトウィンドウでVFX Graph アセットをダブルクリックします。

-プロジェクトウィンドウでVFX Graph アセットを選択し、ヘッダーの[開く]ボタンをクリックします。

-ビジュアル効果コンポーネントアセットテンプレートプロパティの横にある編集ボタンをクリックします。

アセットは、 ウィンドウ > ビジュアル エフェクト > ビジュアル エフェクト グラフにある VFX Graph ウィンドウで開きます。

VFX グラフウィンドウ
VFX グラフウィンドウ
VFX Graphウィンドウ

このウィンドウのレイアウトについてよく理解しておいてください。次の点に注意してください。

ツールバー:グローバル設定やいくつかのパネルの切り替えにアクセスするには

ノードワークスペース:VFX Graphを作成および編集するには

黒板: グラフ全体で再利用可能なプロパティとグローバル変数を管理する

VFXコントロールパネル: 添付されたゲームオブジェクトの再生を変更するには

エディター レイアウトにインスペクター用のスペースを確保してください。グラフの一部を選択すると、パーティション オプションやレンダリング状態などの特定のパラメータが表示されます。

VFX グラフは複雑なネットワークで構成される場合があります。
VFX グラフは複雑なネットワークで構成される場合があります。
グラフロジック

完全な例をダウンロードしてください。

ウィンドウのワークスペース内のノードのネットワークから視覚効果を構築する必要があります。VFX Graph は 、Shader Graphなどの他の ノードベースのツールと同様のインターフェースを使用します。

新しいグラフ要素を作成するには、スペースバーを押すか、右クリックします。空のワークスペースにマウスを移動し、[ノードの作成] を選択して、グラフの コンテキスト演算子、または プロパティを作成します。既存のコンテキストの上にマウスを移動すると、「ブロックの作成」が使用されます。

複雑な VFX Graph を開くのは、最初は大変なことです。幸いなことに、実稼働レベルのグラフには数百のノードが含まれる可能性がありますが、すべてのグラフはサイズに関係なく同じ一連のルールに従います。

VFX Graph の各部分を調べて、それらがどのように連携するかを学びましょう。

システム

VFX Graph には、 システムと呼ばれる 1 つ以上の垂直スタックが含まれます。システムはグラフの独立した部分を定義し、複数の コンテキストを包含します。システムは、それを構成するコンテキストを囲む点線で示されます。

各コンテキストは個別の ブロックで構成されており、パーティクルとメッシュの 属性 (サイズ、色、速度など) を設定できます。複数のシステムを 1 つのグラフ内で連携させて、最終的な視覚効果を作成できます。

グラフ ロジックの例を表示するには、[ノードの作成] > [システム] メニューで事前構築されたテンプレートを探します。

空の粒子システム
空の粒子システム
コンテキスト

上の画像では、空のパーティクル システム グラフに 4 つのコンテキストが存在していることがわかります。

コンテキスト間のフローによって、パーティクルの生成とシミュレートの方法が決まります。各コンテキストは計算の 1 つの段階を定義します。

スポーン: 作成するパーティクルの数と、パーティクルを生成するタイミング (1 回のバースト、ループ、遅延など) を決定します。

初期化:パーティクルの開始属性、容量(最大パーティクル数)および境界(エフェクトがレンダリングされるボリューム)を決定します。

アップデート: 各フレームのパーティクルプロパティを変更します。ここでは、フォースを適用したり、アニメーションを追加したり、衝突を作成したり、符号付き距離フィールド (SDF) などの相互作用を設定したりできます。

出力: パーティクルをレンダリングし、最終的な外観(色、テクスチャ、方向)を決定します。各システムは、最大限の柔軟性を実現するために複数の出力を持つことができます。

システムとコンテキストは、グラフの「垂直ロジック」、つまり 処理ワークフローのバックボーンを形成します。システム内のデータは上から下へ流れ、途中で遭遇する各コンテキストはシミュレーションに従ってデータを変更します。

システムは柔軟性があるため、必要に応じてコンテキストを省略したり、複数の出力をリンクしたりできます。

コンテキスト自体は、個々のブロックに応じて異なる動作をしますが、同様に上から下に向かってデータを計算します。より多くのブロックを追加して操作し、そのデータを処理できます。

コンテキストの右上隅にあるボタンをクリックすると、システムのシミュレーション空間が ローカルワールドの間で切り替わります。

コンテキストとブロックの完全なリストについては、 ノード ライブラリを 参照してください。

さまざまなブロックの例
さまざまなブロックの例
ブロック

ブロックは、Colorの単純な値の保存から、NoisesForcesCollisionsなどの複雑な操作まで、ほぼすべての操作を実行できます。多くの場合、左側にスロットがあり、そこで演算子やプロパティからの入力を受け取ることができます。

水平論理
水平論理
プロパティと演算子

システムがグラフの垂直ロジックの大部分を形成するのと同様に、オペレーターは プロパティ ワークフローの「水平ロジック」を構成します。これらは、カスタム式または値をブロックに渡すのに役立ちます。

オペレーターは、シェーダーグラフ ノードと同様に、左から右に流れます。値を処理したり、さまざまな計算を実行したりするために使用できます。

オペレータ ノードを作成するには、[ノードの作成] メニュー (右クリックまたはスペース バーを押す) を使用します。

プロパティは、 プロパティ ワークフローを使用してグラフ要素に接続する編集可能なフィールドです。プロパティは次のようになります:

整数、浮動小数点数、ブール値を含む任意の

ベクトルや色などの複合コンポーネントから作成されます

キャストして変換する(例:整数を浮動小数点数に変換)

ローカルまたはワールド空間。L またはW をクリックして切り替えます。

プロパティはグラフ内の実際の値に応じて値を変更します。入力ポート (プロパティの左側) を他のグラフ ノードに接続できます。

プロパティ ノードは 、グラフ内のさまざまなポイントで 同じ値を再利用 できる演算子です。これらには、Blackboard に表示される対応するグローバル プロパティがあります。

黒板

ブラックボードと呼ばれるユーティリティ パネルは、プロパティ ノードとしてグラフ全体に複数回表示できるグローバル プロパティを管理します。

Blackboard のプロパティは次のいずれかです。

露出:公開されたプロパティの左側にある緑色の点は、グラフの外部でそのプロパティを表示および編集できることを示します。Exposed Property クラスを使用して、スクリプト経由でインスペクター内の公開プロパティにアクセスします。

絶え間ない:緑のドットのない Blackboard プロパティは定数です。グラフ内では再利用できますが、インスペクターには表示されません。

新しいプロパティはデフォルトで公開され、インスペクターに表示されます。プロパティをグラフの外側で非表示にしたい場合は、「公開」 オプションのチェックを外し、プロパティを整理するために カテゴリ を作成する必要があります。

グループ ノードを操作し、付箋を追加します。
グループ ノードを操作し、付箋を追加します。
グループノードと付箋

グラフ ロジックが大きくなるにつれて、グループ ノードと 付箋を 使用して乱雑さを減らします。グループ ノードを使用すると、ノードのグループにラベルを付けて 1 つとして移動できます。一方、付箋はコードコメントのように動作します。

グループ ノードを作成するには、ノードのグループを選択し、それらを右クリックして、 コンテキスト メニューから [グループ選択] を選択します。Shift キーを押しながらドラッグすることで、既存のグループ ノードにノードをドラッグ アンド ドロップすることもできます。Delete キーまたはコンテキスト メニューからグループ ノードを削除しても、そのグループ ノードに含まれるノードは削除されません。

一方、付箋を使用してグラフのセクションの動作を説明したり、自分自身やチームメイトにコメントを残したりすることもできます。必要な数の付箋を追加し、自由に移動したりサイズを変更したりできます。

サブグラフ

サブグラフは単一のノードとして表示されるため、グラフのロジックを整理するのに役立ちます。これを使用すると、VFX Graph の一部を別のアセットとして保存し、別の VFX Graph にドロップして再編成および再利用することができます。

サブグラフを作成するには、ノードのセットを選択し、マウスの右メニューから 「サブグラフ演算子に変換」 を選択します。アセットをディスクに保存し、ノードを単一の サブグラフ ノードに変換します。システム、ブロック、およびオペレーターをさまざまな種類のサブグラフにパッケージ化できます。

サブグラフの作成は、コードのリファクタリングに似ています。ロジックを再利用可能なメソッドや関数に整理するのと同じように、サブグラフは VFX Graph の要素をよりモジュール化します。

VFX GRAPH による編集レイヤー
VFX GRAPH による編集レイヤー
VFX Graph の編集レベル

VFX Graph は、3 つの異なるレベルの編集をサポートしています。

アセットインスタンス構成:これを使用して、既存の VFX Graph を変更します。デザイナーもプログラマーも、インスペクタで公開されているパラメータを調整して、エフェクトの外観、タイミング、または設定を微調整できます。アーティストは、外部のスクリプトやイベントを使用して、事前に作成されたコンテンツを変更することもできます。このレベルでは、各グラフをブラックボックスとして扱います。

VFXアセットオーサリング:ここであなたの創造力が真に発揮されます。オペレーター ノードのネットワークを構築して独自の VFX Graph の作成を開始し、カスタム動作とパラメーターを設定してカスタム シミュレーションを作成します。既存のサンプルを元にリフを作ったり、ゼロから始めたりしても、特定のエフェクトを自由に使用できます。

VFXスクリプト: これにより、コンポーネント APIを使用して VFX Graph の動作をカスタマイズする、より経験豊富なテクニカル アーティストやグラフィック プログラマーがサポートされます。VFX スクリプトを使用すると、チームは特定のエフェクトを管理するためのより効率的なパイプラインを活用でき、グラフィックス バッファーなどの高度な機能にアクセスできるようになります。

演算子を使用して属性を取得し、ブロックを使用して属性を設定します。
演算子を使用して属性を取得し、ブロックを使用して属性を設定します。
属性

属性は、パーティクルの色、位置、生成するパーティクルの数など、システム内で使用する可能性のあるデータです。

ノードを使用して属性を読み取ったり、属性に書き込んだりします。特に、以下を使用します。

パーティクルまたはパーティクルストリップシステムの属性を読み取るための属性取得演算子

スポーン システムの属性から読み取るための実験的なスポーナー コールバック

属性ブロックを設定して、属性に値を書き込みます。属性の値を直接設定するか、ランダム モードを使用します (たとえば、ランダム グラデーションまたはランダム コンポーネントごとのブロックを使用してカラー属性を設定します)。

属性の完全なリストについては ドキュメント を参照してください。

注:システムは必要なときにのみ属性を保存します。メモリを節約するため、不要なデータは保存しません。VFX Graph が属性からのシミュレーション データを保存していない場合は、属性はデフォルトの定数値を渡します。

イベントはパーティクルの生成を制御します。
イベントはパーティクルの生成を制御します。
イベント

VFX Graph のさまざまな部分は、 イベントを通じて相互に (およびシーンの残りの部分と) 通信します。たとえば、各 スポーン コンテキスト には、パーティクルの生成を制御するイベントを受信する 開始 フロー ポートと 停止 フロー ポートが含まれています。

何かを行う必要がある場合、外部の GameObject は C# APISendEvent メソッドを使用してグラフの一部に通知できます。Visual Effect コンポーネントは、イベントを文字列名またはプロパティ ID として渡します。

イベント コンテキストは、グラフ内のイベント文字列名または IDによってイベントを識別します。上記の例では、シーン内の外部オブジェクトは、Spawn システムを開始する OnPlay イベント や、Spawn システムを停止する OnStop イベント を発生させることができます。

出力イベントはシーンにメッセージを送信できます。
出力イベントはシーンにメッセージを送信できます。
出力イベント

出力イベント出力イベント ハンドラーを組み合わせることができます。出力イベントは、パーティクルの初期生成でシーン内の他の何かを駆動する必要がある場合に便利です。これは、照明やゲームプレイを視覚効果と同期させる場合によく使用されます。

上記の例では、グラフ外の GameObject コンポーネントに OnReceivedEvent を送信します。C# スクリプトはそれに応じて反応し、光や炎を強めたり、火花を発したりします。出力イベントの詳細については、VFX Graph 電子書籍 の「インタラクティビティ」セクションを参照してください。

同時に、GPU イベントを 使用して、他のパーティクルの動作に基づいてパーティクルを生成することもできます。この方法により、あるシステムでパーティクルが消滅すると、別のシステムに通知することができ、消滅時にダスト効果を生成する発射パーティクルなど、効果の便利な連鎖反応を作成できます。

これらの 更新ブロックは、 次の方法で GPU イベント データを送信できます。

ダイのトリガーイベント:パーティクルが消滅すると別のシステムにパーティクルを生成します

トリガーイベントレート: 1秒あたり(または速度に基づいて)パーティクルを生成します

常にイベントをトリガー:フレームごとにパーティクルを生成する

ブロックの出力は GPU イベント コンテキストに接続され、依存システムの 初期化コンテキスト に通知できます。このようにさまざまなシステムを連結すると、詳細度が高く複雑なパーティクル エフェクトを作成できます。

GPU イベント システムの初期化コンテキストは、トリガー イベントの前に親システムで使用可能な属性を継承することもできます。したがって、たとえば、位置を継承すると、新しいパーティクルは、それを生成した元のパーティクルと同じ場所に表示されます。

出力イベント属性は、SPAWN コンテキストからの値を持ちます。
出力イベント属性は、SPAWN コンテキストからの値を持ちます。
イベント属性

イベント属性ペイロードを 使用して、イベントとともに 3D 位置や色などのデータを渡します。これらのペイロードは、グラフを暗黙的に移動する属性を運び、オペレーターまたはブロックでデータを「キャッチ」することができます。

Spawn Events または Timeline Eventsで渡された属性を読み取ることもできます。Set SpawnEvent Attributeブロックは、Spawn コンテキスト内のイベント属性を変更します。

初期化コンテキストでペイロードをキャッチするには、Get Source Attribute Operators または Inherit AttributeBlocksを使用します。

ただし、イベント属性を使用する場合は、次の注意事項に留意することが重要です。

通常のイベント属性は、初期化コンテキストでのみ読み取ることができます。更新または出力では継承できません。後のコンテキストで属性を使用するには、Initialize で継承して設定する必要があります。

出力イベント属性は、スポーン コンテキストで設定された初期値のみを保持します。グラフの後半で発生する変更は捕捉されません。

詳細については、Visual Effect コンポーネント API の イベントの送信を 参照してください。

VFXサンプルコンテンツの探索

VFX Graph は単なる構成要素の合計ではありません。ノードとオペレーターの適用方法と、それらが連携する方法についてしっかりと理解する必要があります。

パッケージ マネージャーの VFX GraphAdditions には、いくつかのシンプルなグラフが示されており、パーティクルの管理方法を学習するための優れた出発点となります。

次のセクションでは、提供されているサンプルを調べるときに遭遇する一般的なブロックと演算子の一部を紹介します。

ノイズとランダム演算子
ノイズとランダム演算子
ノイズとオペレータ

手続き型ノイズは、レンダリングされた画像の「機械のような」外観を軽減するのに役立ちます。VFX Graph には、1 次元、2 次元、3 次元の ノイズランダム性に使用できるオペレーターがいくつか用意されています。

属性ブロック
フリップブックノード
フリップブックノード
フリップブック

アニメーション化されたテクスチャは、効果を本物らしくするのに驚くほどの効果を発揮します。これらは、外部の デジタル コンテンツ作成 (DCC) ツールまたは Unity 内から生成します。演算子を使用して、Flipbook ブロックを管理します。

Unity 内で独自のフリップブックを作成する方法の詳細については、VFX Graph 電子書籍の VFXToolbox セクションにある イメージ シーケンサー を参照してください。

Physics

衝突抗力は、 パーティクルが自然現象をシミュレートするために不可欠です。しかし、現実の限界を押し広げることを恐れないでください。アーティストとして、何がちょうど良いかを決めることができます。

BONFIRE サンプル グラフでは 3 つのサブグラフが使用されます。
BONFIRE サンプル グラフでは 3 つのサブグラフが使用されます。
視覚効果サブグラフ

Visual Effect Subgraph は、別の Visual Effect Graph またはサブグラフで使用できる Visual Effect Graph の一部を含むアセットです。サブグラフは単一のノードとして表示されます。

サブグラフは、次の 3 つの方法でグラフ内で使用できます。

システムサブグラフ:1つのグラフに含まれる1つまたは複数のシステム

ブロックサブグラフ:ブロック演算子のセットをまとめてパッケージ化し、ブロックとして使用します。

演算子サブグラフ:オペレータのセットをまとめてパッケージ化し、オペレータとして使用する

サブグラフを使用すると、グラフからよく使用されるノードのセットを再利用可能なアセットに分解して、ライブラリに追加できます。

VFX 電子書籍

無料の電子書籍を入手する

120 ページの電子書籍『Unity で高度な視覚効果を作成するための決定版ガイド』は、VFX Graph の Unity 2021 LTS バージョンを使用するアーティスト、デザイナー、プログラマーをガイドします。専門家によって書かれたこのリファレンスは、ゲームに豊富なレイヤーを備えたリアルタイムの視覚効果を取り入れるのに役立ちます。

このコンテンツにご満足いただけましたか?