はじめに
この記事では Unreal Engine 5 の Niagara について学んだことをひらすら追加していきます。
Niagara の学習には Udemy の「Unreal Engine 5: One Course Solution For Niagara FX」という講座を参考にさせていただいています。
基本用語
Niagara の基本要素
System
まずは Niagara を構成する基本要素を紹介します。
Niagara には System というものがあります。
System については公式ドキュメントに以下のように説明されています。
Niagara システムは、エフェクトを構築するために必要なものがすべて入ったコンテナです。システムの中には、全体的なエフェクトを生み出せるようにさまざまな構成要素が積み重なっています。
Niagara の概要
コンテンツドロワーで見ると水色で表現されるアセットのことですね。
ビューポートにドラッグ & ドロップすると、その Niagara System がアサインされた状態の ANiagaraActor が出現します。

Niagara System をダブルクリックして開くとアセットと同じ名前の水色のノードが配置されています。

Emitter
次は Emitter です。
Emitter は System のようにコンテンツドロワー内に1つのアセットとして作成することができますが、それ単体でビューポートにドラッグ & ドロップすることはできません。

System の中にある構成要素の一部のような感覚です。
公式ドキュメントでは以下のように説明されています。
エミッタは、Niagara システムでパーティクルが生成される場所です。エミッタは、パーティクルが生まれる方法、生まれたパーティクルが時間経過とともにどうなるのか、パーティクルの外観と動き方を制御します。
Niagara の概要
基本的にエフェクトというのは Plane のような平面(2次元)のものや、Cube のような立体(3次元)のものをパーティクルとして大量に放出してその集合体全体で見た目を作るイメージです。
Module
基本要素の最後は Module です。
これは Emitter の中の部品?のような感覚です。
Emitter はパーティクルの動きや見た目を決めるもので、その Emitter をさらに細かく分けると Module という単位になるというイメージです。

公式ドキュメントには以下のように説明されています。
ここに書かれているように、Module を後述のグループというものに追加するとスタックができあがり、スタック内のモジュールは上から順に実行されるそうです。
モジュールは、Niagara のエフェクトの基本の構成要素です。モジュールをグループに追加してスタックを作ります。スタックのモジュールは、上から下へ順次処理されます。
Niagara の概要
スタックとはなんぞやという感じですが、公式ドキュメントの記述を見ると後述のグループをまとめたもの?という感じでしょうか?
(詳しい人教えてください!)
エミッタは、スタックを 1 つのまとまりとして整理されます。スタックの中にはいくつかのグループがあり、そのグループの中に個々のタスクを達成するモジュールを入れることができます。
Niagara の概要
Emitter のグループ
Emitter Spawn
ここからは Emitter のグループについて解説します。
まずは Emitter Spawn です。

公式ドキュメントに書かれているように、ここでは Emitterが作成されたときに起こることを定義します。
Emitter にとっての BeginPlay() のような感覚でしょうか。
エミッタが CPU で作成された際に 1 回実行されます。このセクションのモジュールでは、デフォルト値を初期化するか、初期セットアップを実行します。モジュールはそれぞれスタックの上から下の順に実行されます。
Emitter Spawn グループ
Emitter Update
次は Emitter Update です。
公式ドキュメントには以下のように書かれています。
CPU 上でフレームごとに発生するエミッタ レベルのモジュールを定義します。このグループは、パーティクルを毎フレームでスポーンし続けたい場合、パーティクルのスポーンを定義するために使用します。
Niagara の概要
Emitter Update については以下のようにも書かれており、後述のパーティクル用の Tick() ではなく、Emitter 用の Tick() というイメージに近いのかもしれません。
Emitter Update モジュールは、エミッタが CPU 上でティックするたびに実行されます。
Emitter Update グループ

Particle Spawn
次は Particle Spawn です。
先ほどの Emitter Spawn は Emitter が作成されたときに実行されるものでしたが、こちらは Emitter ではなく、パーティクルが作成されたときに各パーティクルごとに1度だけ実行されます。

