カメラごとの独立したレンダリング
既定では、1 つの LCC Actor のレンダリングモード(RenderMode)と読み込みモード(LoadMode)はすべてのビューで共通である。特定のプレイヤーや特定の SceneCapture に対してこれらの設定を個別に上書きできる。たとえば分割画面でプレイヤー 1 には 3DGS を、プレイヤー 2 には点群を見せたり、ミニマップ用の SceneCapture に点群の俯瞰を使って主体だけを読み込みコストを下げたりできる。
LCC1 と LCC2 のどちらのパイプラインもこのインターフェース群に対応する。インターフェースのシグネチャは ULCCComponentBase - Multi-Viewport を参照する。
実行時にのみ呼び出せる
この関数群の引数は実行時のオブジェクト(APlayerController / USceneCaptureComponent2D)であり、エディターでの配置の段階ではまだ存在しない。そのためパネルのプロパティではなく、ゲームの実行時に Blueprint または C++ から呼び出すしかない。パネル上の RenderMode / LoadMode はすべてのビューに効くグローバルの既定値であり、このインターフェース群はそのグローバル値の上に行う局所的な上書きである。上書き関数を呼ばないビューは引き続きグローバルの設定を使う。
説明:この機能は「ビューの識別」でカメラを区別する。プレイヤービューはレンダリングビューの一意の ID を使い、SceneCapture はその RenderTarget のインデックスを使う。したがって(Pawn ではなく)
PlayerControllerを渡す必要がある。Pawn は「どのビューポートに表示されているか」の情報を持たないからである。
プレイヤーごとの上書き(分割画面 / 複数のローカルプレイヤー)
// プレイヤー 2 のビューポートを点群で表示する。他のビューポートには影響しない
LCCComponent->SetPlayerRenderMode(Player2Controller, ERenderMode::PointCloud);
LCCComponent->SetPlayerLoadMode(Player2Controller, ELoadMode::OnlyMain);
Blueprint のテキスト表現:
[Custom Event: SetupSplitScreen]
│
▼
[Get Player Controller] Player Index = 1 → Player2Controller
│
▼
[Set Player Render Mode]
Target = (LCC Component)
Player Controller = Player2Controller
In Render Mode = Point Cloud
設定は次のフレームで反映される。上書き関数を呼ばない場合、すべてのビューポートがパネル上のグローバル設定を共有する。
SceneCapture ごとの上書き(ミニマップ / 監視画面)
// ミニマップは点群 + 主体のみで、コストを最小にする
LCCComponent->SetSceneCaptureRenderMode(MinimapCapture, ERenderMode::PointCloud);
LCCComponent->SetSceneCaptureLoadMode(MinimapCapture, ELoadMode::OnlyMain);

メインビューポートは 3DGS、左上の SceneCapture ミニマップは点群の俯瞰
前提:SceneCapture で LCC の内容をレンダリングするには、先にプロジェクト設定で SceneCaptureComponent Support を有効にする必要がある。この項目は既定でオフになっている。
呼び出すタイミングに注意する(よくある落とし穴)
SceneCapture の上書きは有効なビュー ID を算出できるときにのみ反映される。このとき capture がまだ一度もレンダリングされていないと ID を取得できず、設定は黙って破棄される(エラーは出ない)。そこで次の 2 つのいずれかの方法でタイミングを正しくする。
- 先に 1 回キャプチャし、次に設定し、もう一度キャプチャする:
Capture Scene→SetSceneCaptureRenderMode/LoadMode→Capture Scene。 - または SceneCapture2D に
Capture Every Frameをチェックする。ViewState が常駐するので設定がそのまま反映される。
あわせて SceneCapture2D の Texture Target が割り当て済みであることを確認する。BeginPlay のような早すぎるタイミングでは、1 フレーム遅らせてから呼ぶとよい。
よくある誤り 1:
Capture Sceneの前にSetSceneCapture...を呼び、かつ capture にCapture Every Frameをチェックしていない → 設定が失われ、画面が変化しない。よくある誤り 2:
Targetを SceneCapture2D につないでしまう。正しいつなぎ方は Target = キャプチャ対象の LCC コンポーネントで、SceneCapture2D はIn Capture 2Dの引数に入れる。