渋谷ほととぎす通信

エンジニア社長によるUnityとAIのブログ & エンジニアの生存戦略

【Unity】Visual Effect Graphの始め方

【Unity】Visual Effect Graphの始め方

こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Visual Effect Graphを始めてみたい
  • Visual Effect Graphの使い方を知りたい
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    ゲーム開発にゲームエフェクトは必須です。ゲームエフェクトのないゲームなど超薄味の料理と同じです(つまり不味い)。

    Unityでエフェクトを作成する場合、いくつか方法があります。

    • Particle System(Unity製)
    • Visual Effect Graph(Unity製)
    • Bishamon(外部ソフト)
    • SparkGear(外部ソフト)

    など。

    この中でUnityが推しているのはVisual Effect Graphです。

    初期のUnityから存在する通称Shurikenと呼ばれる「Particle System」がずっとUnityエフェクトを牽引してきました。しかしParticle SystemはCPUパーティクルのため負荷が高くなりがちです。

    【Unity】Visual Effect Graphの始め方_0

    そこで GPUを使ったパーティクルシステム「Visual Effect Graph」が登場 しました。

    Visual Effect GraphはParticle Systemと比べると大量のパーティクルを表示させることが可能です。実際に触ってみると分かりますが、パフォーマンスに歴然の違いが生まれています。

    かなり前のポストですが、貧弱なPixel3aでも大量のパーティクルが表示されていることが分かります。

    そこで本記事は

    • 今までParticle Systemでエフェクトを作ってきたけどVisual Effect Graphも触ってみたい
    • Visual Effect Graphに興味があるけど触れてなかった

    という方に向けたVisual Effect Graph入門コンテンツです。

    この記事を読むだけでVisual Effect Graphを始められます。ぜひ最後まで読んで ゲーム開発の表現の幅を広げてみてください。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    Visual Effect Graphのインストール方法

    Visual Effect GraphはUnityプロジェクトを作成しただけでは使用できません。Package Managerから別途インストールする必要があります。

    【Unity】Visual Effect Graphの始め方_1

    メニューWindow -> Package Manager から Package Managerウィンドウを開いてください。

    【Unity】Visual Effect Graphの始め方_2

    ①Unity Registry を選択し、 ②Visual Effect Graph を選択。 ③Installボタン をクリックしましょう。

    以上でVisual Effect Graphのインストールは完了です。次の章から実際にVisual Effect Graphを使ったエフェクトづくりを始めていきます。

    Visual Effect Graphが動作する仕組み

    具体的にVisual Effect Graphを動かす前に、Visual Effect Graphが動く条件を確認します。Visual Effect Graphには2つの要素が必要です。

    1. Visual Effectコンポーネント
    2. Visual Effect Asset

    この2つのオブジェクトがセットとなってVisual Effect Graphは動作します。Visual Effectコンポーネント内にVisual Effect Assetをセットするという1対1の関係性です。

    そして Visual Effect Asset を編集してエフェクトの見た目を制御していきます。

    この関係性を頭に入れながら、実際にVisual Effect Graphを動かしていきましょう。

    Visual Effect Graphはじめの一歩

    まずはVisual Effect Graphはじめの1歩ということでシンプルなエフェクトから作っていきましょう。

    【Unity】Visual Effect Graphの始め方_3
    メニューGameObject -> Visual Effects -> Visual Effect をクリックします。

    すると Visual Effect コンポーネントがセットされたGameObjectがHierarchyウィンドウに作成されます。

    このままではまだVisual Effect Graphは動きません。

    【Unity】Visual Effect Graphの始め方_4
    Visual Effectコンポーネント内の 「New」ボタン をクリックしてください。

    【Unity】Visual Effect Graphの始め方_5
    すると7種類のテンプレートを選択できます。

    【Unity】Visual Effect Graphの始め方_6
    今回は7種類のテンプレートの中から Simple Loop を選択しましょう。

    【Unity】Visual Effect Graphの始め方_7
    ファイル保存が求められるので「MyFirstEffect」というファイル名で保存します。

    ちなみに、このMyFirstEffectがVisual Effectコンポーネントの対となる 「Visual Effect Asset」 です。

    【Unity】Visual Effect Graphの始め方_8
    すると上図のようなグラフが表示されますが、ここでは一旦無視してGameビューを開いてみてください。

    【Unity】Visual Effect Graphの始め方_9
    するとVisual Effect Graphが動作し、噴水のようなエフェクトが再生されます。とても簡単でしたね。

    しかし、このエフェクトがどういう仕組で動いているのでしょうか。それはVisual Effect Assetに格納されたグラフです。

    次の章では、自分でエフェクトをカスタマイズできるようになるためにグラフの内容を紐解いていきます。ここからが本記事の最も重要な内容です。

    エフェクトを構築するグラフ

    Visual Effect Graphはその名の通り、グラフを使ってエフェクトを構築します。今回作成した噴水エフェクトがどのようなグラフを使って作られているのか確認していきましょう。

    グラフの内容を理解することで、あなた自身がエフェクトを新規で作成、編集ができるようになります。

    まずはProjectウィンドウ内に作成したVisual Effect Asset(MyFirstEffect)をダブルクリックしてVisual Effect Graphウィンドウを開いてください。

    するとグラフが表示されているかと思います。最初にグラフの各パーツの呼び名を紹介します。

    【Unity】Visual Effect Graphの始め方_10

    名称内容
    コンテキストノードVisual Effect Graphを構成する主要ノード
    コンテキストコンテキストノードの設定ブロック
    ブロックコンテキストノードを構成する要素
    ノードコンテキストノード以外のノード
    エッジノード同士をつなぐ線
    入力ポートノードの入力
    出力ポートノードの出力

    Visual Effect Graphの基本構造は4つのコンテキストノードで構成されています。

    【Unity】Visual Effect Graphの始め方_11

    • ①Spawnコンテキストノード
    • ②Initialize Particleコンテキストノード
    • ③Update Particleコンテキストノード
    • ④Output Particleコンテキストノード

    このコンテキストノードの中にブロックを追加、ブロックに対してノードをつなげてエフェクトを作成していきます。

    では、今回作成したグラフ内の要素がそれぞれどのような役割を果たし、エフェクトに影響を与えているのか確認していきましょう。

    ①Spawnコンテキストノード

    最初にSpawn(スポーン)コンテキストノードです。
    【Unity】Visual Effect Graphの始め方_12
    Spawnコンテキストノードはその名の通りパーティクルを Spawn(生む)するノード です。しかしパーティクルを作成しているわけではなく、あくまでイベントを発行しているだけなので注意です。

    今回は Constant Spawn Rate ブロックを使用しています。Rateに入力されている 45.9個/秒 Spawnイベントが発行されているということです。

    ②Initialize Particleコンテキストノード

    次にInitialize Particleコンテキストノードです。

    【Unity】Visual Effect Graphの始め方_13
    Initialize Particleコンテキストノードは設定ブロックと次の3つのブロックで構成されています。

    • Set LifeTimeブロック
    • Set Position Shapeブロック
    • Set Velocity from Direction & Speedブロック

    Initialize ParticleのContext

    Initialize Particleコンテキストノードには以下の設定項目があります。

    【Unity】Visual Effect Graphの始め方_14

    設定項目内容備考
    Capacity同時パーティクル最大数最大68個表示される
    Bounds Mode境界設定RecordedはUnityが自動で設定
    Bouds境界範囲CenterとSizeでパーティクルの境界を指定
    Bounds Padding境界ボックスに追加の余白今回は未使用

    Boudsでパーティクルの境界を指定できます。

    Set LifeTimeブロック

    次に Set LifeTime ブロックです。

    【Unity】Visual Effect Graphの始め方_15
    Set LifeTimeブロックはパーティクルの寿命設定です。 Random Uniform が設定されているため、AとBの間のランダムな値(秒)が各パーティクルの生存時間になります。

    今回の場合0.8〜1.2秒のランダム値が生存時間です。

    Set Position Shapeブロック

    次は Set Position Shape ブロックです。このブロックは図形を元にパーティクルの初期位置を決めます。

    【Unity】Visual Effect Graphの始め方_16

    設定項目内容備考
    Shape形状の種類今回はSphere(球)を指定
    Position Mode形状のどこにパーティクルを配置するかSurface(表面)を選択
    Spawn ModeSpawn方法Random(ランダム)を選択
    Arc Sphere球の形の設定-

    今回は 球体の表面からパーティクルをランダムに配置 しています。

    Set Velocity from Direction & Speedブロック

    Initialize Particleコンテキストノード最後のブロックは Set Velocity from Direction & Speed です。このブロックはパーティクルの速度を指定します。

    【Unity】Visual Effect Graphの始め方_17

    設定項目内容備考
    Speed Mode速度の設定Randomを選択しているため、MinとMaxの間でランダムんスピードになります
    Direction方向今回は上方向
    Min Speed最小スピードランダムを指定した場合に設定可能
    Max Speed最大スピードランダムを指定した場合に設定可能
    Direction Blend方向とのブレンド-

    Set Velocity from Direction & Speedブロックでパーティクルの向きは上方向へ、スピードが4.8〜7.5のランダム値で飛び出す設定になりました。

    以上のContextと3つのブロックの設定でパーティクルの初期化を行っています。

    ③Update Particleコンテキストノード

    【Unity】Visual Effect Graphの始め方_18

    次はUpate Particleコンテキストノードです。このノードではパーティクルの毎フレーム更新処理を指示します。

    Upate Particleコンテキストノードは以下2つのブロックが格納されています。

    • Gravityブロック
    • Linear Dragブロック

    Gravityブロック

    Gravityブロックはパーティクルに対して重力を適用します。

    【Unity】Visual Effect Graphの始め方_19

    Forceに重力のかかる方向を設定します。今回はデフォルト値としてY方向に -9.81 が入力されています。

    ちなみに 「Y軸方向 : -9.81」 は地球の重力をシミュレートする値です。以上で上方向に飛び出したパーティクルは重力で下に落ちる設定になりました。

    Linear Dragブロック

    Linear Dragはパーティクルの動きに対する抵抗設定です。

    【Unity】Visual Effect Graphの始め方_20

    設定項目内容備考
    Use Particle Size抵抗がパーティクルサイズに影響サイズが大きいほど抵抗が強くなる設定
    Drag Coefficient抵抗の強さ値が大きくなるほど抵抗が強くなる

    Linear Dragブロックの設定でパーティクルの勢いを少しだけ抑えています。試しに Drag Coefficient の数値を変えてみてください。顕著に表現が変化します。

    ④Output Particleコンテキストノード

    最後にOutput Particleコンテキストノードです。最終的なパーティクル出力の役割を担います。

    【Unity】Visual Effect Graphの始め方_21

    今回はコンテキストブロックに加え、以下の3つのブロックが設定されています。

    • Orientブロック
    • Size Size Over Lifeブロック
    • Set Color Over Lifeブロック

    Output ParticleのContextブロック

    【Unity】Visual Effect Graphの始め方_22

    Output ParticleのContextブロックでは描画設定を行っています。

    設定項目内容
    Color Mapping色をつける方法を指定
    Uv ModeUVの使用方法を指定
    Use Soft Particleソフトパーティクルを使用を指定
    Blend Modeアルファブレンドの指定
    Use Alpha Clippingアルファクリッピングの有無
    Main Texture使用するテクスチャ

    Orientブロック

    次にOrientブロックです。Orientブロックはパーティクルを特定の方向に向けます。

    【Unity】Visual Effect Graphの始め方_23

    今回は Face Camera Plane を設定しているためビルボード(カメラの方を向く)表現になります。

    Set Size Over Lifeブロック

    次に Set Size Over Life ブロックです。Set Size Over Lifeブロックはパーティクルが生まれて寿命までの間でパーティクル自体の大きさを設定します。

    【Unity】Visual Effect Graphの始め方_24

    今回はリニアグラフのため時間経過とともに一定の大きさにアニメーションします。

    Set Color Over Lifeブロック

    歳顔は Set Color Over Life ブロックです。Set Color Over Lifeブロックはパーティクルが生まれて寿命までの間の色を指定します。

    【Unity】Visual Effect Graphの始め方_25

    今回は黄色と水色が指定されてます。最後は透明になって消えるようにカラー設定されています。

    【Unity】Visual Effect Graphの始め方_26
    ここまで紹介したノードとブロックの設定を行うことで、↑このVisual Effect Graphは動作しているのです。

    まずは今回登場した「コンテキストノード」と「ブロック」内のパラメータを弄って遊んでみると、何がどこに影響を与えているのか理解できるのでおすすめです。

    Visual Effect Graphをプログラム制御するためのイベント

    初めてのVisual Effect Graphが表示できました。とはいえ現状はパーティクルの垂れ流しです。プログラム側から制御したくなりますよね。

    そんなときに使えるのが 「イベント」 です。

    VisualEffectコンポーネントに対してイベントを発行し、再生と停止といった挙動を操作可能です。

    _visualEffect.SendEvent("イベント名");  
    

    ソースコードでは以上のように SendEvent メソッドを実行します。

    Visual Effect Graphにデフォルトで定義されているイベント

    Visual Effect Graphにデフォルトで用意されているイベントを先に紹介します。

    • OnPlay
    • OnStop

    以上の2つです。

    この2つはVisualEffectAssetクラス内で定義されていてVisualEffectAsset.PlayEventName という形で呼び出せます。

    以下のように使用できます。

    // OnPlayイベント  
    _visualEffect.SendEvent(VisualEffectAsset.PlayEventName);  
    // OnStopイベント  
    _visualEffect.SendEvent(VisualEffectAsset.StopEventName);  
    

    ぜひ覚えておきましょう。

    Visual Effect Graphでカスタムイベントの実装

    Visual Effect Graphではデフォルトで用意している「OnPlay」「OnStop」以外に カスタムイベント を定義できます。

    例えば Shibuya24 というイベントを実行したい場合、以下のようにプログラムを書けばOKです。

    _visualEffect.SendEvent("Shibuya24");  
    

    しかし自作のカスタムイベントをソースコードに記述することなくテストする方法もあります。

    Visual Effect Event Testerを使う

    Visual Effect Event Testerを使うとソースコードの変更なくカスタムイベントをテスト可能です。

    やり方は簡単です。まずはVisual EffectをHierarchyウィンドウから選択した状態にしておきます。

    【Unity】Visual Effect Graphの始め方_27
    するとVisual Effectという小窓がSceneビュー内に表示されるので、Show Event Tester にチェックを入れます。

    すると「Visual Effect Event Tester」が表示されます。

    「Custom Event」テキストフィールドにテストしたいイベント名を記述して Customボタン をクリックします。

    すると指定したイベントを好きなタイミングでテストできるのです。

    イベントを実装する際に便利なのでぜひ活用していきましょう。

    より高パフォーマンスでイベントを呼ぶ方法

    今まで文字列でイベントを指定してきましたが 「ID呼び出し」 することで文字列指定よりパフォーマンスよくイベントを呼び出せます。

    イベント名からIDを取得する方法は簡単です。

    var id = Shader.PropertyToID("イベント名");  
    

    Shader.PropertyToID 関数でイベントIDを取得できます。

    IDを使ってイベント送信する方法は以前と同じ SendEvent を使います。

    var id = Shader.PropertyToID("イベント名");  
    _visualEffect.SendEvent(id);  
    

    イベントを文字列で呼び出す場合、最終的にIDを取得する処理が走ってしまいロスが生まれます。以下のコードのように事前にIDをキャッシュした方がパフォーマンス向上につながるということを覚えておきましょう。

    public static readonly int CustomEventID = Shader.PropertyToID("イベント名");  
    
    void Start()  
    {
        _visualEffect.SendEvent(CustomEventID);  
    }
    

    【余談】 Visual Effect Graphを初期状態でストップさせる方法

    Visual Effect Graphは配置しただけでパーティクルが垂れ流れてきます。Particle Systemのような Play On Awake といった機能はVisual Effect Graphにはありません。

    そこでイベントを活用します。

    パーティクルの停止は OnStop イベントでした。このイベントをVisual Effect Graph開始直後に実行します。

    ソースコードから実行してもよいですが、Visual Effectコンポーネント内に初期化時に使用するイベントを指定できるのです。

    【Unity】Visual Effect Graphの始め方_28

    Initialize Event Name に 「OnStop」と入力しましょう。すると初期状態のVisual Effect Graphからパーティクルが流れてこなくなります。

    ぜひ活用してみてください。

    Visual Effect Graphのおすすめ学習方法

    最後にVisual Effect Graphの学習方法について紹介します。正直まだまだまだまだネット上に情報がなく困った状態です。

    しかしUnity公式の Learning Templates で学ぶことができそうです。

    【Unity】Visual Effect Graphの始め方_29
    メニューAssets -> Create -> Visual Effects -> Visual Effect Graph からCreate New VFX Assetウィンドウを開きます。

    【Unity】Visual Effect Graphの始め方_30
    ①Install Learning Templates をクリック。するとUnity公式が用意した学習用データが追加されるのです。

    【Unity】Visual Effect Graphの始め方_31

    【Unity】Visual Effect Graphの始め方_32

    いろんなテンプレートが格納されているため、学習が捗りそうです。

    Visual Effect Graphの始め方まとめ

    Visual Effect Graphは、従来のParticle Systemよりも高性能で大量のパーティクルを描画できるGPUベースのエフェクトシステムです。

    本記事では、Visual Effect Graphのインストール方法、基本的な仕組み、エフェクトの作成手順を解説しました。特に、Visual EffectコンポーネントとVisual Effect Assetの関係を理解し、グラフを活用することで自由度の高いエフェクトを作成できます。

    またイベントを使った制御方法も紹介しました。Visual Effect Graphを活用することで、よりリッチで美しいエフェクトを作れるのでぜひ試してみてください。

    オススメ記事
    検証環境
    • Unity6000.0.32f1
    • Visual Effect Graph 17.0.3
    参考サイト