公式ドキュメントにもあるようにパーティクルの生成場所や色、サイズなどの初期設定を行います。
パーティクルが初めて生まれたとき、パーティクルごとに 1 回呼び出されます。ここでは、パーティクルが生まれる場所、パーティクルの色やサイズなど、パーティクルの初期化の詳細を定義します。
Niagara の概要
Particle Update
次は Particle Update です。
こちらも Emitter Update とは異なり、Emitter にとっての Tick() ではなく、各パーティクルにとっての Tick() というイメージです。

時間経過でパーティクルのサイズが変化したり、色が変化したりするといった処理はこのグループで作ります。
各フレームでパーティクルごとに呼び出されます。パーティクルの時間的な変化に伴ってフレーム単位で変更する必要があるものをここで定義します。
Niagara の概要
Event Handler
次は Event Handler です。

自分はまだこのグループを使ったことがありません…
使い方が分かり次第、追記します!
ちなみに公式ドキュメントでは以下のように書かれています。
Event Handler グループでは、特定のデータを定義する 1 つまたは複数のエミッターに Generate イベントを作成できます。そして、その生成したイベントに反応する動作をトリガーする他のエミッタに Listening イベントを作成できます。
Niagara の概要
Render
最後は Render です。

パーティクルを2次元にするのか、3次元にするのかといったパーティクルの種類のようなものを決めたりします。
このグループでは、パーティクルの表示とパーティクル用の 1 つまたは複数のレンダラの設定を定義します。
Niagara の概要
Renderer の種類
Sprite Renderer
次は Renderder の種類を紹介します。
まずは Sprite Renderer です。
公式ドキュメントに書かれている通り、Sprite Renderer は2次元(平面)であり、常にカメラの方向を向きます。
スプライトとは頻繁に使用されるビジュアル エフェクト (VFX) 技法の一つで、テクスチャおよびマテリアルを 2D カメラ方向平面にレンダリングします。
Niagara でスプライト パーティクル エフェクトを作成する方法
最も良く使われている種類の Renderer かもしれませんね。

Mesh Renderer
次は Mesh Renderer です。
Sprite Renderer は2次元の平面でしたが、 Mesh Renderer では奥行きがあります。
好みの Static Mesh をパーティクルとして出現させることができます。

Ribbon Renderer
最後は Ribbon Renderer です。
実際の見え方をご覧いただくと分かりますが、まさにリボンのように紐が引っ付いているかのような見た目をしています。

公式ドキュメントでは煙や飛行機雲などのシミュレーションに最適!と書かれています。
自然現象のシミュレーションは簡単ではありません。特にスプライトまたはメッシュ ベースのパーティクルを使用して煙や飛行機雲などを再現するのは困難な作業です。Ribbon Emitters (リボン エミッタ) はこのようなオブジェクトのシミュレーションに最適なソリューションです。
リボン エフェクト
Sprite の種類
次は Sprite の種類についてです。
Sprite は主に CPU Sprite と GPU Sprite の2つがあります。
CPU Sprite と GPU Sprite、つまり CPU で演算処理を行うか、GPU で行うかは Emitter の「Emitter Properties > Sim Target」で設定できます。

CPU Sprite
まずは CPU Sprite について説明します。
「Emitter Properties > Sim Target」はデフォルトでは CPUSim になっています。

