このページでは、Unreal Engine と Unreal Editor for Fortnite (UEFN) の両方に登場する機能について説明しています。
このページは元々 Unreal Engine 用に作成されたものなので、一部の説明やスクリーンショットは UEFN で表示されるものとは異なっている場合があります。
UEFN のメインドキュメントに戻るには、こちら をクリックしてください。
Niagara の設計概念
Unreal Engine の視覚効果が見直された理由
Unreal Engine のユーザーベースは拡大しています。現在 Unreal Engine はゲーム業界を超えて、以下のような数多くの産業で利用されています。
- アーキテクチャ ビジュアライゼーション
- 自動車設計などのインダストリアル デザイン
- 仮想的なテレビと映画の制作
Unreal Engine のユーザーはかつてないほど多様化し、デザインを学ぶ学生から、インディー デベロッパー、そして大規模なスタジオのプロのチームに及びます。Unreal Engine が進化すると、Epic のデベロッパー達はもやはエキスパートではなくなります。私達は、すべての産業における、すべてのユーザーの役に立つビジュアル エフェクト (VFX) システムを作ることを目指しました。
新しい VFX システムが掲げる目標
すべてのユーザーが、必要とするエフェクトをフレキシブルに作成することができる新しいシステムを作成したいと考えた私達は、以下を新しい VFX システムの目標にしました。
- アーティストが自由自在に制御できる。
- 軸ごとにプログラミングとカスタマイズができる。
- デバッグ、ビジュアル化、パフォーマンスのより良いツールを提供する。
- Unreal Engine の他の部分、または外部ソースからのデータをサポートする。
- ユーザーの邪魔にならない、控えめなシステムである。
目標に対する Niagara の成果
データの共有
総合的なユーザー制御はデータへのアクセスから始まります。ユーザーが Unreal Engine のすべての部分、そして他のアプリケーションからも自由にデータを使用可能にするために、すべてをユーザーに公開することにしました。
パーティクルのペイロード
このすべてのデータをユーザーに公開するには、データの使用方法を構築する必要があります。名前空間は階層データにコンテナを提供します。たとえば、Emitter.Age はエミッタ用のデータを、また Particle.Position はパーティクル用のデータを含みます。パラメータ マップはパーティクルの属性のすべてを運ぶパーティクル ペイロードです。この結果、すべてがオプションとなりました。
様々なデータ タイプの追加を可能にする
どんな種類のデータでもパーティクル パラメータとして追加できます。複雑な構造体を追加したり、マトリクスやBoolean フラグを変形できます。それだけでなく、他のデータ タイプも追加して、エフェクトのシミュレーションで使用できます。
グラフ パラダイムとスタック パラダイムを結合する
スタック パラダイム (Cascade で使用されるような) とグラフ パラダイム (ブループリントで使用されるような) はそれぞれ長所があります。スタック パラダイムはユーザーに対してモジュラーの挙動を分かりやすく提供します。グラフ パラダイムでは、ユーザーは挙動をより自由に制御することができます。この 2 つのパラダイムの長所を結合して新しいエフェクト システムが誕生しました。
Niagara のハイブリッド構造体の階層
モジュール
モジュールはグラフ パラダイムにおいて機能します。視覚的なノード グラフを使用して、スクリプト エディタの中で HLSL でモジュールを作成できます。モジュールは一般的なデータと対話し、動作をカプセル化し、まとめてスタックします。
エミッタ
エミッタはスタック パラダイムで機能します。モジュールのコンテナとして動作し、まとめてスタックして様々なエフェクトを作成できます。エミッタの用途は単一ですが、再利用ができます。パラメータはモジュールからエミッタ レベルへ送られますが、エミッタでモジュールとパラメータを変更できます。
システム
エミッタと同様に、システムはスタック パラダイムで機能します。また、システム内のエミッタの挙動を制御するために使用するシーケンサー タイムラインとも機能します。システムはエミッタ用のコンテナです。システムはこれらのエミッタを 1 つのエフェクトにまとめます。Niagara エディタでシステムを編集する場合、システム内にあるすべてのパラメータ、モジュール、エミッタの変更およびオーバーライドができます。
Niagara におけるスタック選択およびスタック グループ
Niagara でのパーティクル シミュレーションは概念的にはスタックとして機能します。シミュレーションは上流から下流方向にモジュールを順番に実行して行われます。各モジュールは、モジュールの実行時を説明するグループに割り当てられます。たとえば、パーティクルを初期化するモジュールやパーティクルのスポーン時に動作するモジュールは Particle Spawn モジュールに割り当てられます。
各グループ内には、複数のステージがある場合があり、それらはシステムのライフサイクルの特定のポイントで呼ばれます。エミッタ、システム、パーティクルにはすべてデフォルトで Spawn ステージと Update ステージがあります。Spawn ステージはグループが存在する最初のフレームで呼び出されます。例えば、システムは、システムがレベルで最初にインスタンス化されアクティベートされる時に、Spawn ステージを呼び出します。パーティクルは、エミッタがパーティクルを放出すると Spawn ステージを呼び出し、作成された新しいパーティクルそれぞれに対して Spawn 命令が実行されます。Update ステージはシステム、エミッタ、パーティクルがアクティブなフレームで呼び出されます。
さらに、Event、Simulation Stage などの詳細なステージもあります。これらは Spawn と Update フローに追加することができます。Event は、パーティクルが新しいイベントを生成し、エミッタがそのイベントを処理する設定にすると呼び出されます。可能な場合は、イベント ハンドラ ステージが同一フレームで発生します。ただし、元になるイベントの後です。Simulation Stage は高度な GPU 機能です。この機能は、複数の Spawn ステージおよび Update ステージを順番に発生させることができます。流体シミュレーションなど複雑な構造体の作成に便利です。
モジュールはアイテムですが、アイテムはモジュールではありません。「モジュール」はユーザーが作成することができる編集可能なアセットです。「アイテム」はユーザーが作成することはできないシステムまたはエミッタの一部を指します。アイテムの例は、システム プロパティ、エミッタ プロパティ、レンダラです。
ステージ、グループ、名前空間、データのカプセル化
各モジュールをグループ (システム、エミッタ、パーティクル) のステージ (Update、Spawn、Event、Simulation) に割り当てることで、「いつ」モジュールを実行するのかだけでなく、モジュールが「どのデータ」と機能するのかも制御できます。Stack Group は、そのグループのモジュールの読み込み元/書き込み先となるデータを定義する Namespace と紐づいています。
たとえば、System Group で実行するモジュールは System Namespace のパラメータに対しては読み書きが可能ですが、Engine Namespace または User Namespace に属するパラメータに対しては読み込みのみ可能です。実行は System Group から Emitter Group に対して行われるので、Emitter Group で実行するモジュールは Emitter Namespace のパラメータに対しては読み書きが可能ですが、System Namespace または Engine Namespace のパラメータに対しては読み込みのみ可能です。Particle Group のモジュールは、System Namespace と Emitter Namespace のパラメータの読み込みのみ可能です。
Emitter Group のモジュールは、System Namespace のパラメータからの読み取りが可能な場合があるので、すべてのエミッタに関連するシミュレーションを System Group のモジュールで 1 回だけ実行できます。そして (System Namespace に格納されている) 結果を個々のエミッタの Emitter Group モジュールで読み込むことができます。System Namespace と Emitter Namespace のパラメータの読み込みが可能な Particles Group モジュールで継続します。、これらの関係性を簡単に説明した以下の表を参照してください。
モジュール グループ | Namespace からの読み込み | Namespace への書き込み |
---|---|---|
System | System, Engine, User | System |
Emitter | System, Emitter, Engine, User | Emitter |
Particle | System, Emitter, Particle, Engine, User | Particle |