お世話になっております。
UE5.4.2からUE5.6.1にアップデートしたところ
アニメーションステートのOutputAnimationPoseのOnUpdateにバインドしている関数内でSetStateが呼ばれたタイミングでクラッシュするようになってしまいました。
調べてみたところ、どうやら
FAnimNode_StateMachine::Update_AnyThread
for (int32 Index = 0; Index < ActiveTransitionArray.Num(); ++Index)
{
ActiveTransitionArray[Index].Update(Context, CurrentState, /*out*/ FinishedTransitions[Index]);
}
のタイミングでFAnimNode_StateMachine::TransitionToStateが呼ばれてActiveTransitionArrayの数が変わってしまい、
その後の
if (FinishedTransitions[Index])がRangeCheckに引っかかってしまうようです。
過去の投稿で手動でステートマシーンのステートを切り替える方法として上げられていた方法と同じかと思うのですが
UE5.6.1では非推奨の方法となるのでしょうか?
[Image Removed]
また、FinishedTransitionsを使用せず
UE5.4.2のようにbool変数を使用してチェックする方法に戻すことに問題はありますでしょうか?
以上 よろしくお願いいたします。
お世話になっております。
大変使いやすい再現プロジェクトのご提供をありがとうございました。
まず、SetState による手動のステート切り替えは、現在も公式ドキュメントに掲載されている方法で、UE5.6.1で非推奨化されたものではありません。
ご報告いただいたクラッシュは、複数の遷移が同時にアクティブになった場合のウェイト計算ミスを修正した変更(CL37755307, UE-228672)の副作用として発生している模様です。準備が整い次第、開発チームに不具合報告を行います。
> また、FinishedTransitionsを使用せず
> UE5.4.2のようにbool変数を使用してチェックする方法に戻すことに問題はありますでしょうか?
bool 変数によるチェック方式に戻す(=CL37755307をバックアウトする)場合、上述の「複数の遷移が同時にアクティブになった場合のウェイト計算ミス」問題が再発するリスクがありますが、影響は軽微であり、当面のクラッシュ回避策としてお使いいただけると思います。
以上、取り急ぎ回答申し上げます。
よろしくお願いいたします。
お世話になっております。
それではbool変数によるチェック方式に戻して様子を見ようと思います。
ありがとうございました。
ご対応ありがとうございます。
大変遅くなりましたが、社内でバグ報告を行い、Public Issue化の申請も行いました。承認後に下記のURLから修正状況を追跡可能になります。
もしよろしければ、本件はCloseとさせていただき、こちらのPublic Issueで修正状況の追跡をお願いできますと助かります。
以上、よろしくお願いいたします。
バグ起票ありがとうございます。
こちらの不具合ですがいつ頃修正予定なのかは判明していますでしょうか?
また、
複数の遷移が同時にアクティブになった場合のウェイト計算ミス
とはどのような問題があったのでしょうか?
お世話になっております。
回答が遅くなり、申し訳ございません。
> こちらの不具合ですがいつ頃修正予定なのかは判明していますでしょうか?
こちらの不具合につきましては、現在担当者がアサインされた段階であり、具体的な修正スケジュールはまだ確定しておりません。
大変申し訳ございません。
> 複数の遷移が同時にアクティブになった場合のウェイト計算ミス
> とはどのような問題があったのでしょうか?
CL37755307以前のコードでは、ActiveTransitionArrayの要素を順次Update()してアルファ値を更新していく一方で、Update()未呼び出しの要素は古いアルファ値のままであるため、ループの途中でbFinishedTransがtrueになると、「一部のアクティブ遷移アルファは更新済み、ほかは未更新のまま」という状況でウェイトを計算してしまうという問題がありました。その結果、ウェイトの正規化が崩れて総和が1を上回り、ルートモーションの移動量が過大になるなどの症状が報告されております。
[Content removed]
そのためCL37755307では、ループを2段構えとし、第1ループでActiveTransitionArrayを確実にすべてUpdate()して、第2ループでウェイトの計算を行うという手順に変更になっております。このアプローチであれば、すべての遷移アルファが最新値に更新されているため、ウェイトも正しく計算可能です。
もし同様のご懸念がある場合、上記のUDNの報告者の方が書かれているパッチ(Update()のOut値を配列に貯めるのではなく、第2ループではFAnimationActiveTransitionEntry::bActive値がfalseのときにローカルのbFinishedTransをtrueにするという判定式を採用している)を適用するのも一つのワークアラウンドになるかと存じます。
以上、よろしくお願いいたします。
お世話になっております。
詳細ありがとうございます。
弊社タイトルでは今のところ
> ルートモーションの移動量が過大になるなどの症状
のような問題は報告されていないためやはりbool 変数によるチェック方式で様子を見ようと思います。
> こちらの不具合につきましては、現在担当者がアサインされた段階であり、具体的な修正スケジュールはまだ確定しておりません。
承知しました
Public Issueで修正状況の追跡を行おうと思います。
ありがとうございました。
ご確認ありがとうございます。
それでは大変恐縮ですが、Public Issueでの状況追跡をお願いいたします。
本件は回答済みとしてCloseさせていただきます。
またなにか疑問点やご不明点が生じた場合は、追加のコメントをいただくか(自動的に再Openします)、新規案件としてEPSにご投稿ください。
以上、よろしくお願いいたします。