スポーンさせるパーティクルがそこまで多くない場合は CPU Sprite でも問題ありませんが、公式ドキュメントにも書かれているようにスポーンさせるパーティクルが数万にものぼるような、非常に多くのパーティクルをスポーンさせる場合は GPU Sprite に切り替えた方がいいです。
エフェクトによっては、数万にもおよぶパーティクルのスポーンが必要になるものがあります。しかし、多数のパーティクルを標準的な CPU で生成すると、パフォーマンスに問題が生じることがあります。
GPU スプライト エフェクト
「じゃあ全部 GPU Sprite にしちゃえばいいじゃん!」と思うかもしれませんが、CPU Sprite では使える機能が GPU Sprite では使えないということもあるそうです。
CPU と GPU スプライトの挙動は似ていますが、いくつかの重要な違いがあります。CPU パーティクルで利用できるいくつかの機能 (ライト エミッション、Material パラメータの制御、Attraction モジュールなど) は、GPU パーティクルでサポートされていません。しかし数字を見る限りでは、GPU でサポートが無い機能があってもそれを十分に補うものです。
1.1 – CPU と GPU のスプライトパーティクルの比較
GPU Sprite
次は GPU Sprite です。

GPU Sprite ではパーティクルのスポーンは CPU で行い、その後の演算処理は GPU で行います。
最初に CPU 上でスポーンされるパーティクルですが、その後、全てグラフィックカードで処理及び演算処理されます。
1.1 – CPU と GPU のスプライトパーティクルの比較
公式ドキュメントにそのまま書かれていますが、GPU を使用するので非常に多くのパーティクルを1度に演算処理できます。
GPU で演算処理をするため、何千もの多くのパーティクルを一度に処理できるのが利点です。高密度でより詳細なパーティクル システムを実現します。
1.1 – CPU と GPU のスプライトパーティクルの比較
CPU と GPU の違いについては天下の NVIDIA 様がとても分かりやすく教えてくれている動画があるので貼っておきます。
マテリアルのブレンドモード
次はマテリアルのブレンドモードについて軽く紹介します。
ゲーム内にある建物や車、人などに使うマテリアルは基本的には不透明(Opaque)なものが多いかと思いますが、エフェクトでは半透明なものを良く使用します。
その半透明の中にも主に2種類あるのでそれぞれ解説します。
Translucent(透過)
まずは Translucent です。
公式ドキュメントでは「透過」と表現されていたりしますが、完全に透明で目に見えない状態や、半透明の状態、背後のオブジェクトが全く見えない不透明な状態にもなれます。
透過ブレンド モードは、何らかの透過処理が必要なオブジェクトに使用します。
マテリアルのブレンド モード
Opacity(不透明度)を1にした状態で Base Color に0(黒色)を設定すると最終的な結果もそのまま真っ黒になり、0.5(灰色?)を設定すると最終的な結果もその色になります。
Base Color にどんな値を入れても透明度は完全に不透明なままです。


Additive(加算)
次は Additive です。
日本語では「加算」と表現されていて、公式ドキュメントには以下のように書かれています。
加算ブレンド モードは、マテリアルのピクセルを受け取り、それらを背景のピクセルに加えます。つまり、明るさは落ちないということです。すべてのピクセル値が加算されるため、黒は単に透明としてレンダリングされます。このブレンド モードは、火、蒸気、ホログラムなど、さまざまな特殊エフェクトに役立ちます。
マテリアルのブレンド モード
つまり、どれだけ落ち込んでいても暗くなることはなく、常に周り以上の明るさを保てるということでしょうか?
(ゲーム開発とは全く関係のない日常生活でも役に立ちそうな言葉ですね)
Translucent では Opacity が1の状態で Base Color に設定した色はそのままベタ塗りのような感じで表示されていましたが、Additive は異なります。
Additive で Opacity を1にした状態で Base Color に0を設定すると何も表示されなくなります。

その状態で Base Color に 0.5 を設定すると半透明な状態になりました。
Base Color が Opacity の役割を兼ねているというと語弊がありそうですが、先ほどの「つまり、明るさは落ちないということです」という公式ドキュメントの言葉が少し理解できたのではないでしょうか?

良く使う Module
次は良く使う Module を Emitter のグループごとに紹介します。
Emitter Update
Emitter State
まずは Emitter State です。
Emitter State ではその Emitter のライフサイクルについての設定ができます。
ライフサイクルについて Emitter ごとに設定するか、それとも System の設定を適用させるか、そのライフサイクルを無限にループさせるか、寿命は何秒かといったことを設定できます。

