はじめに
こんにちは 情熱開発部プログラム2課の樋宮です!
4月に入りましたね。すっかり暖かくなりましたが、寒い日もぽつぽつとあるので風邪には気を付けたいですね。
今回は、Unityの機能の1つであるVisaul Effect Graph(以下:VFXGraph)について紹介しようと思います。
使用したバージョン
※ Unity 2021.3.11f1
※ Visual Effect Graph 12.1.7
VFXGraphとは
まずVFXGraphについて解説します。
VFXGraphはその名の通りエフェクトを作成するためのUnityの機能で、
ノードベースで直感的にエフェクトを作成することができます。
ShaderGraphを想像するとわかりやすいかもしれません。
また、VFXGraphは既存のParticleSystemと違ってGPUで処理されるため
GPUの恩恵を受けることができます。
この点はVFXGraphを使用する大きな利点になると思います 。
プロジェクトの作成
まずはUnityプロジェクトを作成します。
VFXGraphを使用するにはURP・HDRPが導入されたプロジェクトが必要です
今回はHDRPのプロジェクトを作成します。
VFXGraphの作成
では早速VFXGraphの作成をします。
Create → VisualEffect → VisualEffectGraphから作成できます。
HDRPの場合は最初から導入済みとなっていますがURPの場合はPackageManagerからインポートする必要がありますので注意してください。
以下の水色と黄色のアイコンが作成されれば完了です。
これがVFXGraphになります。
VFXGraph の解説
では作成したVFXGraphを見てみましょう。
作成したVFXGraphを開いてみると以下のような画面になると思います。
VFXGraphは大きく4つに分かれています。
それぞれの特徴を説明します。
Spawn
パーティクルを生成する部分
量などを設定できます。
Initialize
パーティクルの初期化を行う部分
位置や速度を設定できます。
Update
毎フレーム更新の部分 動作の設定をします。
初期でパラメータが存在しないので自分で追加する必要があります。
Output
レンダリングを行う部分
色や画像を設定できます。
パーティクルのどこを編集したくてそれがどのタイミングなのか、これらを覚えておくと作成がスムーズになると思います。
パーティクルエフェクトの作成
では、実際にパーティクルエフェクトを作っていこうと思います。
エフェクトの動作を確認しながら作成したいのでまずはVFXGraphをシーン上に設置します。
設置すると以下のようなエフェクトが出ると思います。
このままではよくわからないエフェクトなのでテクスチャを設定してみましょう。
Packages/Visual Effect Graph/Textures の中にあるSparkleというテクスチャを設定します。
描画に関わる部分なのでOutput内のMain Textureから設定します。
Textureを設定後のエフェクトがこちらです。
見た目は変わりましたが大きさがイマイチなので調整します。
Output上で右クリック→CreateBlock→Set Scaleと入力してブロックを追加します。
ここの値を変更することで大きさが変わりますので自由に変更してみてください。
小さく調整するといいと思います。
私はXの値を0.3にしました。
色を設定してみましょう。
Output→SetColorOverLife→Colorから変更できます。自由に設定してみましょう。
この値を変更すると生成されてから色がグラデーションするようになります。
グラデーションさせたくない場合は生成時と消滅時の色を同じにするといいと思います。
SampleModeやColorModeを変更することで色を指定範囲内でランダムにすることもできます。
また、色指定する際のItensityの値を変更すると自己発光をしてるように見せる表現もできたりします。
ここまでで最初と比べるととてもきれいなパーティクルになっていると思います。
最後に 動作も変更してみましょう。
UpdateにTurbulenceブロックを追加します。
直訳で乱気流という意味でその名前の通り乱気流のような動きを付けることができます。
Intensityで速度や、NoiseTypeで生成する際に使うノイズのタイプを設定してみましょう。
そのほかの値についてはこちらにUnityの公式リファレンスがありますので確認して自由に変更してみてください。
最後にInitialize内のSet Velocity Rondomで生成時の初期速度を全方向にして、SetPositon(Sphere)を追加することで円形状ランダムにパーティクルを生成できます。
また、Output内のOrientをAlong Velocityに変更することでテクスチャの向きを移動方向にできます。
あとはお好みで生成量なども調整してみてください。
ここまでで以下のようなパーティクルになるはずです。
VFXGraphで作成可能なエフェクト紹介
公式で用意されているプリセットがありますのでいくつか紹介します。
適当なVFXGraphを作成して最初にあるノードをすべて削除します。
その後、右クリック→Create NodeからSystemを選びます。
Systemにあるものはほとんどがプリセットになっています。
実際にプリセット内のノードを確認したりして各ノードの動きを参考にすることもできると思います。
Mesh Samplingについて
VFXGraphの新機能としてMesh Samplingというものがありますので紹介します。
この機能はまだ実験的な機能のため設定しないと使用することができません。
Editor→Preferences→Visual Effects内にある Experimental Operators/Blocksのチェックをオンにすることで使用できます。
MeshSamplingとはメッシュの中からパーティクルの位置をサンプリングできる機能のことでメッシュの面や頂点からパーティクルを生成できるようになります。
このMesh Samplingを使うことでStatic MeshやSkinned Meshなどからパーティクルの生成位置を取得できるようになります。
実際にSkinnedMeshを使ってパーティクルでメッシュの シルエット風 エフェクトを作成してみましょう。
まず、SkinnedMeshRendererコンポーネントとTransformのコンポーネントが必要になるのでBlackboardにそれぞれの変数を追加します。
この際にExposedのチェックをONにしないとHierarchy上に項目が出てこないので注意してください。
その後シーン上のVFXGraphを選択してHierarchyから設定します。
これをSampleSkinnedMeshノードにつなげることでMeshSamplingが可能になります。
Sample Skinned Meshの各パラメータの説明をします。
・SkinnedMesh – サンプリングするSkinnedMeshを格納します。
・Triangle – パーティクルごとにどのトライアングル(ポリゴン)から生成するかを設定します。ここではメッシュの持っているトライアングル数以上のランダムな値を格納することでメッシュ全体からパーティクルを生成しています。
・Square – これは選択されたトライアングルの中のどこから生成するかの設定値です。ここでは0~1で指定する必要があるため0~1のランダムな値を格納しています。
また、今回はMeshの面から生成したいのでModeをWrapにして、Placement ModeをSurfaceにする必要があります。
こうしてできたPositionをそれぞれInitializeとUpdateに格納しています。
これでMesh内のランダムな位置に生成された後そこにとどまるパーティクルになるのでシルエットが見えるはずです。
実際に見てみましょう。
例えばこれに元のモデルも同時に表示するとオーラをまとっているような演出が可能になります。
また、これはSkinnedMeshからサンプリングを行っているので
Updateに格納する前にTransformノードを使用しているので現在のオブジェクトの位置を参照することでアニメーションなどに追従するパーティクルにすることもできます。
ParticleSystemで同じものを作成するにはC#のスクリプトを書く必要があったり、親子関係をHierarchy上で設定したりなどの手間もあったりしてParticleSystemで作成する場合はどうしても複雑になってしまいます。
ですがVFXGraphではノードを作成して値を格納するだけですべて終わるのですごく楽でした。
ParticleSystemとの負荷の比較
Particle SystemとVFXGraphの負荷をUnityのProfilerで比較してみました
条件は以下の通りです。
・パーティクル最大数は10000で毎秒2000個生成
・パーティクルはUnityにデフォルトであるSphereMesh
・パーティクルは5秒間生存する
これで比較してみたところ以下のようになりました。
CPU Usageのみの比較になりますが差は一目瞭然だといえると思います。
VFXGraphの方が圧倒的に処理が軽いといえます。
以下がPlayLoopの具体的な処理速度になります。
Particle System : 100 ~ 120 ms
VFXGraph : 2 ~ 3 ms
まとめ
今回VFXGraphを触ってみましたが圧倒的にParticleSystemよりも使いやすいと感じました。
Meshのシルエットの形にエフェクトを出した際もC#でスクリプトを書く必要がなくすぐに作成できましたし、より複雑なパーティクルを作成する際もスムーズにできると思います。
また今回紹介まではできませんでしたが、VFXGraphはShaderGraphやHoudiniを活用してより面白いエフェクトを作成することもできます。
皆さんもぜひVFXGraphを使ってパーティクルなどのエフェクト作成に役立ててください!
公式リファレンスやサンプルプロジェクトなどのリンクを記載しておきますのでぜひ活用してみてください。
公式リファレンス
公式サンプルプロジェクト
UnityLearningMatrials
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。