お世話になっております。
シーケンサーエディタにおいて、スケルタルメッシュをもつアクターのアニメーションを変更したところ、変更後のアニメーションが反映されず、変更前のアニメーションのまま表示されていました。再生位置のカーソルをアニメーションセクションからはずしてから再度アニメーションセクションに重ねると変更後のアニメーションになります。
確認したところ、Animation Mode が Use Animation Blueprint、アニメーションセクションの When Finished が Keep State になっており、Use Custom Mode や Restore State に変更すると、アニメーションが即反映されるようになりました。
この現象はUEの仕様もしくは不具合でしょうか?
改造などで改善できるなら方法をご教示いただけますと幸いです。
以上、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
確認したら、仕様ではなく不具合ですね。
Animation ModeがUse Animation Blueprintの場合、UAnimSequencerInstanceがバインドされません(AnimCustomInstanceHelper.cppのShouldCreateCustomInstancePlayer()がfalseを返すため)。そのためシーケンサーは動的モンタージュを使う経路に入ります。
この経路では、モンタージュのインスタンス ID がセクション単位でキャッシュされます(MovieSceneSkeletalAnimationSystem.h の MontageData)。キーはセクションであり、アニメーションアセットではありません。
そしてAnimMontage.cppのSetSequencerMontagePosition() は、引数のInAnimSequenceを新規生成時にしか使いません。既存のインスタンスが見つかった場合は、アセットを照合せずに再利用し、再生位置とウェイトだけを更新します。これが直接の原因です。
Restore Stateの場合は、セクションを抜けるときにStop()が呼ばれ、インスタンスが破棄されます。そのため次に入ったときに現在のアセットから作り直されます。Keep State にはこの処理がないため、古いインスタンスが残ります。
回避方法としては、アニメーションセクションのForce Custom Modeを有効にしてください。内部で SetAnimationMode(AnimationCustomMode) が呼ばれます。効果はUse Custom Modeと同じですが、影響がそのセクションだけに限定されます。
お手数ですが、よろしくお願いします。
[Attachment Removed]
お世話になっております。
社内の調整に関して、開発チームと相談中です。
ローカルでの改造を検討される場合は、SetSequencerMontagePosition()内でMontageInstanceToUpdateを取得した直後に、既存インスタンスのアセットと引数のInAnimSequenceを比較して、異なる場合は停止して再生成させる方法が考えられます。
if (MontageInstanceToUpdate && MontageInstanceToUpdate->Montage && MontageInstanceToUpdate->Montage->IsDynamicMontage() && MontageInstanceToUpdate->Montage->GetFirstAnimReference() != InAnimSequence)
{
MontageInstanceToUpdate->Stop(FAlphaBlend(0.f), false);
MontageInstanceToUpdate = nullptr; InOutInstanceId = INDEX_NONE;
}
検証済みの公式な修正ではないので、適用される場合はブレンドやNotifyの挙動もあわせてご確認ください。
お手数ですが、よろしくお願いします。
[Attachment Removed]
お世話になっております。
はじめに、ケースが解決済みになっていた件ですが、こちらの操作ミスです。ご迷惑をおかけし、大変申し訳ございませんでした。なお、ケースは最終のやり取りから3日経過すると自動的にクローズされる仕様となっておりますが、クローズ後でも弊社側・御社側のいずれからでもいつでも再オープンできます。追加の情報があればいつでもご連絡ください。
進捗についてご連絡いたします。
いずれも該当箇所のコードに変更はなく、本現象は発生する状態です。SetSequencerMontagePosition()は既存インスタンスが見つかった場合にアセットを照合せずに再利用しますし、MovieSceneSkeletalAnimationSystemのMontageDataもセクション単位のキーのままです。現時点で公式な修正CLはございません。
開発チームには確認を依頼しておりますが、正直なところ、回答までには相応にお時間をいただく見込みです。先日お送りした修正案で解消することは確認済みですので、作業効率への影響を優先される場合は、そのまま適用して進めていただいて問題ありません。公式の修正が入った際は、本ケースに追記いたします。
お手数ですが、よろしくお願いします。
[Attachment Removed]
ご回答ありがとうございます。
回避方法については、影響が設定したセクションに限定されたとしても、ABPの処理が必要なのでForce Custom Modeを有効にすることはできません。
不具合とのことですが、新しいバージョンのUEでもこの不具合は残っているのでしょうか?
もし修正CLなどありましたら、ご教示いただけますと幸いです。
この不具合は作業効率に影響があるので、修正できると助かります。
以上、よろしくお願いいたします。
[Attachment Removed]
ご確認ありがとうございます。
相談中とのこと承知致しました。
いただいた修正で問題が解消されることは確認しました。
影響範囲が大きいので適用するかは検討したいと思います。
ひきつづきよろしくお願いいたします。
[Attachment Removed]
解決済みになってしまいましたが、相談中とのことでしたので何か進展がありましたら追記をお願いしたいです。
[Attachment Removed]