Life Cycle Mode
詳しく見ていきましょう。
まずは Life Cycle Mode です。
ここではライフサイクルに関する設定を System から引き継ぐか、Emitter ごとに設定するかを決められます。
System の場合はその Emitter を所有している System の System State に設定されている値が適用されます。

このとき、Emitter State 側では各項目に値を設定できなくなります。

逆に Self の場合は Emitter State 側で各項目に値を設定できるようになりますが、どうしても Emitter 側で個別にライフサイクルについて設定したい場合を除いて、基本的には System にした方が処理が軽いそうです。
(参考:Unreal Engine 5 Niagaraにおける実践的な最適化とスケーラビリティ【CEDEC 2023】)

Loop Behavior
次は Loop Behavior です。
Loop Behavior では名前の通りループの挙動について設定できます。
Loop Behavior は3種類から選択でき、Once の場合は1度のみ再生されます。

Multiple の場合はループ回数を指定して再生できます。
この GIF では Loop Count を2に設定しています。

最後に Infinite の場合は名前の通り無限にループ再生されます。

Loop Delay / Delay First Loop Only
次は Loop Delay です。
Loop Delay では、ループ再生に入る前の遅延を設定することができます。
この GIF では Loop Behavior を Infinite に、Loop Delay を1に設定しています。

また、Delay First Loop Only を true にする事で、最初の再生時のみ遅延させて2回目以降のループ再生では遅延を挟まないようにすることもできます。
Spawn Burst Instantaneous
次は Spawn Burst Instantaneous です。
Spawn Burst Instantaneous については公式ドキュメントでは以下のように説明されています。
すべてのエミッタにパーティクルのバーストを自発的にスポーンするモジュールです。
System Spawn グループ
Spawn Count / Spawn Time
各設定項目を見ていきましょう。
まずは Spawn Count と Spawn Time です。
ここでは Emitter 生成時にスポーンさせるパーティクルの数や、Emitter 生成の何秒後にパーティクルをスポーンさせるかといったことを設定することができます。
この GIF では Spawn Count を 10 に、Spawn Time を1に設定しているのですが、同じサイズのパーティクルが同じ場所にスポーンしているので違いが少し分かりにくいかもしれません…

Loop Count Limit
次は Loop Count Limit です。
ここでは、Loop Behavior が Multiple か Infinite に設定されているときに何回目のループ再生までパーティクルをスポーンさせるかを設定することができます。
この GIF の例では Loop Count Limit を2に設定しているので、3回目以降のループ再生からはパーティクルがスポーンしていません。

Spawn Probability
最後は Spawn Probability です。
ここではパーティクルのスポーン確率を0から1までの値で設定することができます。
例えば 0.7 という値を設定すると 70% の確率でパーティクルがスポーンし、30% の確率でパーティクルがスポーンしなくなります。
Spawn Rate
Spawn Rate
次は Spawn Rate です。
ここでは、1秒間にスポーンさせるパーティクルの数を設定することができます。
この GIF では Spawn Rate が 10 に、

この GIF では Spawn Rate が 5に設定してあります。

また、Spawn Burst Instantaneous と同様に Spawn Probability でパーティクルのスポーン確率を設定することもできます。
この GIF では Spawn Probability を 0.5 に設定してあります。

Particle Spawn
次は Particle Spawn グループの Module を紹介します。
Initialize Particle
まずは Initialize Particle です。
Initialize Particle については公式ドキュメントで以下のように説明されています。
いろいろと書かれていますが、要するにパーティクルの初期設定を行うモジュールです。
Lifetime、Position、Mass、Color などの Point Attributes、Sprite Size、Sprite Rotation などの Sprite Attributes、Mesh Scale などの Mesh Attributes です。このモジュールは、Particle Spawn グループのスタックの一番上に配置されている必要があります。
Particle Spawn グループ
Lifetime Mode
各プロパティを見ていきましょう。
まずは Lifetime Mode です。
Lifetime Mode では、パーティクルの寿命の設定方法を Direct Set にするか、Random にするかを設定できます。
Direct Set の場合はパーティクルの寿命を Lifetime に直接設定しますが、

