導入
Unreal Engineにおいて、Level(マップとも呼ばれる)は、オブジェクト、キャラクター、ライト、ジオメトリなどのアセットとアクターをまとめた集合体です。これらの要素は通常、レベル内に配置され、バーチャルスタジオのシーンなどの視覚体験を構築します。レベルはUnreal Editorで作成され、レベルの要素はアウトライナーパネルに表示されます。
異なるバーチャルスタジオシーンを複数持ち、制作中にシーンを切り替える際に、一方のシーンがもう一方から見えなくなるようにしたい場合、複数のレベルを使用することで各シーンのアセットを分離できます。このアプローチは、すべてのアセットを単一のレベルに配置する場合に比べてハードウェア負荷を軽減します。さらに、他のレベルのアセットが見えないため、編集プロセスに干渉せず、個々のレベルを設計しやすくなります。
以下では、ライブ制作中にレベルを切り替える2つの方法について説明します:
- レベル切り替え(オープンレベル): この方法は中断やフレームドロップを引き起こしますが、多くのレベルを扱う場合、Unreal Editorでの管理が容易で、シンプルなブループリント論理で済みます。マルチマシン設定を使用する場合でも、シームレスな移行が可能です。
- レベル切り替え(ストリームレベル): この方法はシームレスな移行に推奨されます。
最後に、マルチマシン設定でのシームレスなレベル切り替えについて説明します。
NOTE: Unrealは、ワールドパーティションとレベルインスタンス化、トランジションマップを使用したシームレスな移動など、他の方法もサポートしています。ただし、これらの方法はゲーム向けに設計されており、バーチャルプロダクションでの使用には実用的ではありません。
NOTE: シーンごとに異なるUnrealプロジェクトを使用する方法は、レベルを使用する代わりに有効な代替案となる場合があります。ただし、このアプローチはシーン間のスムーズな移行をサポートせず、マルチマシン設定で特定のマシンを切り替えることもできません。異なるプロジェクトをロードすると、Unreal Engineを再ロードするリソース集約的なタスクにより、フレームレートが大幅に低下します。
レベルスイッチ with Open Level
シンプルなレベル切り替えを行うには、Unreal EngineのOpen Levelブループリントノードを使用できます。
Open Levelノードはシームレスな移行をサポートしないため、コンピュータがレベルをロードしている間はフレームが生成されません。
Open Levelノードは現在のレベルを新しいレベルで完全に置き換えるため、往復切り替えを可能にするためのすべてのブループリントロジックは各レベルに存在する必要があります。したがって、レベルブループリントではなくアクターブループリントクラスを作成することをおすすめします。このアクターブループリントは、各レベルにドラッグアンドドロップで簡単に配置できます。
Open Level Blueprintの作成
Open Levelノードを含むBlueprintを作成するには、UnrealのContent Browserを開き、右クリックしてBlueprint Classオプションを選択します:
親クラスとしてActorを選択します:
作成したファイルに名前を付けます(例:「LevelSwitch」)。その後、ファイルをダブルクリックして開きます:
新しいウィンドウに以下のメッセージが表示された場合、Open Full Blueprint Editorテキストをクリックします:
イベントグラフで右クリックし、以下のノードを追加して接続します:Get Aximmetry Trigger、Get Aximmetry Text、Event BeginPlay、CustomEvent、Bind Event to Trigger、String to Name、およびOpen Level (by name)。
The Context Sensitive検索をオフにしないと、Bind Event to Triggerノードが見つかりません。
Get Aximmetry TextノードをString to Nameノードに接続する際、Unrealは自動的にテキストを文字列に変換するノードを作成します。
上記のノードをUnrealのブループリントエディターにコピーして貼り付けるには、このボックスをクリックし、CTRL + Aを押してすべてのテキストを選択し、CTRL + Cでコピーします。次に、UnrealのブループリントでCTRL + Vを押して貼り付けます。
LevelSwitchブループリントはすべてのレベルに追加する必要があります。これを行うには、各レベルを1つずつ開き、コンテンツドローアからブループリントをビューポートにドラッグします:
各レベルに同じAximmetryカメラが追加されていることを確認してください:
Aximmetryでは、2つの新しいピンが表示されます。トリガーピン(例: Blueprintでは「Switch Level」と名付けられています)はレベルを読み込みを開始し、テキストピン(「Switch Level Name」)は読み込むレベルを指定します:
NOTE: トリガーピンをControl Board ボタンに変換するには、Control BoardとPin Collectorの特殊な複合体を使用します。
レベルパス
レベル名をパスなしで指定できますが、Unrealがプロジェクト内のすべてのファイルを検索するため、ロード時間が長くなります。
これを回避するには、対象のレベルファイルを右クリックし、リファレンスビューアー...を選択します:
リファレンスビューアーで、レベルの参照をここからコピーできます:
この参照をAximmetryのテキストピン(「Switch Level Name」)に貼り付けます。
トランジション中の静止画像
レベル切り替え前に、AximmetryのIf Videoモジュールを使用して静止画像に切り替えることができます:
オペレーターがプレビュー出力でレベルが正しく読み込まれたことを確認したら、元のレベルに戻します。
ただし、この解決策は特定のビデオ出力プロトコルでのみ機能します。レベル読み込み中にAximmetryはフレームをドロップします。その結果、プロトコル、ハードウェア、またはソフトウェアがAximmetryからの最後のフレームを表示せず、接続が切断される可能性があります。
より良い代替方法は、コンピュータがレベルを読み込んでいる間、外部スイッチャーで動画を再生することです。
Unreal Moduleのピン(Aximmetry)
すべてのレベルに同じGet... Aximmetryノードがブループリントに存在しない場合、デフォルトマップ(プロジェクト設定で指定されたレベル)に、他のレベルで使用されるすべてのGet... Aximmetryノードが含まれていることを確認する必要があります。これには、名前パラメーターの一致も含まれます。
これは、Aximmetryがフローエディター内のUnrealモジュールのピンを最初のレベルからポップulateするためです。
最初のレベルにあるこれらのGet... Aximmetryノードは機能する必要はありません。単に最初のレベルに存在している必要があります。
レベルスイッチとストリームレベル
レベルをストリーミングし、レベル間のシームレスな移行を実現するには、レベルは同じPersistent Levelの下に配置する必要があります。このPersistent Levelは親レベルとして機能し、レベル間の編集を容易にします。Persistent Levelの下のレベルはサブレベルまたはストリームレベルと呼ばれ、Load Stream LevelとUnload Stream Levelのブループリントノードで切り替えることができます。
NOTE: Persistent Levelは、Level Switch with Open Levelメソッドと互換性がありません。これはPersistent Level自体をアンロードしてしまうためです。
Persistent Level
Persistent Levelを設定するには、まずLevelを作成します:
NOTE: どのレベルもPersistent Levelとして機能できます。永続化は特定の設定ではなく、使用方法によって実現されます。
注:永続レベルには、すべてのレベルで共有されるアセットを含めることができます。これにより、Aximmetry カメラが永続レベル内で利用されます。
作成したファイルに名前を付けます(例:「MyPersistentLevel」)。その後、ダブルクリックして開きます:
ウィンドウ > レベルを選択してレベルパネルを開きます:
使用したいレベルをレベルパネルにドラッグアンドドロップします:
エディターで表示するレベルは、目アイコンで選択できます。この表示設定は、プロジェクトが実行中でない場合にのみ、Unreal Editor内で適用されます。
Aximmetryメニューからカメラを追加を選択する際は、必ず永続レベルが選択されている必要があります(テキストが青色で表示されます)。永続レベルはダブルクリックで選択できます。
NOTE: これはUnreal Editor内の類似した操作にも適用されます。レベルパネルで青文字でハイライトされているレベルが選択されたレベルであり、Unreal Editorのレベル固有の操作はそのレベルをターゲットにします。例えば、保存(CTRL + S)時には、Unrealは選択されたレベルのみを保存します。
NOTE: サブレベルにはAximmetryカメラを含めないでください。AximmetryカメラはPersistent Levelのみに配置してください。
また、プロジェクトの編集 > プロジェクト設定で、永続レベルをプロジェクトのデフォルトマップに設定することを忘れないでください:
ストリームレベルの読み込みとアンロード
ストリームレベルの読み込みとアンロードは、永続レベルのレベルブループリント内で行う必要があります。
永続レベルのレベルブループリントを開きます:
レベルブループリントが開いたら、レベルパネルからレベルをドラッグアンドドロップしてレベルブループリントに参照できます:
作成したGet Streaming Levelノードは、Load Stream LevelとUnload Stream Level(オブジェクト参照)ノードに、Class /Level StreamingカテゴリにあるGet Levelノードを使用して接続できます。Get Levelノードを探すには、Context Sensitive検索をオフにします。類似した名前のノードが複数存在するため、正しいノードを選択してください。
Get Aximmetry Triggerを使用してレベルをロード/アンロードします。例えば、1つのトリガーでレベルをロードし、別のトリガーでレベルをアンロードできます:
上記のノードをUnrealのブループリントエディターにコピーして貼り付けるには、このボックスをクリックし、CTRL + Aで全テキストを選択し、CTRL + Cでコピーし、UnrealブループリントでCTRL + Vで貼り付けます。
上記のブループリントは、AximmetryのUnrealモジュールに2つのトリガーピンを作成します。これらのピンを使用して、レベルをロードおよびアンロードできます。
このブループリントを新しいレベル参照と異なる名前で複製し、追加のレベルをロードまたはアンロードするための「Get Aximmetry Trigger」に異なる名前を付けることで、複数のレベルを管理できます。ただし、管理するレベルが多い場合は、このページの後で説明する配列を使用することをおすすめします。
NOTE: トリガーピンをコントロールボードボタンに変換するには、コントロールボードとピンコレクターの特殊な複合体を使用します。
シームレスな移行ブループリント
レベルをシームレスにロードして移行するには、上記で説明した方法よりも複雑なブループリント論理が必要です。
以下の図は、2つのトリガー(名前: Load Level 1 と Load Level 2)を使用して2つのレベルを切り替える例です。
- トリガーがレベル切り替えを起動すると、Load Stream Levelノードを使用してマップがバックグラウンドでロードを開始します。
- 読み込みが完了すると、Get Aximmetry Scalar(名前:Load Delay)で指定された追加の時間待機するDelayノードが動作します。この遅延は、レベル読み込み直後の数秒間はコンピュータがスムーズに表示するためにリソースを消費するため必要です。
- 遅延後、2つのSet Should be Visibleノードが前のレベルを非表示にし、次のレベルを表示します。
- Unload Stream Levelノードを開始する前に、スムーズな動作を確保するために別のDelayモジュールが使用されます。
- 最後に、Unload Stream Levelノードを使用して以前のレベルがアンロードされます。
Unload Stream Levelノードを使用する必要はありません。Set Should be Visibleノードで以前のレベルを非表示にすることで、ほとんどの計算リソースが解放され、レベルが非表示になります。ただし、レベルをアンロードすると、アニメーション状態などの進行状況が失われる点に注意してください。
上記のノードをUnrealのブループリントエディターにコピーアンドペーストするには、このボックスをクリックし、CTRL + Aで全テキストを選択し、CTRL + Cでコピーします。次に、UnrealのブループリントでCTRL + Vで貼り付けます。
NOTE: ブループリントに小さな時計アイコンが付いたノードは非同期であり、その後に続く実行は同じフレームではなく、ノードで指定された時間後に実行されます:
上記のブループリントは、レンダリングされた画像を瞬時に別のレベルに切り替えます。Unrealでトランジション効果を追加するには、両方のレベルを一定期間表示させたままにする必要があります。
マルチマシン設定では、外部スイッチャーを使用してトランジション効果を作成できます。詳細については、マルチマシンでのレベル切り替えのセクションを参照してください。
注:パーシステントレベルとストリームレベル読み込みの詳細については、Unrealのドキュメント複数のレベルの管理を参照してください。
2つ以上のレベル間の切り替え
上記の解決策は、2つ以上のレベルを切り替える場合複雑になります。これを簡略化するために、配列を使用することができます。以下の例では、3 つのレベルが配列に追加されています。Get Aximmetry Integer (名前: Level to Load) を使用して、Aximmetry で切り替えるレベルを指定することができます。配列には、3 つだけでなく、任意の数のレベルを含めることができます。
さらに、変数を使用して、以前にロードされたレベルを追跡し、レベル切り替えロジックがすでに実行されている場合にその実行を回避します。Previous Level変数のDefault Valueは-1に設定する必要があります。これは、レベルがロードされていない状態から開始するためです:
上記のノードをUnrealのBlueprintエディターにコピーして貼り付けるには、このボックスをクリックし、CTRL + Aで全テキストを選択、CTRL + Cでコピーし、UnrealのBlueprintでCTRL + Vで貼り付けます。
ストリーミング方法
上記の例では、すべてのレベルをBlueprintストリーミングメソッドに設定することが非常に重要です。そうでないと、レベルは常に読み込まれ、アンロードできなくなります。
ただし、Set Should be Visibleノードでレベルの見え方を変更してレベルを切り替える場合、レベルをAlways Loadedに設定できます。この場合、Unrealプロジェクトを開始後にレベルにLoad Stream Levelノードを使用する必要はありません。
マルチマシンでのレベル切り替え
ARやグリーンプロダクションのマルチマシン構成では、各マシンが異なるカメラ角度をレンダリングできます。この構成により、現在視聴者に表示されていないカメラのレベルを切り替えることができます。その後、他のマシンのカメラが視聴者に表示されなくなった時点で、それらのマシンのレベルを切り替えることができます。
これにより、レベル間のシームレスなトランジション効果が実現し、結果的にカメラ間でもスムーズな切り替えが可能です。この目的にはStream Levelは必要ありません。Open Levelノードを使用してレベルを変更するだけで十分です。トランジション効果は、外部スイッチャーデバイスまたはAximmetryバージョン2024.3.0以降で利用可能な[Common_Studio]:Compounds\Switcher\Video_Switcher.xcompコンパウンドを使用して管理できます。
NOTE: LED Wallの制作では、通常は異なるLEDウォールをレンダリングするためにマルチマシン構成を使用し、異なるカメラ角度を表現しません。ただし、Aximmetryバージョン2024.3.0以降では、LED Wallカメラコンパウンドにより、カメラを異なるマシンで処理できるようになりました。したがって、この方法はバージョン2024.3.0以降のLED Wall制作にも適用されます。LED Wallは追加の複雑さを伴う点に注意してください。LED Wallに送信されるビデオ出力を切り替える必要もあります。
例
CAM 1が現在視聴者が見ているカメラであり、Remote Engine #1に割り当てられているとします。その場合、Remote Engine #1を除くすべてのマシンでレベルを変更する必要があります。その後、カメラがCAM 1から切り替わった後に、初めてRemote Engine #1のレベルを変更してください。
以下の手順とフローエディター論理を使用して実現できます:
- スイッチャーで観客が現在表示しているリモートエンジン(CAM)を特定します。
- 以下の図のCopy Integerモジュールでこのリモートエンジンを指定します。
- Copy Triggerでレベル切り替えをトリガーします。
- スタジオオペレーターが別のCAM(Remote Engine)に切り替えるまで待ちます。
- 最後に、Copy Trigger 2を使用して、ステップ2で指定されたCAMのレベルを切り替えます。
要約:
- Copy Integerノードは、視聴者が見るリモートマシンを決定します。
- Copy Triggerノードは、Copy Integerで定義されたマシンを除くすべてのリモートマシンのレベルを変更します。
- Copy Trigger 2は、Copy Integerで定義されたマシンでのみレベルを変更します。
Copy IntegerとCopy TriggersをパラメーターとボタンとしてControl Boardに追加するには、Pin Collectorを使用できます。または、スタジオオペレーターが使用している他の制御方法に割り当てることも可能です。
さらに、プレビューにオーバーレイを追加して、レベル切り替えが進行中であることをスタジオオペレーターに警告し、この期間中にカメラを切り替えないよう促すことができます。このオーバーレイは、上記の画像にあるIfモジュールでトリガーできます。