はじめに
Unreal Engine および AX Scene Editor において、レベル(マップとも呼ばれる)とは、オブジェクト、キャラクター、ライト、ジオメトリなどのアセットやアクターの集合体です。これらの要素は通常、仮想スタジオのシーンなど、視覚的な体験を創出するためにレベル内に配置されます。レベルは Unreal Editor または AX Scene Editor で作成され、その要素は Outliner パネルに表示されます。
複数の仮想スタジオシーンを制作中に切り替えたい場合、各シーンのアセットを分離するには複数のレベルを使用します。これにより、単一レベルに全アセットを配置するよりもハードウェア負荷を軽減できます。さらに、他レベルのアセットが表示されないため編集プロセスに干渉せず、個々のレベル設計が容易になります。
以下では、ライブ制作中にレベルを切り替える2つの方法について説明します:
- オープンレベルによるレベル切り替え:この方法は中断やフレーム落ちを引き起こしますが、多数のレベルを扱うAXシーンエディタでの管理が容易で、よりシンプルなブループリントロジックで実現できます。マルチマシン環境では、この方法でもシームレスな遷移が可能です。
- ストリームレベルによるレベル切り替え:シームレスな遷移を実現するにはこの方法が推奨されます。
最後に、マルチマシン環境でのシームレスなレベル切り替えについて解説します。
注記: Unrealは他にも、レベルインスタンス化を用いたワールドパーティションやトランジションマップによるシームレス移動などの手法をサポートしています。ただし、これらはゲーム向けに設計されており、バーチャルプロダクションでの実用性は低いです。
注記: 場合によっては、レベルではなく複数のUnrealプロジェクトで異なるシーンを管理する代替案も有効です。ただし、この手法ではシーン間のスムーズな遷移をサポートせず、マルチマシン環境での特定マシンの切り替えも不可能です。異なるプロジェクトの読み込み時には、Unreal Engineの再読み込みというリソースを大量に消費する処理が発生するため、大幅なフレーム落ちが生じます。
Open Levelを使用したレベル切り替え
簡易的なレベル切り替えには、AX Scene EditorのOpen Levelブループリントノードを使用できます。
Open Levelノードはシームレスな遷移をサポートしないため、コンピューターがレベルを読み込んでいる間はフレームが生成されません。
Open Levelノードは現在のレベルを完全に新しいレベルに置き換えるため、往復切り替えを可能にするには、すべてのブループリントロジックが各レベルに存在する必要があります。したがって、レベルブループリントを使用する代わりに、アクターブループリントクラスを作成することをお勧めします。このアクターブループリントは、各レベルに簡単にドラッグアンドドロップできます。
オープンレベルブループリントの作成
オープンレベルノードを含むブループリントを作成するには、AX Scene Editorのコンテンツブラウザを開き、右クリックしてブループリントクラスオプションを選択します:
親クラスとして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)。
Bind Event to Triggerノードを見つけるには、コンテキスト依存検索をオフにする必要があります。
Get Aximmetry TextをString to Nameノードに接続すると、AX Scene Editorは自動的にテキストデータを文字列に変換するノードを作成します。
上記のノードを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」)。その後、ダブルクリックして開きます:
ウィンドウ > レベルを選択してレベルパネルを開きます:
使用したいレベルをレベルパネルにドラッグアンドドロップします:
目アイコンを使用して、エディターで表示するレベルを選択できます。この表示設定はAX Scene Editor内でのみ有効であり、プロジェクトが実行されていない間のみ適用されます。
Aximmetryメニューからカメラを追加を選択する際は、必ず永続レベルが選択されている必要があります(テキストが青色で表示されます)。永続レベルはダブルクリックで選択できます。
注記: これはAX Scene Editor内の類似操作にも適用されます。レベルパネルで青文字でハイライト表示されているレベルが選択レベルであり、AX Scene Editorのレベル固有操作はそのレベルを対象とします。例えば保存時(CTRL + S)、AX Scene Editorは選択レベルのみを保存します。
注記:サブレベルには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つのトリガーでレベルをロードし、別のトリガーでレベルをアンロードできます:
上記のノードをAX Scene Editorのブループリントエディタにコピー&ペーストするには、このボックスをクリックし、CTRL + Aで全テキストを選択、CTRL + Cでコピーした後、ブループリント内でCTRL + Vを押して貼り付けます。
上記のブループリントは、Aximmetry内のUnreal Projectモジュールに2つのトリガーピンを作成します。これらのピンにより、レベルをロードおよびアンロードできます。
このブループリントを複製し、新しいレベル参照と異なる名前を「Get Aximmetry Trigger」に設定することで、追加レベルのロード/アンロードが可能です。ただし管理するレベルが多い場合は、後述する配列の使用をお勧めします。
注記: トリガーピンは、コントロールボードとピンコレクター特殊コンパウンドを使用することで、簡単にコントロールボードボタンに変換できます。
シームレス遷移ブループリント
レベルをシームレスにロードし遷移させるには、前述の手法よりも複雑なブループリントロジックが必要です。
下図は、2つのトリガー(名前: レベル1ロード、レベル2ロード)を用いた2レベル間の切り替え例です。
- トリガーがレベル切り替えを開始すると、Load Stream Levelノードによりマップのバックグラウンドロードが開始されます。
- ロード完了後、DelayノードがGet Aximmetry Scalar(名前: Load Delay)で指定された追加時間を待機します。この遅延は、レベルロード直後の数秒間はコンピューターがシームレスに表示するためにリソースを大量に消費する可能性があるため必要です。
- 遅延後、2つのSet Should be Visibleノードが前のレベルを非表示にし、次のレベルを表示します。
- Unload Stream Levelノードを起動する前に、動作を滑らかにするため、別のDelayモジュールが使用されます。
- 最後に、Unload Stream Levelノードで前のレベルをアンロードします。
Unload Stream Levelノードの使用は厳密には必須ではありません。Set Should be Visibleノードで前のレベルを非表示にすれば、ほとんどのコンピューティングリソースが解放され、レベルは非表示になるためです。ただし、レベルをアンロードすると、アニメーション状態などの進行状況が失われることに注意してください。
上記のノードをAX Scene Editorのブループリントエディタにコピー&ペーストするには、このボックス, をクリックしてくださいをクリックし、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に設定する必要があります。これは、レベルがロードされていない状態から開始するためです:
上記のノードをAX Scene Editorのブループリントエディタにコピー&ペーストするには、このボックス, をクリックしてください:をクリックし、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モジュールでトリガーできます。