2022-02-12

【ナイアガラ超基礎 #12】パーティクルを回転させる【Unreal Engine】

VelocityやForceを使わずにパーティクルを回転させる最もシンプルな方法を解説。

Article Image

この記事で学習できること

以前にVelocity(速度)のモジュールを使ってパーティクルを動かす記事を書いた。

【ナイアガラ超基礎 #6】Velocityとは【UE5】 | 謎の技術研究部

またForceというモジュールでも力を与えられるが、こちらはまだ解説していない。

今回はこの2種類を使わないパターンの回転を紹介する。

前提知識

ダイナミックインプットを使うのでわからない方は次

【ナイアガラ超基礎 #9】ダイナミックインプット(動的入力)とは? | 謎の技術研究部

かざぐるま回転

今回作るのは次の作例

上のように各個体がそれぞれの軸で回転するようなモジュールの組み方を解説する。

※パーティクルが打ち上げられて落ちる動作はFountainテンプレートとほぼ同じなので解説しない

パラメータの作り方

回転のついでに自前で変数を用意して、その値を再利用してやる方法も紹介する。

ナイアガラではこの変数を「パラメータ」と呼ぶ。

自前パラメータ

前提条件

この記事では次の動画のように星が飛ばせるところまでは誰でも作れるという前提で話をすすめる。

基本はFountainのテンプレートにてSpriteのマテリアルを星にかえただけだ。

まだ回転は組み込まれていないので星が飛んでいくだけとなっている。

star

自分で再現する場合、星のテクスチャは上を自由に使ってもらえればと思う。

補足:以前の記事も参考に

実は次の記事の最下部で紹介したものとほぼ同じものを作っている。

【ナイアガラ超基礎 #11】パーティクルにマテリアルを付ける【Unreal Engine】 | 謎の技術研究部

こちらの記事ではParticleRotationという変数を直接書き換えて回転させているが、今回はモジュールを使う。

まだナイアガラでマテリアルの使い方などがわからない場合は上の記事から読んでもらえればと思う。

回転用のモジュール

以前紹介している記事ではSprite Rotationという変数に直接値を加算して回転させていたが、実はモジュールに回転をコントロールするものがあるのでそちらを使う。

Sprite Rotation Rate

本記事のメインモジュール。

SpriteRotation

パーティクル更新にSprite Rotation Rateというモジュールを追加しよう。

設定は次のRotation Rateを変更するだけで回転が加わるというシンプルさだ。

Rotation設定

正直これで本記事は解説完了と言っても良い。非常に簡単かと思う。

適当に300を設定した例。

はい、完成!

なのだが、上の動画でなにか違和感があるのは分かるだろうか?

右回りにしか回転していない

このRotation Rateは定数を入れてしまうと一方向にしか回転しない。

また当然ではあるが、回転速度も一定だ。

非常にシンプルなモジュールだが、回転にバリエーションをもたせたい場合は少し工夫が必要そうだ。

左右の回転をランダムにしたい

回転はマイナス値を入れれば左に回る。

というわけでここにダイナミックインプットであるRandom Range Floatを使ってランダム値をマイナスからプラスへ入れればよい。

ランダム化

余談:回転がぷるぷるするのでは?

このやり方だと毎フレームごとに乱数が設定されるので星がプルプルするのでは?と気付いた人は鋭い。

実は、このRandom Range Floatが良くできていてパーティクル更新の中にあってもEvaluation TypeSpawn Onlyになっていれば乱数の発生は最初の1度きりとなるためプルプルしない。

左右にランダムで回っている

左右はランダムで回転速度を固定にしたい

ここからは少し難しくなる。

上の例では-300 ~ 300の間で乱数が発生するので、1とか5とか非常に小さい値が返った時は殆ど回転しないスプライトが飛ぶことになる。

返ってくる値を-300 or 300の2通りして、常に固定速度で左右に回転させたい。

先に理解しておくこと

上でも書いているが、パーティクルの更新でダイナミックインプットで乱数を入れると、毎フレームごとに乱数が更新されるので本当なら星がプルプルしてしまう。

上の例はRandom Range Floatがソレを防止してくれていたので実現できたが、ここからのケースはパーティクルの更新ではなくパーティクルのスポーンを使う必要がある。

つまりパーティクルが生み出された時に1回だけ処理が走るため、乱数の生成は1度きりとなるわけだ。

ここからは実際の手順を追いながら理解してもらえたらと思う。

パーティクルのスポーンでパラメータを作る

まずはパーティクルが生み出された瞬間に右に回るのか、左に回るのかを決定する。

つまり新しい「パラメータ」を作ってそこに数値を保存してやる必要がある。

パーティクルのスポーン

まずは追加ボタンを押して

新規パラメータ

一番下までスクロールして「新規または既存のパラメータを直接設定」

パラメータを設定

そうすると「パラメータを設定」というモジュールが出てくるので、こちらのプロパティをいじる。

+ボタン

こちらで+ボタンをおして

さらに新規パラメータを作成

ここでも「新規パラーメータを作成」する。

共通>Float

共通の中にFloatがあるので選択。もちろん検索で出しても良い。

パラメータ完成

これで一つのパラメータを作ることができた。ここには自由に名前をつけて値を保存しておける。

ひとまずrandomRotationという名前にしておいた。

Uniform AOr BFloatを使う

先程作成したパラメータにダイナミックインプットUniform AOrBFloatを設定する。

これは入力したAとBの値どちらか片方をランダムに出力するもの。まさに今回の作例にもってこい。

Uniform AOrBFloat

設定は上のようにした。

Distribution Weightはこのランダムの偏り具合の設定。

どちらも同じ確率で出てほしいので0.5でOK。

Sprite Rotation Rateに作ったパラメータを入れる

ここまでの設定で、パーティクルがスポーンした時に1度だけ-300300の値がrandomRotationというパラメータに格納される。

しかし、このままだと実際に回転させる値につなげていないので何も起こらない。

というわけでパーティクル更新に設置してあるSprite Rotation RateRotation Rateに先程作成したパラメータをダイナミックインプットとして入れてやる。

Sprite Rotation Rate

自作変数

次のようになれば設定完了

完了

おまけ:完成の前にカラーを設定

さて、これで左右に常に300のスピードで回る様になったはずだ。

せっかくなので作例を出す前にカラーを設定しておく。

Initialize Particleを選んで

Initialize Particle

カラーを次のように設定

Color

Color Mode = Random Hue/Saturation/Valueを使うと色相の違う色をランダムに出力できる。

Scale Colorモジュールを追加して、徐々にフェードアウトして消える設定も作ったが、これはお好みで。

Scale Color 1

Scale Color 2

Scale ColorはInitializeの外でもカラーを調整できるようにするモジュール。

完成

次のような作例となった。

※星のパーティクルは可愛い気がするので好み。なぜかはわからないが。

最後に

今回はパーティクルをVelocityForceを使わないでシンプルに回転させる方法を一つ紹介した。

まだまだ簡単な例だが、新しいダイナミックインプットと合わせて一つずつ覚えていってもらえればと思う。



この記事をシェア


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