[UE5]シーケンサーでカメラの切り替え時にテクスチャがボケる現象の回避策と注意点

# 概要
UE5でイベントを作る時によく使うシーケンサーですが、遠い場所にあるカメラに切り替えると、一瞬テクスチャがぼけて見えることがあります。
これを回避するために、UEには**プレロール**という機能が用意されています。ただ、このプレロールをカメラカットで使う分にはすんなり設定できるのですが、カメラショットを利用すると上手く動かない場合があります。
私もはまって色々と調べた結果をまとめます。

# プレロールはどんな時に使う？
主に、遠い場所にカメラカットを切り替えたとき、テクスチャストリーミングが間に合わないのを防ぐために使います。
![Promblem.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/61a4cbaf-3405-f074-4e5d-5edcee102f06.gif)
ちょっと分かりにくいですが、この例だと倉庫のカットに切り替わった際、テクスチャがぼけた状態で始まり、一瞬の後に適切な解像度へ変化しているのが確認できます。（倉庫の土台部分を注視すると分かりやすいと思います）
それを避けるため、プレロールを設定することで事前にテクスチャストリーミングの評価を行ない、予め必要な解像度のテクスチャを読み込ませます。

# 検証の事前準備
プレロールが正しく動作しているか評価するには、カメラカット切り替え前にテクスチャが読み込まれていない状態にする必要があります。
しかし、テクスチャストリーミングはストリーミング用のメモリが溢れない限り、読み込んだテクスチャを維持しようとします。その結果、一回カメラカットを切り替えてテクスチャを読み込んでしまうと、同じシーンをすぐに再生してもテクスチャは読み込まれたままなので、一見正しく動いているように見えてしまいます。
それを回避するために、コンソールコマンドで **r.Streaming.DropMips 1** （デフォルトは0）を実行しておくことをお勧めします。
その結果、現在のカメラ位置で必要なテクスチャだけを残して、他はすぐに解放するようになります。これで、今回のカメラカット切り替えにおける、テクスチャストリーミングの問題を正しく確認することができるようになります。

# カメラカットのプレロール
まずは、カメラカットのプレロールの設定方法です。
![Step1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/22ebda20-095b-a6d3-47eb-dece72526f0b.png)
カメラカットのプレビュートラック部分を右クリックして、 **プロパティ＞詳細設定＞Pre Roll Frames** にプレロールの評価をしたいフレーム数を指定します。長すぎても無駄に評価処理が走ってしまいますが、短すぎるとテクスチャの読み込みが間に合いません。（さすがに1フレームとかでは読み込めない）
カット切り替え先で読み込むテクスチャの量にもよりますが、30フレーム（=1秒）ぐらいから調整していくことが多いです。

この設定を行なうと
![Step1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/9e6c3b08-1d30-eeb0-5704-7c1f8d6f51ad.png)
プレビュートラックの前に **＞＞＞＞＞＞** という印が付きます。この印が付いている区間がプレロールを評価している区間になっています。

カメラカットの場合はこれで完了です。作成したシーケンスを再生してもらえれば、カメラが切り替わった直後から正しい解像度のテクスチャが読み込まれていることが確認できると思います。

# カメラショットのプレロール
さて、本題のカメラショットのプレロールの設定方法を紹介します。
結論を先に描いておくと、基本的にはカメラカットの時と同じですが、設定箇所が**3ヶ所**に増えます。

## カメラショットにプレロールを設定
![Step2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/e3c6fe95-ed0e-04ab-51ac-6bb17badde40.png)
まずは、上図のようにレベルシーケンス上のカメラショット（ここでは**shot020_01**）にプレロールを付けます。
最初私は、カメラカットと同じようにこれだけで良いと思っていました…。しかし試してみると、冒頭の動画のように相変わらずぼけた倉庫が一瞬映ります。

## カメラショットのカメラカットにもプレロールを設定
![Step2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/a1bc25f9-06bf-d115-f3ec-25b94f9441f9.png)
カメラショットを開いてみると、中にカメラカットがあります。これにも設定が必要でした。ということで、上図のようにshot020_01のカメラカットにも同じようにプレロールを付けます。
これでいけるだろう！と思ったんですが、まだぼけた倉庫が見えます…。

## カメラショットのカメラカットに「Evaluate in Preroll」を設定
![Step2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/fdedadbd-d73c-a3b1-d00b-bab6449e7b74.png)
最後の設定は、カメラショット（ここではshot020_01）のカメラカットに**Evaluate in Preroll**を付けます。
カメラカットを右クリックして、下の方にあるトラックオプション＞Evaluate in Prerollにチェックを入れます。
Tooltipに書いて有るとおり、このカメラカットは親のレベルシーケンスのサブセクションとして配置されていますので、この設定が必要でした。

# 結果
![Result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431039/9a12abdc-4322-5966-1fc6-3ef34a8e9805.gif)
冒頭の動画と代わり映えしないんですが、こんな感じで倉庫のカットに切り替わっても、ぼけた倉庫は映らなくなります。

# まとめ
カメラカット単体の場合は1箇所で良かったプレロールの設定も、カメラショットになると３ヶ所も必要というのが、結構落とし穴だと思います。
しかも、**r.Streaming.DropMips 1**を設定しておかないと、テクスチャストリーミングのキャッシュの影響で２回目以降の確認時は一見正しく動いているように見えてしまうのも、地味に引っかかる人が多そうです。

シーケンサーに限らず、テクスチャストリーミング絡みのデバッグ（テクスチャの読み込みが間に合っているかどうか）をする際は、必ず**r.Streaming.DropMips 1**を実行することをお勧めします。

ちなみに、この挙動はUE4(4.23だか4.24ぐらい)の頃から変わっていません。できればカメラショットでも1ヶ所の設定で有効になってくれると分かりやすくて良いんですが。

明日の[Unreal Engine (UE) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ue) シリーズ3は、@RyogoNagaoさんによる「何か書きます！多分、ハード関連！」だそうです。
ハード関連って何でしょうね。いつもソフトウェア上だけで扱っていると想像が付かないですが:thinking: