Unity VisualEffectGraph  -シンプルスォームパーティクル解説-


この記事は[Unity Advent Calender 2019](https://qiita.com/advent-calendar/2019/unity) 23日目の記事です。

#はじめに


　VisualEffectGraphのシンプルスォームパーティクルの項目について記事にしました。
　以前に[Unity VisualEffectGraph -インストール方法-](https://qiita.com/KoniroIris/items/f003c2a4ca62fad11a2f)と、[Unity VisualEffectGraph -シンプルパーティクル解説-](https://qiita.com/KoniroIris/items/e396fe2a6c65c2e4e2b4)を記事にしているので、初めて触る方はこちらを参考にしていただければと思います。

#シンプルスォームパーティクル
　まずVEGウィンドウ上のコンテキスト類を全て消しましょう。マウス左ドラッグで全選択して右クリック[Delete]ですべて消えます。その後に再度右クリックして[CreateNode]→[System]→[Simple Swarm Particle System]を選択し生成します。(図1)
　生成されたコンテキストは図2の様なボックスを持っています。また、生成されたVFXは図3のような火の玉のようなVFXです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/99037d48-6074-b8e2-810e-e9baa3bb74ca.png)
　図1　Simple Swarm Particle Systemのボタン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/db6ab792-1ca2-ad6e-406a-94b5b058c6b6.png)
　図2　Simple Swarm Particle Systemのコンテキスト

![image.png](https://media.giphy.com/media/cPMY9XRRGUFnHNm43y/giphy.gif)
　図3　Simple Swarm Particle SystemのVFX

#ブロック部
　それではブロック部の解説をしていきましょう。

## Spawn内のブロック
　この部分は「ConstantSpawnRate」のみが有ります。
・ConstantSpawnRate
　このブロックには「Rate」というプロパティがあり、毎秒いくつのパーティクルを生成するかを設定できます。
　時間等で消失していないパーティクルの数とInitializeのCapacityが同じ数になった時はパーティクルが消えるまで生成が止まります。

## Initialize内のブロック
　ここでは、「Set Lifetime Random」ブロックがあり、生存時間をコントロールしています。
・Position(Sphere)
　生成場所を設定した球体の表面にパーティクルを配置するブロックです。
・Set Lifetime Random
　パーティクルの生存時間（秒）を設定するブロックです。最大値と最小値の２つを決めるとその間のランダムな時間で消失します。

## Update内のブロック
　「Vector Field Force」ブロックのみがあります。
　・Vector Field Force
　　このブロックはベクターフィールドを用いてパーティクルに速度を与えます。
　ベクターフィールドとは空間上に力場を作るイメージで、特定の場所に行くと設定された方向に力が掛る空間の設定です。

## Output内のブロック
　ブロックの数が多いですが、複雑な物ではないので１つ１つ見ていきましょう。
・Orient:Along Velocity
　このブロックはパーティクルの向く方向を設定することができます。「AlonVelocity」設定ではパーティクルが進行方向を向きます。
・Set Size
　パーティクルのXYZ全ての大きさを変更するブロックです。1を中心に拡大縮小します。
・Set ScaleX
　パーティクルのX方向の大きさを変更するブロックです。1を中心に拡大縮小します。
・Seet ScaleY over Life
　パーティクルのY方向の大きさをLifeTimeを参考に変更するブロックです。スケールの大きさはCurveによって変更されます。
・Color/Alpha over Life
　LifeTimeによってα値（透明度）と色を変えるブロックです。横軸がLifeTimeで左端が生成、右端が消失の時間を示します。ウィンドウの操作はUnityマニュアルを参考にしてください。


#実際の動き
　それでは上記を踏まえてどう動くのか、最初からSpawn,Initialize,Update,QuadOutputの順に追っていきましょう。

## Spawn
　まずSpawnコンテキストの[Rate]で毎秒25000個のパーティクルが生成されることが決まります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/8f25510a-cead-b72c-8263-93a5403f13fa.png)
図4 Spawnコンテキスト

## Initialize
　Initializeコンテキストでパーティクルの個数上限65536個と定められます。
　「Position(Sphere)」ブロックでは[Position Mode]より、生成場所が球体表面(Surface)に設定されています。また、[Spawn Mode]より、ランダムに生成されます。生成場所の球体の詳細はすぐ下の項目から設定できます。
　「SetLifetimeRandom」ブロックで[Lifetime]を1秒~3秒の間と定められ、この時間内で消失することを設定されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/9178c539-ad7c-a524-bdc0-cb851cf9e78f.png)

図5 Initializeコンテキスト

## Update
　Updateコンテキストではブロックが無い場合もありますが、今回は「Vector Field Force」ブロックが追加されています。
　「Vector Field Force」ブロックでは、ベクターフィールドを読み込んで適応させています。このおかげでパーティクルがベクターフィールドの影響を受けて動いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/7a72c3d7-e347-3aef-a086-082cabd5c710.png)
図6 Updateコンテキスト

## QuadOutput
　QuadOutputコンテキストです。MainTextureにDefaultParticleが設定されており、このTextureが生成されます。
　「Orient」ブロックでは、「Along Velocity」モードとなっており、このモードはパーティクルが進行方向を向いて帯のようになるモードです。
　「SetSize」ブロックはその名の通りサイズを設定しています。
　「SetScaleX」ブロックではスケールを設定しています。[Channels]の項目でx,y,z,xy,xz,yz,xyzの7つから選択します。ブロック名の最後は選択した項目で名前が変わります。その下の[Scale]では前の項目での軸のスケールを設定できます。
　次の「SetScaleY overLife」では、Y軸のOverLifeに応じたスケールを設定しています。軸の設定は[SetScale]と同じです。
　最後の「Color/AlphaoverLife」ブロックではRGB255の白と生成時、消失時付近のα値を0に近くする設定がされています。これによって生成時は透明な状態から始まり、少し経つとα値が255になり姿がハッキリとし、消失時近くになるとまたα値が減って消えるように消失していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393006/f2bacc90-89fb-7a5c-b1b9-37bce924f0c7.png)
図7 Outputコンテキスト

## 出力結果

![image.png](https://media.giphy.com/media/cPMY9XRRGUFnHNm43y/giphy.gif)
図８　シンプルスォームパーティクル出力

#色々値を触ってみよう
　一通りシンプルスォームパーティクルに触れたので、ある程度どこを触ればどうなるか分かったと思います。
　後は自由にどんどん値を変えたりして触ってみて下さい！
　最初に戻したくなったら画面に置いたノードを全て消し、右クリックして「Create Node」→「System」→「Simple Swarm Particle System」と押せば最初のシンプルパーティクルのノードが配置されます。


#まとめ
　今回はシンプルスォームパーティクルのSpawn,Initialize,Update,Outputといったコンテキストに始まり、コンテキスト内の機能としてのブロックを解説しました。
　記事を読んでコンテキストとブロックについて多少なりとも分かって頂けたら嬉しいです。