Random の場合は Lifetime Min(寿命の最小値)と Lifetime Max(寿命の最大値)の間のランダムな値がパーティクルの寿命になります。

Color Mode
次は Color Mode です。
こちらは名前の通り、パーティクルの色を設定することができます。
パーティクルスポーン時の色の設定方法を Unset にすると何も設定できませんが、Direct Set にすると色を直接指定できます。

Random Range にすると Color Minimum と Color Maximum の間のランダムな色になります。

Color Mode を Random Range にすると Color Channel Mode というものが出てきます。
ここで Color Channel Mode を Link RGBA にすると、1つの乱数のみを使用して RGB と透明度の両方の値を決定させることができ、Link RGB / Link A にすると RGB で1つ、透明度で1つの乱数を別々に使用して各値を決定させることができ、Random Individual Channels にすると RGB と透明度の全てのチャンネル(4つ)がそれぞれ別の乱数を使用して各値を決定させることができます。

Color Mode には他にも Random Hue/Saturation/Value というものがあります。

Random Hue/Saturation/Value では Hue(色彩)、Saturation(彩度)、Value(明度)、Alpha(透明度)の最小値と最大値をそれぞれ個別に設定できるようになります。

Position Mode
次は Position Mode です。
パーティクルのスポーン位置の設定方法を Unset にしたり、Direct Set にしたりできます。

他にも Simulation Position というものもあるのですが、これについては調査中です。

Mass Mode
最後は Mass Mode です。
ここではパーティクルの質量の設定方法を「Unset / (Mass of 1)」や、Direct Set、

Random にすることができます。

「Unset / (Mass of 1)」ではパーティクルの質量が1です。
この状態で Point Force などを使うとパーティクルは通常の速さで移動しますが、

この GIF のように質量を Random か Direct Set で大きな値に変更すると移動速度が小さくなります。

Particle Update
次は Particle Update の Module を紹介します。
Particle State
まずは Particle State です。
Particle State については公式ドキュメントで以下のように説明されています。
パーティクルの存続期間が経過したときにシミュレーションからパーティクルをキル (消去) する処理を行います。
Particle Update グループ
Kill Particles When Lifetime Has Elapsed
「Kill Particles When Lifetime Has Elapsed」という項目では、パーティクルが寿命を迎えたときにそのパーティクルを削除するかどうかを設定することができます。
この GIF の例では Loop Behavior が Infinite、Loop Duration が 0.5、パーティクルの Lifetime が 0.5 に設定してあるので、1周 0.5 秒で無限ループしています。
「Kill Particles When Lifetime Has Elapsed」が true のときは 0.5 秒ごとにそのパーティクルが削除されているので、特に変化はありません。

しかし、「Kill Particles When Lifetime Has Elapsed」が false のときはパーティクルが寿命を迎えても削除されずにその場にとどまり続けているので、徐々に明るさが増しています。

Scale Color
次は Scale Color です。
ここでは、色をカーブなどで変化させたり、

透明度も同様に変化させたりできます。

Solve Forces and Velocity
最後は Solve Forces and Velocity です。
Solve Forces and Velocity では、Speed Limit でパーティクルの速さを、Acceleration Limit でパーティクルの加速度の大きさを制限できますが、基本的には Add Velocity などのモジュールと一緒に使用します。
最後に
参考記事
- 🌿UE5 Niagara モジュールリファレンス🌿
- Unreal Engine 5 Niagaraにおける実践的な最適化とスケーラビリティ【CEDEC 2023】
- 「入門」UE5/UEFNナイアガラの基本(Particle Spawn-Initialize Particle-)Part3-1