Niagara は Unreal Engine の次世代 VFX システムです。Niagara を使用することで、テクニカル アーティストはプログラマーのサポートなく、自分で追加の機能を作成できます。Niagara は、適応性と柔軟性に富んだシステムです。初心者はまずテンプレートや動作のサンプルの修正から始めることができ、上級ユーザーは自分のカスタム モジュールを作成できます。
Niagara のコア コンポーネント
Niagara VFX システムには、次の 4 つのコンポーネントがあります。
システム
エミッタ
モジュール
パラメータ
システム
Niagara システムは、エフェクトを構築するために必要なものがすべて入ったコンテナです。システムの中には、全体的なエフェクトを生み出せるようにさまざまな構成要素が積み重なっています。
システムレベルのいくつかの動作を修正して、そのエフェクトにあるすべての構成要素に適用することができます。
システム エディタの [Timeline (タイムライン)] パネルでは、どのエミッタがシステムに含まれているかが示されており、このパネルを使用して、それらのエミッタを管理できます。
エミッタ
エミッタは、Niagara システムでパーティクルが生成される場所です。エミッタは、パーティクルが生まれる方法、生まれたパーティクルが時間経過とともにどうなるのか、パーティクルの外観と動き方を制御します。
エミッタは、スタックを 1 つのまとまりとして整理されます。スタックの中にはいくつかのグループがあり、そのグループの中に個々のタスクを達成するモジュールを入れることができます。グループは以下のとおりです。
Emitter Spawn (エミッタのスポーン)
このグループは、CPU 上でエミッタを最初に作成したときに何が起こるかを定義します。このグループは、初期設定とデフォルトを定義するために使用します。
Emitter Update (エミッタの更新)
このグループは、CPU 上でフレームごとに発生するエミッタ レベルのモジュールを定義します。このグループは、パーティクルを毎フレームでスポーンし続けたい場合、パーティクルのスポーンを定義するために使用します。
Particle Spawn (パーティクルのスポーン)
このグループはパーティクルが初めて生まれたとき、パーティクルごとに 1 回呼び出されます。ここでは、パーティクルが生まれる場所、パーティクルの色やサイズなど、パーティクルの初期化の詳細を定義します。
Particle Update (パーティクル更新)
このグループは各フレームでパーティクルごとに呼び出されます。パーティクルの時間的な変化に伴ってフレーム単位で変更する必要があるものをここで定義します。例としては、パーティクルの色が時間の経過とともに変わる場合や、パーティクルが重力、Curl ノイズ、ポイント引力のような力に影響を受ける場合があります。時間の経過とともにパーティクルのサイズを変更したい場合も当てはまります。
Event Handler (イベント ハンドラ)
Event Handler グループでは、特定のデータを定義する 1 つまたは複数のエミッターに Generate イベントを作成できます。そして、その生成したイベントに反応する動作をトリガーする他のエミッタに Listening イベントを作成できます。
Render (レンダー)
最後のグループは Render グループです。このグループでは、パーティクルの表示とパーティクル用の 1 つまたは複数のレンダラの設定を定義します。3D モデルを、マテリアルを適用できるパーティクルのベースとして定義する場合、メッシュ レンダラを使用できます。または、スプライト レンダラを使用して、パーティクルを 2D スプライトとして定義することもできます。レンダラにはさまざまな種類があり、目的に応じて選択し、試すことができます。
モジュール
モジュールは、Niagara のエフェクトの基本の構成要素です。モジュールをグループに追加してスタックを作ります。スタックのモジュールは、上から下へ順次処理されます。
モジュールは、計算するためのコンテナと考えることができます。データをモジュールに渡し、モジュール内でそのデータに対する計算を行い、モジュールの終了時にそのデータを書き戻します。
モジュールは High Level Shading Language (ハイレベル シェーディング ランゲージ、略称:HLSL) を使用して作成されますが、グラフでノードを使用して視覚的に作成することもできます。モジュールでは、関数を作成したり、入力を含めたり、値やパラメータ マップに書き込んだりすることができます。また、グラフで CustomHLSL ノードを使用して、HLSL コードをインラインで記述することもできます。
Niagara のエミッタから任意のモジュールをダブルクリックすると、内部で起こっている計算を見ることができます。コピーして自分のモジュールを作ることもできます。たとえば、内部を見るために Add Velocity モジュールをダブルクリックすると、データフローを調べることができます。
画像をクリックするとフルサイズで表示されます。
スクリプトは、まず速度入力と座標空間という入力を取得します。次に、パーティクルの現在の速度と入力されたスケーリング ファクターを取得します。さらに、入力速度はスケーリングされ、正しい座標空間に変換され、パーティクルの現在の速度に追加されます。その処理が完了すると、新しいパーティクルの速度は書き戻されます。これは、スタックのさらに下にある、速度情報を必要とするモジュールが情報を取得できるようにするためです。
すべてのモジュールはこの基本的な方法で構築されていますが、モジュールによっては内部の計算がより複雑になる場合があります。
パラメータとパラメータの型
パラメータは、Niagara シミュレーションにおいてデータを抽象化したものです。「パラメータ」には、パラメータが表すデータを定義する型が割り当てられています。パラメータには、次の 4 つの型があります。
プリミティブ:幅広い精度とチャンネル幅を持つ数値データを定義します。
列挙型:名前付きの値の固定セットを定義し、いずれかの名前付きの値を受け入れます。
構造型:プリミティブ型と列挙型を併用したセットを定義します。
データ インターフェース:外部データ ソースからデータを提供する関数を定義します。これは、UE4 の他の部分のデータであったり、外部アプリケーションのデータであったりする場合があります。
プラス記号 アイコン (+) をクリックして、[Set new or existing parameter directly (新規または既存のパラメータを直接設定する)] を選択すると、エミッタにカスタムのパラメータ モジュールを追加できます。Set Parameter モジュールをスタックに追加します。Set Parameter モジュールの プラス記号 アイコン (+) をクリックして [Add Parameter] を選択して既存のパラメータを設定、または [Create New Parameter] を選択して新しいパラメータを設定します。
テンプレートおよびウィザード
初めて Niagara エミッタまたは Niagara システムを作成する際は、作成するエミッタまたはシステムの種類に関して複数のオプションを提示するダイアログが表示されます。
テンプレートのパラメータはいずれも変更可能です。どのモジュールも追加、変更、または削除することができます。また、システム テンプレートでは、どのエミッタも追加、変更、または削除できます。テンプレートは、クリエイティビティを促進するために、すぐに操作できるように作成されています。
システム ウィザード
新しい Niagara システムを作成するには、コンテンツ ブラウザ 内で右クリックし、[FX] > [Niagara System] を探します。
画像をクリックするとフルサイズで表示されます。
システム ウィザードには、新しいシステムを作成するための次のオプションがあります。
New system from selected emitters:このオプションを選択して [Next (次へ)] をクリックすると、使用可能なエミッタのリストが表示されますこのリストにはプロジェクトの既存エミッタとテンプレートのエミッタの両方が含まれます。新しいシステムに含めるエミッタを選択して、緑色の [プラス記号] (+) アイコンをクリックして追加します。次に [Finish (完了)] をクリックしてシステムを作成します。既存のエミッタを選択すると、これらのエミッタが継承されます。テンプレートのエミッタを選択すると、何も継承されません。ままた、テンプレートのエミッタは、システムに対して厳密にローカルにするか、別のミッタ アセットとして保存することができるインスタンスです。
画像をクリックするとフルサイズで表示されます。
New system from a template or behavior example:このオプションを選択して [次へ] をクリックすると、一般的に使用されるいくつかのエフェクト システムを表すテンプレートまたは動作のサンプルのリストから選択できます。エミッタ テンプレートと同様に、このリストはアート関連の責任者やクリエイティブ ディレクターによって作成される場合があります。UE を初めて使用する場合、このオプションは Niagara での FX システム構築例として利用できます。動作のサンプルは、Niagara システムの 1 つの独立した部分を取り上げた簡単な例で、その動作の解明のために調べることができるようになっています。
画像をクリックするとフルサイズで表示されます。
Copy existing system:このオプションを選択して [Next] をクリックすると、使用可能なシステムのリストが表示されます。コピーするシステムを 1 つ選択して [Finish (完了)] をクリックします。
画像をクリックするとフルサイズで表示されます。
Create empty system:このオプションを選択すると、システムにはエミッタやエミッタ テンプレートが含まれません。このオプションは、他のシステムとまったく異なるシステムを作成する場合に便利です。
画像をクリックするとフルサイズで表示されます。
エミッタ ウィザード
新しいエミッタを作成するには、 コンテンツ ブラウザ 内で右クリックし、 [FX] > [Niagara Emitter] を選択します。
画像をクリックするとフルサイズで表示されます。
エミッタ ウィザードには、新しいエミッタを作成するための次のオプションがあります。
New emitter from a template:このオプションを選択すると、一般的に使用されるいくつかの種類のエフェクトを表示するテンプレートのリストから選択できます。大規模な開発スタジオでは、企業のベスト プラクティスがテンプレートに確実に反映されるようにするため、テンプレートのリストはアート関連の責任者やクリエイティブ ディレクターが作成する場合があります。また、UE4 を初めて使用する場合は、手始めにこれらのテンプレートを使用することをお勧めします。
画像をクリックするとフルサイズで表示されます。
Inherit from an existing emitter:このオプションを選択すると、既存のエミッタのプロパティを継承するエミッタを新規作成できます。このオプションを使用すると、新しいエミッタが、選択した既存のエミッタの子になります。すべてが共通の特定のプロパティを持つ多数のエミッタが必要な場合は、このオプションを選択することをお勧めします。親エミッタを変更すると、すべての子エミッタにその変更が反映されます。このオプションを使用するは親エミッタから選択します。
画像をクリックするとフルサイズで表示されます。
Copy existing emitter:このオプションを選択すると、作成済みのエミッタをコピーして新しいエミッタを作成できます。同じようなエミッタを複数作成する必要がある場合に役立ちます。このオプションを選択して [Next] をクリックすると、使用可能なエミッタのリストが表示されます。コピーするものを選択します。
画像をクリックするとフルサイズで表示されます。
Niagara VFX のワークフロー
システムを作成する
まず、1 つまたは複数のエミッタを追加できる Niagara システムを作成します。それから各エミッタのプロパティを設定します。
エミッタを作成または追加する
Niagara エディタでは、すでに入っているモジュールのプロパティを変更することでエミッタを調整したり、希望するエフェクトのための新しいモジュールを追加したりできます。また、エミッタをコピーして 1 つの Niagara システムに複数のエミッタを追加することもできます。その一例は、スパークのチュートリアルをご覧ください。
モジュールを作成または追加する
エミッターには、モジュールを追加するグループの プラス記号 (+) をクリックして、Niagara から既存のモジュールを追加できます。Niagara は既成のモジュールが多く搭載されていて、ほとんどの場合、カスタム モジュール デザインをする必要なくエフェクトを作成できますが、
モジュール内のデータ フローを理解しておけば、独自のモジュールを作成する場合に役立ちます。
モジュール内のデータ。画像をクリックするとフルサイズで表示されます。
モジュールが一時的な名前空間に蓄積されるため、より多くのモジュールをまとめてスタックできます。同じ属性に関与する限り、モジュールは適切にスタックおよび蓄積されます。
モジュールを記述する際は、次のように多くの関数を使用できます。
ブール演算子
Math 式
三角公式
カスタマイズ関数
ボイラープレート関数をより簡単にするノード
モジュールを作成したら、誰でもそのモジュールを使用できます。
モジュールはすべて HLSL を使用します。ロジック フローは次のとおりです。
HLSL ロジック。画像をクリックするとフルサイズで表示されます。
作成したモジュール、エミッタ、システムはそれぞれリソースを使用することを覚えておいてください。リソースを節約しパフォーマンスを改善するには、Niagara の既存モジュールを確認し、新しいモジュールを作成しなくても目的を達成できるか確認します。動的入力 がここで大きな効果があります。
Niagara のパラダイム
継承
平坦な階層では、ライブラリ内で既存のアセットを効果的に見つけて使用することはできません。その結果、既存のアセットを再度作成することになります。重複する作業は効率が低下するだけでなく、コストが増大します。
階層的な継承では検出可能性が高まるため、既存のアセットを効果的に再利用できます。
システムの子エミッタでは、継承されたものはすべてオーバーライドできます。
モジュールを追加したり、親の値に戻したりすることができます。 これは、スポーン、存続期間、ループ、バーストなどのエミッタレベルの動作にも当てはまります。
動的入力
動的入力は、モジュールの作成と同じ方法で作成されます。
動的入力により、ユーザーは継承に関して無限の拡張性を得ることができます。
動的入力は、パラメータ マップに作用するのではなく、値の型に作用します。
いずれの値もグラフ ロジックとユーザー向けの表示値で実行されます。
動的入力はモジュールの作成とほぼ同じではありますが、実際に新規モジュールを作成することなく、動的入力を選択してスタックに含めることができます。
動的入力を使用およびチェーンすることで、既存モジュールをさまざまな方法で変更およびカスタマイズできます。モジュールの肥大化を減らし、パフォーマンスを改善します。
マクロ式
インライン値はすべて HLSL 式のスニペットに変換できます。
ユーザーは、パーティクル、エミッタ、またはシステムの任意の変数、および任意の HLSL 関数または VM 関数にアクセスできます。
これは、新規モジュールを必要としない、小規模の一度限りの機能に適しています。
イベント
イベントは、要素 (パーティクル、エミッタ、システムなど) 間でやり取りを行う手段です。
イベントとしてあらゆる種類のデータを使用でき、ペイロード (構造体など) にパックして送信します。その後は、他のどの要素でもそのイベントをリッスンしてアクションを実行できるようになります。
使用可能なオプションは次のとおりです。
Particle.ID を使用して、パーティクルに対してイベントを直接実行する。
システム内のすべてのパーティクルでイベントを実行する。
イベントに応じてパーティクルをスポーンするように設定し、それらのパーティクルに対してアクションを実行する。
イベントはグラフの特殊なノード (構造体) です。Event ノードを使用するには、次の手順を実行します。
イベントに名前を付けます。
必要なデータをすべて追加します。
エミッタ スタックにイベント ハンドラを追加します。
イベント ハンドラのオプションを設定します。
イベントには個別の実行スタックがあります。
精密なグラフ ロジックをイベント ハンドラに配置できます。
複雑なロジックを使用してパーティクル システム全体を設定し、イベントがトリガーされたときに発生する一連のビヘイビアを個別に設定できます。
データ インターフェース
任意のデータにアクセスできるようにする拡張可能なシステムがあります。
任意のデータには、メッシュ データ、音声、外部 DDC 情報、コード オブジェクト、およびテキスト コンテナが含まれます。
データ インターフェースは、将来に向けた拡張性を高めるためのプラグインとして作成できます。
ユーザーは、スケルタル メッシュのデータ インターフェースを使用して、スケルタル メッシュに関連付けられたあらゆるデータを取得できます。
Houdini (フーディーニ)
Houdini を使用すると、スプリット ポイント、スポーン位置、衝撃位置、衝撃速度、法線などを計算できます。
その後、そのデータを Houdini から一般的なコンテナ形式 (CSV) にエクスポートできます。
その CSV を UE4 プロジェクトで Niagara にインポートできます。