お世話になっております。
初歩的な質問となり恐縮なのですが、シーケンサーのタイムラインを移動したときにジャンプ前のモーションとブレンドを行うにはどうすればいいのでしょうか?
過去には自前でポーズをキャッシュしてブレンドしていたりしたのですが、最新のエンジンではそろそろできるのではと思い質問してみました。シーケンサー内で簡単に実現したりできるのでしょうか?
テストしたサンプルを添付しておきます。
NewLevelSequenceのイベントトラックでBのマーカーにジャンプを行っています。
[Image Removed]
[Image Removed]
このGotoBのタイミングでInertialization(もしくはDeadBlending)を行いたいです。
[Attachment Removed]
お世話になっております。ご質問ありがとうございます。
いえいえ、基本的な質問ではないと思います。結構ハマるところです。
結論ですが、UE5.8 では、まだ組み込みの機能はありません。Set Playback Position は新しい時間でトラックを再評価するだけなので、ポーズはそのまま切り替わってしまいます。いただいたサンプルでは、Anim Blueprint がない SkeletalMeshActor なので、Sequencer が UAnimSequencerInstance をカスタムモードで動かしています。そのため、スロットもイナーシャライゼーションのノードもない状態です。
ブレンドさせるには、出力を Anim Blueprint のスロット経由にする必要があります。
- アクターに Anim Blueprint を割り当てて、Sequencer Animation Override インターフェースを実装します。Allows Cinematic Override は false にして、Get Sequencer Anim Slot Names でスロット名を返します。
- Skeletal Animation セクションは Force Custom Mode をオフのままにして、Slot Name にそのスロットを指定します。
- AnimGraph は Slot -> Dead Blending(または Inertialization)-> Output という構成にします。
- ジャンプと同じフレームでリクエストを出します。
- C++ の場合: UAnimInstance::RequestSlotGroupInertialization() を呼びます。これは Blueprint には公開されていないので、ご注意ください。
- Blueprint だけの場合: Slot と Inertialization の間に、Blend Type を Inertialization にした Blend Poses by Bool を入れて、両方の入力に同じポーズをつなぎます。あとは GotoB から bool を反転させるだけです。少し裏技っぽいですが、ちゃんと動きます。
あと、UE5.8 には実験的機能として Sequencer Anim Mixer プラグインがあって、Inertial Dead Blend Transition というセクションもあります。ただ、これはタイムライン上のセクション間のトランジション用なので、実行時のジャンプには使えません。
もし分かりにくいところがあれば、遠慮なく聞いてください。
[Attachment Removed]
お世話になっております。
しばらく返事がなくて、トラッキングのため、本件をクローズさせていただきます。
いつでも本スレッドにコメントすれば再オープンできるかと思います。
お手数ですが、よろしくお願いします。
[Attachment Removed]
ご返信ありがとうございます。
やはりABP化が必要なんですね。
ABP化を行うとなるとイベント用に配置したアクター全てABP化が必要になり、コストが増えるのでシーケンサーのみで完結するような形を探していました。
もちろんTemplate ABPを使用するのでダミーのABPがどんどん増えるだけなのですが、あまり無駄なものは増やしたくないと思いまして。
最後のポーズのキャッシュ領域としてABPが必要な理由もわかるのですが、シーケンサーのみで完結するような形に今後なることはないのでしょうか?
> Blueprint だけの場合: Slot と Inertialization の間に、Blend Type を Inertialization にした Blend Poses by Bool を入れて、両方の入力に同じポーズをつなぎます。あとは GotoB から bool を反転させるだけです。少し裏技っぽいですが、ちゃんと動きます。
このトリックはなかなかいいですね。ただ、ABPでやる上でもきちんとインターフェイスを整備してもらったほうがアーティストも迷わないかなと思いました。
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
コメントありがとうございます。
本件、再オープンしました。
ABPが増えるのを避けたい、というのはよく分かります。結論としては、現状はやはりABPが必要です。理由は、Sequencer側の UAnimSequencerInstanceはグラフが固定で、ポーズ履歴を持つ場所がないためです。
あとMovieSceneSkeletalAnimationSystem.cpp:506を見ると、ジャンプ時はDeltaTimeを 0 にしているので、そもそも「瞬間移動」として扱う設計になっています。
コストの面ですが、Template ABPは1アセットを全アクターに割り当てる形で済むので、アクターごとに作る必要はありません。増えるのは割り当ての手間だけかと思います。
今後についてですが、UE5.8の実験的機能であるSequencer Anim Mixerは、ABPなしでSequencer内部でデッドブレンディングをやっています(Inertial Dead Blend Transition セクション)。方向性としてはこちらなので、実行時のジャンプに対応が入るとすれば、この仕組みの上だと思います。ただロードマップは確約できないので、現時点の見込みとして受け取ってください。
いただいたご意見、シーケンサーのみで完結できることと、Blend Poses by Boolのようなトリックではなくちゃんとしたインターフェイスを用意すること、この 2 点は社内の関係チームに共有します。
よろしくお願いします。
[Attachment Removed]
お世話になっております。
TemplateABPのみで動作するんですね。
確かに試してみたところ、TemplateABPのみで動作しました。
これならアサインだけですのでコストは低くて済みそうです。
配置したアクターにスケルトンが割り当てられてないABPも使えるのは知りませんでした。
要望の共有もありがとうございます。
Sequencer Anim Mixerも時間ができたら触ってみまね。
ありがとうございました!
[Attachment Removed]