ポーズ中にカメラを動かす方法を書いていきます。
いわゆるフォトモードの実装とかの参考になればと思います。
ポーズ中にアクターを動作させる
まずはポーズ中に動かしたいアクターの設定をしていきます。
今回はカメラのみ動作させる想定なのでカメラアクターの設定を変更します。
※ Spring Arm などのコンポーネントで動かしている場合はコンポーネントの設定を変更します。
各アクターは bTickEvenWhenPaused というプロパティを持っており、このプロパティが true の時にポーズ中も Tick が動作するようになります。
"Class Default" もしくは BP/C++ から変更可能です。
また、Input ノードもデフォルトの設定だとポーズ中は動作しなくなるため、ポーズ中に必要な Inputノード の Execute when Paused を有効にします。
また、Pause 中かどうかは以下のノード / コードで取得可能なので独自のフローで判定して動作させることも可能です。
UWorld* world = GetWorld(); world->IsPaused();
カメラ映像を動作させる
上記の方法でカメラの座標を更新してもカメラの映像はポーズしたままです。
カメラ自体の更新は LevelTick.cpp の “PlayerController->UpdateCameraManager” で更新されているのでここを動作させる必要があります。
PlayerController の “Class Default” から “Should Perform Full Tick when Paused” を有効にすることでポーズ中も UpdateCameraManager にまで処理が通るようになり、カメラが更新されるようになります。
他のアクターなどで UpdateCameraManager を呼ぶことでも可能です。
これでカメラがポーズ中も動作するようになりましたが、アンチエイリアスやモーションブラーなどでキレイに描画されません。
ポーズ中のカメラに不要なエフェクト効果を無効にするにはワールドの bIsCameraMoveableWhenPaused フラグを有効にする必要があります。
if (WorldContextObject) { WorldContextObject->GetWorld()->bIsCameraMoveableWhenPaused = true; }
以上です。
サンプルプロジェクトをアップしているのでこちらも参考にしていただけたら幸いです。
UE Version : 5.0.0-19044958