UnityのVFXGraphでパーティクル芸やる方法

最近仕事の合間にVFXGraph (Visual Effect Graph)を触ってます。

Uniteの発表動画みた時は「おいおいHoudiniかよ?」と思ったけど、今の所は「ノードベースのGPUパーティクルシステム」という感じ。
ベータなのでノードの数も使い勝手もまだまだだけど、それでもサクサクっとおもしろパーティクルアニメーションを作れるので楽しいですね。

この記事では、VFX Graphの基本的な操作方法や、これまでに作ったエフェクトの作成方法を解説します。
まだベータなのでこれから変わるかも。

使い方

VFX GraphはUnity 2018.3からの新機能です。
インストール方法はのたぐすさんのスライド見てください。

notargs.hateblo.jp

Projectタブで Visual Effect を作成してダブルクリックすると、ノードエディタ的なやつが開きます。

f:id:amagitakayosi:20181115193535p:plain

System はパーティクルシステム全体、 Node はグラフを構成する要素ですね。
システム内のNodeには Block を追加して、パーティクルの挙動をコントロールできます。

(以下では ノード とか ブロック とも表記します)

ノード画面の基本操作

  • ノードorBlockクリック: 選択
  • 何もない所でドラッグ: 矩形選択
  • 何もない所で、中ドラッグ or Alt + ドラッグ: グラフを移動
  • 何もないとこで右クリック: ノードの追加
  • ノードを右クリック: ブロックの追加、ノードの削除

キーボードショートカット

  • A: 全ノードが画面内に収まるようにズームアウト
  • O: 原点に戻る
  • F: 選択中のノードorブロックにズーム
  • [ / ]: 選択中のブロックの前or後のアクティブなブロックを選択
  • ノードを選択して Space: ブロックを追加
  • Ctrl+D: 選択中のノードorブロックを削除

Tips

体系化むずいので箇条書きで……

新たにエフェクトを作るには?

Create Node > System で何か選ぶ。
Simple Swarm Particle System を選ぶとカッコいいツブツブが出ます。

パーティクルに力を与えたい

Updateノードに Force 内のブロックを追加すると色々できます。

僕のお気に入りは Conform to Sphere 。 パーティクルを引き寄せる球体を作ることができます。

より進んだ使い方は後述。

パーティクルにゆらぎを持たせたい

Updateノードに Turbulance ブロックを追加しましょう。
Vector Field Force でも良いけどVector Fieldを自分で作る方法がわからん……。

Inspectorから値を操作したい

Blackboard からできます。

また、 VFX *** Binder みたいなスクリプトを使って、Sphere ColliderをVFXにバインドすることもできる。

時間で変化する値を作りたい

Total TimePeriodic Total Time ノードを使うと良いです。
Sine Wave ノードや Remap ノードを使って、値の動きを調整するといい感じになります。

ケーススタディ

一応プロジェクトはここで公開してます(コミットログは破茶滅茶だが……)

GitHub - fand/vfx-graph-study

作例1: リングっぽいの

Initializeノードに Position (Circle)ブロックを追加して、Updateに Conform to Sphere を追加。
Conform to Sphere のForceなんかをSine Waveで変化させてるだけです。

作例2: 球体からパーティクル出てるやつ

球体を画面中央に向けて Rigidbody.AddForce しつつ、 VFX Sphere Binder で初期位置に設定してるだけです。
bindしたSphereは、Blackboardで追加したパラメーター同様にノードとして取得できるので、Initializeノードの Position (Sphere) に繋いでやると良い。

作例3: 3Dモデルからパーティクル出すやつ

Point Cacheって奴で出来ます。

メニューから Window > Visual Effects > Utilities > Point Cache Bake Tool を開き、メッシュを追加して Save to pCache file... ボタンを押すと、メッシュに対応するポイントキャッシュが作成されます。 あとはPositionみたいなやつにポイントキャッシュファイルを食わせてあげると、パーティクルがメッシュからスポーンするようになる。

f:id:amagitakayosi:20181115230042p:plain f:id:amagitakayosi:20181115232723p:plain f:id:amagitakayosi:20181115232737p:plain

パーティクルを3Dモデルに集まらせるやつは Conform to SDF でやるんだろうけど、今のところ自分でSDFを作る方法はなさそう……? Forumでみんな「SDF作りたいよ〜」って言ってるのは観測した。

https://forum.unity.com/threads/feedback-wanted-visual-effect-graph.572110/

作例4: パーティクルが球から球へと飛び移っていくやつ

Spawnノードに Single Burst ブロックを入れて、InitializeノードでLifetime系のブロックを削除すると、一度生成したパーティクルをずっと飛ばし続けることが出来ます。 あとは Position (Sphere)Conform to Sphere に同じSphereを渡して、 Attraction Force をSine Waveで変化させてるだけ。

Attraction Force をマイナスにすることで一瞬ふわっと広がらせるのがミソです。

作例5: 渦

現在のVFX Graphでは、パーティクルに「ある軸にそって回転する力をかける」ことは出来ないのだけど、これを頑張って擬似的に再現した。 円を小さな弧に分割して、それぞれに Conform to Sphere をかけることで、全体に回転する力がかかっているように見せている。

f:id:amagitakayosi:20181116105651p:plain

同じ要領で、回転する炎?みたいなエフェクトも作れる。


Meshをスポーンさせるやつはまだあんまり触ってないです。 ParticleごとのIDも取得できるみたいなのでコンピュートシェーダー的な表現もできそう?

これからの機能追加に期待ですね。

みんなVFX Graphで遊ぼうぜ〜〜