【Niagara】Niagaraでの具体的な作例&NPCやNPCIによる、データ一括管理
この記事は、AdventCalendar2018の9日目の内容となります。
今回は、Niagaraで汎用性っぽいデータを作って使いまわしやすそうな例を。
このブログでは似たような事は少しはやった事があったので、今回は。
ちゃんと具体的な例で記事を書いていこうと思います。
マテリアル製作から、ナイアガラで完成させるまで書いていく予定です。
UE4のVerは4.21.0です。
今回、私の知識的な理由もあり、動きをVelocityを多様して作っています、ご了承ください。
【作成するもの】
今回は、エフェクトそのものが汎用的で使いやすいものとして、定番ですがHitエフェクトをつくろうと思います。
また、データを使いまわしやすいように作っておき、属性差分を作っていく所まで。
使い回し関係の所は、結構下の方からとなります。
【マテリアル制作】
今回は、汎用的に使いまわしたいので、いくつかの用途に使いやすそうな、マスターマテリアルを作り、そこからマテリアルインスタンスを複製するだけで、数を増やしやすいようなデータを目指します。
左から
・MM_DistortionNoTilingBase
歪みで加工する前提のマスターマテリアルです。
歪みに使う画像は、タイリングしていないものを前提としています。
・MM_DistrtionTilingBase
歪みで加工する前提なのは、上と同じです。
ただしこちらは、歪みで使う画像はタイリングしているものを前提としています。
(この二つは、無理に纏める事もできますが、複雑になりそうなので分けています)
・MM_particleBase
所謂、単純にテクスチャを入れたマスターマテリアル。
MM_particleBase
最も単純なこちらから
使用テクスチャは、この様な単純な粒子状のものを
非常にシンプル、左下のテクスチャは、インスタンスで制御できるように、パラメータ化されている方のノードを使っています。(TextureSampleをパラメータ変換すると出てきます)
右の方にあるこのノードは、不透明な物質との刺さり具合を軽減してくれるノードです。
簡単に言えば、違和感を少なくする為のノードです。
詳細の方はこうなっています、ライトの影響を受けない加算合成です。
今回作成するマテリアルは、全てこの設定になっています。
MM_DistortionNoTilingBase
使用テクスチャはこの三つです。
マテリアルの全体図はこうなっています。
ある程度はコメントなどは残していますが、全体の機能としては、ベースのテクスチャを歪み用のテクスチャで歪ませる機能を持っているだけ、と認識してもらえばOKです。
歪みだけでなく、屈折の機能を入れてみたり、インスタンス上で確認しやすいようには作ってあります。
まずはこの、歪みの処理をしている部分。
歪み用のテクスチャは、必要に応じて変えるのが多いと思いますので、パラメータ化しています。
歪みに使うために、RとGのみ取り出して、Multiplyで強度を調整し
最後にTexCoodとAddで、歪みを適用させています。
MultiplyのBの入力に繋がっている3つのノード
実際にエフェクトを作るだけであれば
これで問題ありません。
上はScalarParameter
右はStaticSwitchParameter
両方とも、インスタンスで確認しやすくする為に追加しています。
DynamicParameterはエフェクト上で数値操作できるのですが、インタンス上での確認がやや面倒なので、インスタンスで確認しやすくする為に配置しています。
後は後半部分です。
歪みを適用したテクスチャ、これもパラメータ化したTextureSampleです
これを、マスク用の下にあるテクスチャとMultpleで乗算します。
その後は、ParticleColerとの乗算で色をNiagara上で設定できるようにして
Depthfadeで刺さり具合を軽減しています。
下の屈折部分は、ここでαにでた数値を利用します。
歪みの強度と同じ方式で、屈折も操作しやすいようにしておきます。
ここをMultplyで乗算したあと、Minで1を超えた分を1に抑えたあとに
OneMinusで反転させて、リフラクションに繋げます。
この時点で歪んではいますが、実際に組み込んだ際に、ちゃんと背景歪みが上手く適応されてなかったので、ノーマルも追加します。
基本的なノーマルの強度調整と特に変わりません
RとGを抜き取って、屈折の強度をとってきているものと、Multplyで乗算してから、Bチャンネルと混ぜてVectorに合成してます。
黄色枠は、そのままノーマルに接続してます。
MM_DistortionTilingBase
使用テクスチャはこの三つです
マテリアルの全体図はこんな感じになっています
先ほどのMM_DistortionNoTilingBaseからの流用で少しだけ違います。
歪みに関するこの部分です。
こちらは、シームレスなテクスチャを歪みに使う前提の構造なので。
歪みのテクスチャをタイリングする処理を作っています。
ScalarParameterとTexCoodをMultiplyで乗算しておけば、インスタンス上でタイリング数を変化させることが可能です。
また、上の歪みに対するマスクとも乗算しています。
これは、移動量が大きくなりすぎて、移動しすぎるのを制御する為です。
左が、歪みのマスクを使わない場合
右が、歪みのマスクを使った場合
NoTilingのマテリアルのように、歪みを加えたあとに、マスクと乗算する場合に、殆ど写らなくなりやすくなってしまうので、その為に歪み自体を制御しています。
歪み適用部分後は、NoTilingから流用しています。
ノーマルへの適応も、ノイズに使ったテクスチャのRとGチャンネルを調整して使っています。
【マテリアルインスタンス】
作成したマテリアルインスタンスはこの四つ。
・MIA_Aura
親はMM_DistortionNoTilingBase
加算合成のオーラっぽいマテリアル
・MIA_Fog
親はMM_DistortionTilingBase
加算合成の煙用マテリアル
・MIA_Particle
親はMM_ParticleBase
加算合成の粒子マテリアル
・MIA_Ring
親はMM_ParticleBase
加算合成のリング状のマテリアル
今回はインスタンス自体でいじる必要があるのはMIA_Ringのみです
インスタンスで、この様なテクスチャを適用すればOKです。
機能的にはこれだけでいいのですが、今回はインスタンスで確認しやすい仕様にしてあるので、少しだけそこにも触れておこうかと思います。
MIA_Auraの方であれば、赤の部分のチェックをいれると、緑のチェックを入れれるようになります
緑のチェックをいれると、青の項目が出てくるので、ここにもチェックを入れると、右側の数値を調整できるようになります。
数値を変えていくと、こんな感じに変わっていっていると思います。
ただ、今回のは確認しやすくするためなので、確認が終わったら、チェックを外しておきましょう。
チェックを入れていると、これからする、この部分をNiagaraで動かせなくなります。
【エミッターの作成】
エミッターを作る工程で、いくつかモジュールなど途中で作っていくので、ご了承を。
エミッターはエミッターでも、具体的にはNiagaraEmitterの事なので。
パーティクルを放出するもの、ではありますが。
最終的にエフェクトにそのまま使うエミッターとは少々違います。
そのまま最終的に使うエミッターの、元となるデータ、と考えてもらうと良いかもしれません。
マテリアルと、マテリアルインスタンスとの関係に近いと思います。
まず、必要なものを考えましょう。
・飛び散る粒子
様々なエフェクトでの定番とも言えるエミッターです
当たった衝撃で、粒子が中心から外側に飛び出ます
・細長いライン
所謂レンズフレアのような、トゲトゲした描画です
エフェクト全体のメリハリをつけて、認識されやすくする大きなポイントです
・広がるリング
衝撃は、基本的には全ての方向に一定に広がるので、それをリングで表現します。
・オーラっぽいもの
これはやや言葉で表現しにくいのですが、上記の要素だけだと、物足りなさが出てくるので、それを補う為の表現...でしょうか
・グロウ
エフェクトを作っている方には定番だと思いますが、グロウです
用途的には、グロウとは外れているかもしれませんが、全体の色味を調整する重要なパーツとなります。
そこまで変わってる要素はなく、全体的にシンプルな構成になると思います。
今回は、エミッターのアセットは二つだけ作りました。
・NE_RadialVelocity
外に向けて四方八方に飛び散るエミッターです。
・NE_SimpleSpawn
シンプルに中心に一つ発生させるエミッターです。
今回は少ないエミッターで作っていこうかと思います。
エミッターとしてのアセットを増やすのは、メリットもデメリットもあります。
NE_SimpleSpawn
エミッターを作ろうとすると、4.21からはテンプレートを選べるようになっています。
とりあえずは、以前のVerで標準だったこのテンプレートから作りましょう。
初めに書いておきますが、このエミッターで何をしたいのかによって、どの様な設定にするのかは変わってきます、ご注意ください。
エミッターの名前のとおり、シンプルにしたいので
赤線を引いている部分のモジュールを削除しましょう。
削除は、右側のゴミ箱のアイコンをクリックすればOKです。
続きまして、次はモジュールを追加しましょう
EmitterUpdateにこのモジュールを追加します。
SpawnCountは、汎用性を考えて1に設定しています。
その上にある、EmitterLifeCycleも調整しておきましょう。
MaxLoopCountを1に
これは、ループ回数で0の場合は無限ループになるので注意です。
NextLoopDuration
これはエミッターで発生を続ける時間のようなもので
SpaenRateで発生させ続ける場合は、この数値の時間だけ発生を続けます。
今回は、エミッターの発生時に一回だけ発生させるので、低めの数値を入れましょう。
また、ParticleSpawnにある、ここも削除しておきましょう。
右の矢印から、Removeをクリックすれば消去できます。
また、位置情報を消してしまったので、こちらで追加しておきましょう。
SetVariablesから、Particles.Positionを追加します。
この様な紫のが追加されていれば大丈夫です、自動で着くようになっています。
簡単に言えば、レベルに配置した場合の位置情報を持ってくれます。
ParticleUpdateにて、このモジュールを追加しておきましょう
これは、大きさを徐々に変化させるモジュールです。
右の矢印から
Vector 2DFrom Float
を追加して、Floatで制御できるようにします。
その後、下の方の矢印から
Float From Curve
を追加して、カーブで編集できるようにします。
後で編集しやすいように、キーを右クリックして、両方ともAutoに設定しておきましょう。
続いて、Colorの設定も少しだけしておきましょう。
編集をしやすくする為に、赤丸の部分をクリックしましょう、そうすると、カーブエディタで編集できるようになります。
カーブエディタはTimeLineの横にあると思います、出ていなければ、ウインドウから開きましょう。
RGBは目のアイコンをクリックして、閉じた状態にしておきましょう。
個人的にですが、エミッターではRGBは全て1で設定しておくのがいいと思います。
今回はAのみ変えましょう、
カーブのキーは、カーブエディタ上で、右クリックから出るメニューで出すことができます、
これを使い、Aを0から1になり、最後にまた0になる、という数値に設定しておきましょう。
カーブを編集する際は、キーの補完をこの下線を引いてある部分で制御することが可能です。
黄丸は、個人的によく使う部分です
一番左・・・オート設定、とりあえずでカクついた動きにしたくないならこれ
真ん中・・・自身で設定、緩急を意図的に付けたい場合
3番目・・・直線、今回のように、途中は1で続けたい場合など
これで完了...と言いたいですが、少しだけ落とし穴があります
これはBチャンネルです、RGBを消してキーを打っても、RGBA全てにキーを打たれますので、忘れずに消しておきましょう、選択してからDeleteで削除できます。
これでこのエミッター側の設定は終了です。
NE_RadialVelocity
今回も、こちらのエミッターをベースに作ります。
このエミッターは、中心から外に無数のパーティクルを飛ばすものとなります。
赤線を引いた部分のモジュールは削除しておきましょう。
このエミッターの基本的な動きになる、外側に放出する動き、をどう作るのか?が少々困ったので、自分なりの作り方で作っています。
もっとやりやすい作り方はありそうです...
パーティクルの発生は、今回もSpawnBurstInstantaneousを使いましょう
発生数はとりあえず1000に
こちらはNE_SimpleSpawnと同じように設定しておきましょう。
デフォルトにある、SphereLocationのモジュールが
球状に発生させるモジュールなので、これを使います。
この球状に発生させる位置を、Velocityに変換して、外側へ放出する動きにします。
その為に、今回はNiagara Module Scriptを作ります。
名前はNM_LocationVelocityと付けました
こちらがモジュールの中身です。
早い話、位置を速度に変換する為です。
入力するModuleのパラメータはVector型とFloat型で
Vectorは、基準となる発生位置
Floatは、速度です(方向を正規化した後に乗算します)
間の三つのノードは
Subtractは、ベクトル減算により、中心からのベクトルを求めています
Normalizeは、正規化して、減算して求めたベクトルから、角度の情報のみ取得します
Multiplyは、角度にから速度を乗算して、それを最終的にVelocityに出力しています。
先ほどのNM_LocationVelocityのモジュールを追加したら、WoldVectorに、Engine.Owner.Positionをドラッグ&ドロップで敵用しましょう。
その後、Sppedに数値を入れると、その速度で外に向けて動くはずです。
ちなみにですが、Engine.Owner.Positionは使わず0,0,0でも、プレビュー上では動きますが、レベルに配置した時におかしくなったりしますので、後で困ります...
このままで動き自体は良いのですが、発生位置の制御がしにくいと思いましたので、そこの制御もできるように組んでいきましょう。
Particle.Spawnに、Particle.Positionを追加します。
いま追加したものが、順番的に最後になるようにします。
上から順番に処理されますので、順番が違うとうまく動いてくれなくなります。
いま追加したものは、発生位置を、中心から特定の距離に配置する為のものです。
最終的な構成はこうなるように目指します。
速度のVelocityから角度をを取ったあとに、その角度に対して、どの程度の距離に配置するのか?を設定できるようにします。
赤線を引いてありますが、ここはNiagara Dynamic Input Script(ND)を新しく作ったものを使っています。
内容としては、VelocityをVector型のパラメータに変換するような内容です。
Velocityの情報をNormalizeで正規化して、方向のみの情報にしてから、Scaleとの名前にしてあるFloat型のパラメータを乗算して、中心からの距離とします。
正規化してから、そのVectorにFloatで乗算すると、中心からの距離となるのは、非常に便利なので、覚えておくと様々な場面で使えると思います。
NDでは、基本的に出力する情報に、Position等の、固定の数値にはしない方やりやすいです。
内容的には、Particle.Velocityも、Vector型のModuleのパラメータでも問題ないです。
具体的にはこの様な感じです、この場合、エミッター側で、このVectorにVelocityをセットしてあげましょう。
では、このNDの内容を説明したので、もう一度ここの部分に戻りましょう。
一番上のAddVector 、名前のとおり、Vector同士の足し算です。
Engine.Owner.Position + ND Velocity Vector
Engine.Owner.Position
は、上の方でも説明しましたが、このエミッターがレベル上などで配置されている位置を取得します。
よって、これを加算するのには、レベル上で配置した位置にキチンと配置させる為ですので、これ単体では、エディタ上では特に変化はありません。
ND Velocity Vector
こちらわ先ほどの説明のとおり、中心から一定距離に配置される仕組みとなっています
こちらはデフォルトで入っているNDアセット、UniformとありMinとMaxの間のランダムとなります、ここはカスケード触っていた方なら解りやすいと思います。
これにより、配置した位置を中心に、10~20の距離にランダムに発生させる、という処理となります。
続いて、ParticleUpdateに、Particle.Velocityを追加しましょう
これは、パーティクルの外へ向かう速度に減速処理を掛けます。
ここの数値はこの様になっています。
最初のMultply.Vectorにて、現在の速度である、Particle.Velocityと、Float型のカーブを乗算して、速度をカーブで制御します。
このカーブでの制御部分は、Vectorのままでは制御しにくいので
VectorFlomFloatでFloat型に変換してから
FloatFromCurveでカーブを描いていきます。
これで、このカーブ沿って動きが変わります。
後は、NE_SimpleSpawnと同じように
PartixleUpdateと同じように、大きさが小さくなっていく処理と、Aが0→1→0となる処理を追加しておきましょう。
これでエミッターの設定は一旦終了です。
【システムの作成】
漸く完成が見えてきました、作ったエミッターなどをシステムに登録して、エフェクトとして完成させます。
エミッター毎に数値の設定をしていっていますが、実際作るときは、全てのエミッターに仮として数値を入れておいてから。
最終的に全て表示している状態で、違和感が無いように数値を微調整していきます。
実際にエミッターを登録していきます。
赤線は、 NE_RadialVelocity
黄線は、NE_SimpleSpawn
を使っています
NE_RadialVelocity
外側へ放出される粒子です。
エミッター自体で殆ど設定していますので、システム側で設定する項目はあまりありません。
Colorのモジュールから、色の変更をしておきましょう。
エミッシブにて、Rに高い数値を入れて上げればOKです。
LifeTImeや、SpriteSizeは動きを見ながらいい感じになるように設定しておきましょう。
最後に、作ったマテリアルであるMIA_Particleを設定しておきましょう。
デフォルトのマテリアルとそこまで大きく変わりはありませんが。
NE_Ring
名前の通りリングです、それ以上でも以下でもありません。
これ移行は全てNE_SimpleSpawnから作ります。
まずは、見た目がそもそも違いすぎて確認しにくいので、マテリアルの設定をしましょう。
適用するのはこの、MIA_Ringとなります。
基本は、マテリアル側から設定すると、設定途中で確認しやすいのでおすすめです。
SpriteSizeScale
次に大きさを変えましょう、こちらのモジュールを弄り、段々と大きくなるように設定しましょう。
キーをクリックすると、上で時間と数値を直接入力できるので
時間0で値1
時間1で値1に設定して、徐々に拡大する動きに変化させます。
ただ、このままだと動きが地味すぎるので、カーブを弄りましょう
カーブの左右の◆はドラッグ&ドロップで動かすことが出来ます。
また、この時カーブの設定がオートになっている場合でも、ユーザーに書き換えられます。
なので、エミッターのアセット自体では、オートにしておくと、何かと便利です。
カーブの設定は、感覚で所謂いい感じに設定しておきましょう。
SpawnBurstInstantaneous
ここはパーティクルの発生数です、とりあえず6にしておきましょう。
SetVariables
ここで大きさを、生存時間をランダムにしておきましょう。
Color
色の設定もしておきましょう、赤丸の所をクリックして、カーブエディタで編集すると楽です、黄色から赤になるような色合いに設定しました。
NE_Ringの設定は以上で終了です。
NE_Line
細長いラインです、レンズフレアのような表現でもあります。
こちらもエミッターはNE_SimpleSpawnから
マテリアルは、MIA_Particleを使います
発生数は今回は10個程に設定しています
SetVariables
寿命と、大きさを設定します
大きさは、細長くするのでXとYに別々の数値を入れておきます
SpriteSizeScale
こちらでは、細長くなっていく動作にします。
このモジュールに初期で入っている数値は、黄色の矢印でリセットできるので
リセットしてから、Vector2でのカーブを再度入れて設定します。
Color
色はリングと大体似たような設定で、黄色から赤になるように設定しつつ、エミッシブカラーで発光させましょう。
エフェクト全体で見た場合、結構印象に残りやすい部分ですので、発光は基本的に強めに設定しておきましょう。
NE_Glow
グロウです、設定が最もシンプルなエミッターとなります。
NE_SimpleSpawnのエミッターを登録し
MIA_Particleを適用してください。
発生数は1です
SetVariables
このエミッターでは、基本的にランダム性は必要ありません、設定はこの様になりました。
SpriteSizeScale
構成としては、NE_Ringと基本的に変わりません、徐々に大きくなるようにしています。
Color
このモジュールで色を設定していきますが、このエミッターではエミッシブで発光はさせません。
Rを1GBを0にして、後はAで色の調整をしています。
NE_Aura
オーラっぽい何かです、今回はマテリアルの解説もこみこみゆえに、簡易的な作りであるので、その点はご了承ください。
マテリアルはMIA_Aura
エミッターはNE_SimpkeSpawn
発生数は2です。
SetVariables
ここでの設定は、大きさや寿命辺を設定しておきます。
SpriteSize
他のエミッターでもよくやってるパターンです
Color
色は、カーブエディタで、黄色から赤への変化させつつ、エミッシブでの発光を入れておきましょう。
SetVariables(DynamicParameter)
ここから、DynamicParameterの設定をしていきます。
カスケードでも同じような機能はあるので、UE4で作っている方にとっては、馴染み深いのでは?と思います。
初めて聞く方は、こちらの記事も参考にしてください。
【UE4】Dynamic Parameterを使ったフェードアウト - moyasiエフェクト館
tktknkyo.hatenadiary.j
【UE4】DynamicParameterにて、ノイズテクスチャを使ったフェードアウト - moyasiエフェクト館
設定したカーブだとこんな感じになっています、BとAは使っていないので表示していません。
ここでの設定はとりあえずこのようになります。
りフラクションを入れてあるので、エミッターや背景が歪んで表示されるようになります。
これで漸く完成です。
そしてここから、データ管理、NPCやNPCIに関する内容に入っていきたいと思います。
一応ここからが、元々メインで書こうとしていた部分です。
【NiagaraParameterCollection】
簡単に言ってしまうと、Niagaraのパラメータを一括で制御できたりする機能です。
基本的な使い方は、この記事でも紹介しています。
まずは、NPCファイルを作ります、名前はNPC_Testと名づけます
今回は、生存時間の長さを調整するようにします。
Float型のパラメータを作り、名前をLifeScaleに設定し、数値を1に設定します。
次に、エミッター側に適用します
NE_SimpleSpawnを開きます
パラメータの部分から、先程作ったデータをここに入れます。
LifeTImeの所に、先ほどのパラメータを追加しておきます
内容としては、元ある数値と、NPCのファイルをMultplyで乗算します。
この時点では特に何も変わりません、変わったらまずいです...
NE_RadialVelocityにも、同じように登録しておきます。
この状態で、システムを開くとこうなっています。
先程登録したものが出ていません、右の緑の矢印をクリックすると、出てくるようになります。
ただし、この手法で、全てやっていると、手間が掛かります。
本来であれば、最初に登録しておくべきですが、この様な場合に便利な方法があります。
処理が上から順番にされるというのを利用します。
下の赤枠が、新しく追加したLifetimeです。
処理としては、Lifetimeの数値を
既に設定されている数値と、NPCファイルを乗算した数値に設定する、という内容です。
NIagaraでは、既に設定されているパラメータも、このように引っ張ってくることが出来ます。
これも、NE_RadiusVelocityにも敵用しておきます。
再度システム側に戻ると、入れた情報が、ちゃんと入っているはずです。
この状態で、NPCファイルの数値を弄ると、システムの方のパーティクルの寿命が変わるようになっているはずです
システムとエミッターは連動こそしていますが、既に入っているパラメータを変えた場合は、システム側でいじっている場合は、エミッター弄っただけでは更新されないので注意です。
【属性差分】
次は、火属性の属性差分を、簡易的にですが作ります
まずは、NS_HitNormalを複製して、名前をNS_HitFireに変えます。
煙なので、粒子程の発生数はないので、発生数は100程に設定します
大きさは、粒子より大きいので、50~75程に設定しておきます
NE_RadialVelocityに、MIA_Fogのマテリアルを敵用します。
Sprite Size Scale
煙なので、拡大していく動きになるように設定します。
SetVariables
NE_Auraと同じように、ここでDynamicParameterを設定していきます。
カーブはこのように設定しました。
後は、違和感のないように、色味を調整すれば完成です。
【NiagaraParameterCollectionInstance】
最後に、こちらの敵用、運用も載せておきます。
NiagaraParameterCollectionから作ることが出来ます。
今回は、NormalとFireで二つ作ります。
このまま開いてもいいのですが、その前に敵用させましょう。
システムを開き、SystemDetailsから、先程作ったNPCIアセットをドラッグ&ドロップなどで敵用させましょう。
NormalとFireの両方に適応させましょう。
その後、NPCIアセットを開き、左のチェックボックスにチェックを入れて、数値を変更すると、NPCIアセットを敵用した方のみ数値が変動するようになります。
数値なら大体のものを変えることが出来るので、ここから歪みやパーティクル単体の大きさ、動く移動量などを制御することも可能です。
今回は比較的に長い記事となりました、ここまで読んでくださって有難うございます、間違え等ありましたら、拍手などでコッソリ教えていただけると幸いです。