2022-01-14

【UE5 ナイアガラ】パーティクルを「距離」で変化させる方法

Normalize Distance Rangeを利用して移動距離に応じてパーティクルの色やサイズを変える方法

Article Image

今日の作例

次のようなものを作る

作例

上に行くほど大きくなり、色も変化する例である。

パーティクルと原点との「距離」に応じてパラメータを変化させている。

対象レベル

ダイナミックインプットを使うので初心者向けではない。

ただ、可能な限りシンプルな内容でまとめるので複雑な作例は掲載しない。

ダイナミックインプット

今回メインで使用するのがNormalize Distance Rangeというダイナミックインプット。

返り値で言えば0~1floatを返すだけなので比較的シンプルな部類だ。

Normalize Distance Range

パーティクルの大きさを距離で変化させる

ここから実例を使って作っていく

まず初期の状態。

パーティクルを上に飛ばしているだけ

※パーティクルをSpawn Rateで生成してAdd Velocityで上に飛ばしているだけ。

Scale Sprite Size

パーティクル更新にScale Sprite Sizeを追加する。こちらはパーティクルのサイズを変えるもの。

Scale Sprite Sizeモジュール

Scale Sprite Sizeプロパティ

XとYを入れるだけのシンプルな構造。例えばXを0.1にすると長細くなる。

x=0.1

ここにNormalize Distance Rangeを入れることによって「原点から離れているパーティクルを大きくする」という処理を加えていく。

ハマりポイント

まずNormalize Distance Range使う上で最初のハマりポイント。

こちらの戻り値がFloatであると先程述べた。

したがってこの例だとScale Sprite SizeXYの2値なので直接設定することができない。

Vector 2D From Float

Vector 2D From Floatを使うと1個のFloatを入力するだけでまとめてX,Y両方に割り当てることができる。

Vector 2D From Float

入力値が1個だけに絞られたのでNormalize Distance Rangeを追加することができる。

Normalize Distance Range

Normalize Distance Rangeの設定

入力する項目が一気に増えたのでびっくりするかもしれないが、シンプルなので恐れる必要はない。

Start Positionとは、そのまま原点とするところを入れれば良い。

パーティクルは0,0,0を原点に生成されているのでこのまま数値は変更しない。

Start Position

※あえて動かしても面白い。

次にEnd Positionにパーティクルそれぞれのポジションを入れてやることで原点からどれだけ離れているかを検出する。

End Position

上のように(パーティクル)Positionというのを入れるとパーティクルごとの座標が入りStart Positionとの差が計算される。

(パーティクル)Positionどうやって出すの?

各パーティクルごとのポジションはPositionというパラメータに格納されている。

Positionで検索して出てきたものをEnd Positionに入れれば良い。

Position

こちらはパラメータタブの中に有るので直接ドラッグしても良い。

パラメータタブ

つまるところ変数のようなもので各パーティクルの座標が自動で格納されている。

Distanceの設定が必須

これを設定した段階でパーティクルが消えてしまっていることに気づくと思う。

このダイナミックインプットはさらにDistanceのプロパティを設定しないと正しく動作しない。

Distance

自分が思ったような形状になるように微調整しよう。

※この数値の正確な求め方はいまいちわからないが、上の例で見れば恐らく原点から1000離れたところで1の値になるということだと思う。

調整後

これだけで上のようにサイズを変化させることができた。

当然だが、直線ではなく360度に放射しても外側が大きく内側が小さくなる。

例360度に放射

カラーを変える例

次にカラーを変える例も出しておく。

Colorモジュールを使って最もシンプルに2色で変化させてみる。

Colorモジュール

Lerp Linear Colors

一つのカラーモジュールで2色扱う場合はLerp Linear Colorsを使えば良い。

Lerp Linear Colors

原理はマテリアルノードのLerpと同じ。

2つのカラーを設定してLerpFactorが0に近づけば上側(ここでは赤)、1に近づけば側(青)に変化するダイナミックインプット。

おわかりだと思うがそのLerpFactorNormalize Distance Rangeを設定してやれば完成である。

LerpFactorにNormalize Distance Range

パーティクルサイズと合わせて次のような結果になった。

最終例

いつものよくわからない作例

最後に適当にVelocityを追加してよくわからない作例を作った。

以上

調べてもあまり情報がヒットしないダイナミックインプットだったので記事にさせていただいた。

今回も可能な限りシンプルにまとめたが、応用すればもっといろいろなパラメタを「距離」で変化させられるはずだ。

Normalize Distance Range0~1で返ってくるので、パーティクルを光らせたい(より大きい値にしたい)といった場合は更にMultiplyなどと合わせて使うと良いと思う。

他にも切り捨て(floor)を使ってより明確に色分けをしたりもできる。

ぜひとも色々試してみてほしい。



謎の技術研究部 (謎技研)