はじめに
ジェットエンジンから尾を引く雲を作りたい
はじめはVFXgraphのStrip機能を使えばすぐできるだろうと考えたがちょっとコツがいることがわかった
ひこうき雲とはどんなもの?
- ジェットエンジンから吹き出している
- 座標Pに追随するエミッタを持つトレイル
- エミッタから放出されるトレイルはマイナスベクトルのVelocityで移動する
- 飛行機の軌跡を描く
- トレイルを構成するパーティクルはワールド座標に追従する
まずはStripのテンプレートを使ってみる
テンプレートをそのまま使うとこんな感じ↑
それをひこうき雲風に調整するとこうなる↓
見た目はそれっぽくなった
ポイントは...
- Set Velocity でZ方向にトレイルを伸ばす
- Set Size over Life でライフタイムに合わせてスケールするアトリビュートを作り、Strip側のパーティクルにInherit Source Size で継承する
早速動かしてみると↓
飛行機のローカル座標に追従してしまった
ワールド座標に追従するようにしなくてはいけない
ここをクリックするとローカル座標とワールド座標を切り替えることができる
切り替えてから動かしてみると...
ワールドにはなったけれどコレジャナイ感
Stripのテンプレートをそのままカスタマイズすると、普通にSpawnされたパーティクルからさらにパーティクルを飛ばしてトレイルするのでうまくいかない。
坂野サーカス的なミサイル演出を作るにはこれでいいかもしれないが、今回やりたいのはゲームオブジェクトの移動に追従させたいのでStripのテンプレートをもとにくんでいくのは向いていないようだ。
Spawnから直接Stripのシステムにつなげる
SpawnしたパーティクルをもとにEventを発生させStripを生成する方法はどうやらひと手間多そうだということがわかった。
であればSpawnしたものを直接Stripのシステムに流し込んでトレイルさせればうまくいくはずだ。
このようにSpawnに直接つなぐシンプルなシステムに組み変えてみた↓
うまくいった!
おわりに
結局とてもシンプルな方法でできた。
移動する物体にトレイルさせることはよくある表現だ。
でも意外とVFXgraphでのやりかたが見つからず苦労した。
(追記) 別のやり方
VFXgraphのStripテンプレートをベースにして同じことができることがわかった。
組み方は以下↓
- "Spawn"ブロックのSingle Burstを初期ポジションにする
- LifeTimeを設定せず寿命を無限にする
- Initialize ParticleとUpdate ParticleのSpaceをWorldに設定する
- Intialize Particle\Capacity\BoundsのSpaceをLocalに設定する
- UpdateParticle\SetPositionのSpaceをLocalに設定する
直接Particle Stripにつなぐ方法と同じ結果になった
しかもこちらのほうがVFXgraphの本来のやり方に基づいており、より拡張性が高い
例えば以下のような組み方をしてみる↓
先程のシステムに少し手を加えた
- Single BurstのCountを20にする
- UpdateのSet Positionにランダムな値を入れる
同時に複数のトレイルが同じポジションを起点に発生している
起点のポジションをパーティクルで指定しているから可能な表現だ
前述の方法ではこのような表現が難しい
このVFXを使って道路を走る自動車のラインのような表現を試した
#unity #urp #vfxgraph pic.twitter.com/IwjedXIUy1
— ツミキルーム\Takashi Kawamura (@tsumiki_room) August 21, 2022
おわりに(再)
前述した組み方も間違えではないが、ストレートではないし拡張性に乏しい
オリジナルでより良く的確な表現を効率的に探るためにも後述した方法をおすすめしたい