LevelSequenceの途中で世界全体がスローになる表現をしたい

要求仕様:

  • LevelSequenceのどこからスローにしても、必ずLevelSequenceの全体時間が同じ時間になるようにしたいです。
    • プロジェクトでは可変フレームレートを採用しているので、スローを指定したフレームからのサブフレーム時間まで計算します。
    • 1フレーム未満であっても長くなったり短くなったりするのは不可という前提があります。
  • C++上から、MovieSceneにCustomしたClockSourceを設定したい。
    • LevelSequence一つずつにClockSource > Customを設定することは、IMovieSceneCustomClockSourceアクターを配置する手間があるので避けたい。

5.6.1以前の実装方法:

  1. C++上でULevelSequencePlayer::CreateLevelSequencePlayer()でLevelSequenceActor/Playerを作成
  2. LevelSequenceActorからMovieSceneを参照して、UMovieScene::SetClockSource()でIMovieSceneCustomClockSourceを渡す
  3. IMovieSceneCustomClockSourceの実装で、サブフレーム時間を含めた計算を行っていました。

5.6.1で起きた問題:

  • UMovieScene::SetClockSource(UObject*)が非推奨になり、UMovieScene::SetCustomClock()に実装を変更しました。
  • ULevelSequencePlayer::CreateLevelSequencePlayer()の中でMovieSceneがCustomTimeControllerを作成されているようで、後からSetCustomClock()を呼んでも反映されません。(CustomTimeControllerのInterfacePtrが無効なままになる)

下記の情報についてご存知でしたら教えていただけますと大変助かります。

  • ULevelSequencePlayer::CreateLevelSequencePlayer()の後で、UMovieScene::SetCustomClock()を反映する方法はありますでしょうか?
  • ↑が無理な場合、レベルにIMovieSceneCustomClockSourceアクターを配置する方法以外で、LevelSequenceのタイマーを制御する方法はありますでしょうか?

お世話になっております。

ご指摘のとおり、​CreateLevelSequencePlayer()を行った後で、UMovieScene側でカスタムクロックを設定しても、既成のプレイヤーに反映させることはできません。

この場合、UMovieSceneSequencePlayer::SetTimeController()を通じて、要件を満たせる自前のカスタムTimerController​実装を直接プレイヤーに差し込むというアプローチが有効と思われます。

弊社の内製プロジェクトでも、(スローモーションの要件ではありませんが)ランタイムでカスタムクロックを用いたタイミング調整が必要な際に、カスタムクロックそのものではなく、カスタムのTimeControllerのほうを用いてこれを実装した例があったようです。​UMovieScene::SetCustomClock()はアセットの変更につながる側面もあるため、TimeControllerを用いたやり方のほうが勧められているという事情もあります。

一度ご確認いただけますと幸いです。​

以上、よろしくお願いいたします。​

お世話になっております。

ご提案頂いた方法にて検証をした結果、無事にCustomClockの関数が呼ばれました!

ですので本件についてはクローズしていただいて問題ありません。

手厚いサポート、いつも助かっております。ありがとうございました!

お世話になっております。

ご返答ありがとうございます!​

上記内容での実装を検証してみます!

お世話になっております。

回答内容で実装をご検証いただけるとのこと、ありがとうございます。

お忙しいところ誠に恐縮ですが、その後、ご検証のほうはいかがでしたでしょうか?

以上、よろしくお願いいたします。

お世話になっております。

現在検証を進めている段階ですので、検証が一段落しましたら、検証結果についてこちらに記載させていただきます!

以上、よろしくお願いいたします。

ご多用のところご返信ありがとうございます!

それでは、本チケットは一旦「保留(Pending)」ステータスに切り替えて保持させていただこうと思います。

※Pendingでは一定期間が経過しますと自動的にCloseしてしまいますが、その際に通知メールが届くはずですので、すぐになにかコメントを入れていただければ再Openいたします。

以上、よろしくお願いいたします。

お世話になっております。

無事問題が解決したと聞き、安心いたしました。

それでは本件は解決済みとしてCloseさせていただきます。

また何かありましたらお気軽にEPSをご活用ください。