MovieRenderQueue使用時に字幕やらウォーターマークを出す

# はじめに

これは、「[Unreal Engine (UE) Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ue)」その4の10日目の記事になります。

さて。

# 字幕を出す

## ムービー書き出しで字幕を出す

Unreal Engineのムービー書き出しで字幕を出そうと思えば、UMGで文字を書いておいて表示させておく、という方法で出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/9b3dbe7a-a784-4457-2256-f86186bd29e6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/1f772769-46d3-d92f-391b-97628c881d64.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/7c106df4-6920-9786-5178-32cb6c07af63.png)

（OnCreateでは出なかったので、イベントで出す）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/bac82afb-3422-3df5-26c6-77303d070ccf.png)

字幕を表示させる時はこんな指定。
これで、 **ムービーシーンのキャプチャ（レガシー）** では問題なく字幕が出ます。

## Movie Render Queue

MRQでもやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/a7f1e3d9-1280-6573-2200-0eaa530930d0.png)

こーゆー設定で書き出すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/a1bf195c-b5fb-6f24-fe19-c9c2c32453fa.png)

こーゆーブサイクな結果に。

![NewLevelSequence.0048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/94ee7916-ce86-2804-ed92-10998630bb64.png)

なんと、出力に字幕は出てません。
おーまいがー。

## UIレンダラ

どうやらWidgetで表示しているものをMRQの動画内に含めるにはもうひと手間、 **UIレンダラ** の設定を入れる必要が。
先の設定だと、とりあえず追加するだけ。こう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/faca1d13-9a9a-c17e-cc8c-6747e88e9df7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/794b183d-defc-cda6-6b91-102f22072a1a.png)

変わらずブサイクに出てる！？

![NewLevelSequence.0030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/2ed7c842-63b2-a28e-8e42-5e869b7a4a50.png)

でも動画にも出てる！

これであとはイベントとかでWidget内の情報を書き換えれば字幕の変更とかもおっけー。

# ウォーターマーク

基本、 **ムービーシーンのキャプチャ（レガシー）** は想定外で。
MRQの出力に、UMG以外でウォーターマークを入れてみます。

## バーンイン

バーンインは時間やフレーム数など、編集に必要な情報を含める…んだと思います。
（正直、そこまで必要に迫られたことがないので…）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/ff99ef8a-9074-c2ec-79c5-02232b879a0d.png)

**レガシー** でバーンインを行ったのが上記。
上下に何やら文字が出ています。
MRQだと、それも設定項目の一つになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/052d85c0-5127-8c07-851f-bed805e9ad58.png)

設定を見ると、 **ウィジェット設定** の **Burn in Class** でWidgetの指定ができるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/e86b4bef-e6d8-14e8-feab-f05c46c758ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/f444b23d-f1b6-1001-21cb-4701f65b13e6.png)

そこで、こういうWidgetを作って。
ポイントとしては、親クラスを `MoviePipelineBurnInWidget` にすること。
すると、MRQのバーンインの設定でWidgetを選ぶことができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/2350bcfd-daed-050f-a9b8-167f46fd4bcf.png)
![NewLevelSequence.0048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59270/fe394ab8-3708-a1f3-391a-d32617c62405.png)

ウォーターマークになりました！
しかも、オンオフは設定画面中の黄色いスイッチでできます。
便利ですね。

ただこれ、バーンイン用の設定なので、Widget表示をシーケンスのイベントなどでオンオフしたり、文字を変えたりとかのインタラクティブなことができません。
`MoviePipelineBurnInWidget` のメソッドでバーンイン用の経過時間とか、フレーム数とかは入手して書き換えなどはできます。
（凝ったことをやってやればできますが…）

# 最後に

## 感謝

実はWidgetで字幕を入れるというのはForumの「[シーケンサーで字幕を入れたい](https://forums.unrealengine.com/t/topic/373350)」が元ネタです。
**とっっっっっても** 助かりました。（五体投地）

## 感激

書いているときに見かけたのですが。
@suramaru517様の[Unreal Engine (UE) Advent Calendar 2023 シリーズ1の5日目「【UE5】ウィジェットを画像として出力する（プラグイン配布あり）」](https://qiita.com/suramaru517/items/08c56ffea101f65cd0c0)は、上記MRQの設定を使うとpngで連番出力されるので、シーケンサーとBPと設定だけで同じようなことができてしまいます…。
ソースを読むと、内部で同じことをやっているのがわかります。

ただ、フォントが少し小さくなるんですよねぇ。
なので、そこら辺を考えると、@suramaru517様のアプローチは正解なのだと…。

## プラグインソース

そこでそのソースですが、Visual Studioに持って行った時の
`\Engine\UE5\Plugins\MovieScene\MovieRenderPipeline\Source\MovieRenderPipelineSettings`
にあり、それぞれ下記がソースになります。

### UI レンダラ

`\Public\MoviePipelineWidgetRenderSetting.h`
`\Private\MoviePipelineWidgetRenderSetting.cpp`

### バーンイン

`\Public\MoviePipelineBurnInSetting.h`
`\Private\MoviePipelineBurnInSetting.cpp`

## 残念なこと

この記事を作る際に、ウォーターマークのところを使ってWidgetをレイヤーっぽく複数表示できないか、と画策してみました。
（ロゴマークとウォーターマークという感じで）

上記バーンインのクラスを継承させて複数持てないか、と思ったのですが…。
コンストラクタがprivateなので継承は無理、っぽく。
ソースを丸々持ってきて複製するほうが楽そうなので諦めました。