■不具合
StateTreeのRun Parallel Treeタスクを使用している際に、特定の条件下でStateTreeアセットが意図せず「Dirty(要保存)」状態になる問題を発見しました。
タスクのパラメータとして構造体(Struct)を渡しているStateTreeアセットは、その構造体とは全く無関係の別の構造体を編集(変数の追加・削除など)するだけでStateTreeのDirtyフラグが立ってしまいます。
この挙動により、無関係なアセットの変更が意図せず他のアセットに影響を与え、不要な保存を頻繁に促されるため、開発ワークフローに支障をきたしています。
■再現手順
任意のプロジェクト(サードパーソンテンプレートなど)を開きます。
1.ST_StateTreeParam という名前の構造体を作成します。
2.ST_OtherParam という名前の、ST_StateTreeParamとは無関係の構造体を別途作成します。
3.StateTree_Sub という名前のStateTreeアセットを作成します。
4.StateTree_Subを開き、「AssetDetails」タブの「Parameters」に、ST_StateTreeParam型の変数をパラメータとして追加します。
5.StateTreeアセット StateTree_Main を作成します。
6.StateTree_Main を開き、RunParallelTree タスクを配置します。
7.RunParallelTree タスクの詳細パネルで、StateTree に StateTree_Sub を設定します。
8.一度すべてのアセットを保存し、コンテンツブラウザ上でアセット名の横に * がない(Dirtyでない)ことを確認します。
9.ここで、全く無関係の ST_OtherParam を開き、変数を追加・削除するなどして編集し、コンパイル・保存します。
10.コンテンツブラウザを確認すると、StateTree_Main/StateTree_Sub アセットに * が付き、Dirty状態になっていることが確認できます。
■期待される動作
ST_OtherParamのようなStateTreeに直接参照されていない無関係なアセットを編集してもStateTree_Main/StateTree_SubのDirtyフラグは立たない事が期待される動作です。
もしこの問題が既知のものである場合、または、この挙動を回避する方法がありましたらご教示願います。
よろしくお願いします。
再現手順
■再現手順
任意のプロジェクト(サードパーソンテンプレートなど)を開きます。
1.ST_StateTreeParam という名前の構造体を作成します。
2.ST_OtherParam という名前の、ST_StateTreeParamとは無関係の構造体を別途作成します。
3.StateTree_Sub という名前のStateTreeアセットを作成します。
4.StateTree_Subを開き、「AssetDetails」タブの「Parameters」に、ST_StateTreeParam型の変数をパラメータとして追加します。
5.StateTreeアセット StateTree_Main を作成します。
6.StateTree_Main を開き、RunParallelTree タスクを配置します。
7.RunParallelTree タスクの詳細パネルで、StateTree に StateTree_Sub を設定します。
8.一度すべてのアセットを保存し、コンテンツブラウザ上でアセット名の横に * がない(Dirtyでない)ことを確認します。
9.ここで、全く無関係の ST_OtherParam を開き、変数を追加・削除するなどして編集し、コンパイル・保存します。
10.コンテンツブラウザを確認すると、StateTree_Main/StateTree_Sub アセットに * が付き、Dirty状態になっていることが確認できます。
質問時に再現プロジェクトを添付したのですが届いていますでしょうか?
アップロードがされていないようでしたら再度アップロードします。
[Image Removed]
お世話になっております。
再現プロジェクトのご提供ありがとうございます。
確かに受領し、また、再現を取ることができました。
現在までのところ、類似の症状は社内外から報告されておらず、「既知の問題」ではないようです。
対応のため、バグトラッカーに起票する方向で考えておりますが、あわせて、社内で本挙動に心当たりがないか確認を行います。
大変恐縮ですが、いましばらくお時間を頂戴できますと幸いです。
以上、よろしくお願いいたします。
>StateTree_Sub のグローバルパラメータが変更された場合に、_Subを一部として持つ _Main にまで Dirty が伝播される
ここでの問題はST_OtherParamが全く関係ない構造体なのに編集することでStateTree_Main/StateTree_SubがDirtyになる所です。
これも改善予定との認識で良いのでしょうか?
よろしくお願いします。
>①に関しては、P4 //UE5/Main CL46705789 として修正されており、具体的には、
この修正を適用したところ問題が解決しました。
この問題が解決すれば支障ありません。②に関してはStateTreeCompilerManager導入を待ちます。
ありがとうございました。クローズして大丈夫です。
お世話になっております。
お待たせいたしました。
開発チームに問い合わせたところ、 StateTree_Sub のグローバルパラメータが変更された場合に、 _Subを一部として持つ _Main にまで Dirty が伝播される今の挙動は、現時点では「仕様」であるとの回答でした。現在、このあたりをより賢く処理するために、State Tree Compiler Managerという仕組みに取り組んでおり、それが完了すれば今回の問題は改善されるはずとのことでした。こちらはUE5.8を目指して作業が進行中とのことです。
そのため、現時点ではこちらの症状を回避する方法をご案内することができません。
ご不便をおかけして申し訳ございませんが、ご理解のほどよろしくお願いいたします。
以上、よろしくお願いいたします。
お世話になっております。
ご指摘ありがとうございます。
大変申し訳ありません。二種類の症状が混在しているのを見落としておりました。
整理しますと、
・①ユーザー定義構造体をパラメータにもつState Treeが、無関係なユーザー定義構造体の編集に反応してDirtyとなる
・今回の再現プロジェクトで _Sub に Dirty がつく理由
→[対応]不具合として至急修正いたします
・② StateTreeが変更された際、それを参照しているStateTreeまでDirtyが伝播する
・今回の再現プロジェクトで _Main に Dirty がつく理由
→[対応]State Tree Compiler Manager の導入で解決予定です
となります。
①に関しては、P4 //UE5/Main CL46705789 として修正されており、具体的には、
Engine/Source/Runtime/CoreUObject/Private/StructUtils/PropertyBag.cppのUPropertyBag::ContainsUserDefinedStruct()関数内、3943行付近を
for (const FPropertyBagPropertyDesc& Desc : PropertyDescs)
{
if (Desc.ValueType == EPropertyBagPropertyType::Struct)
{
if (const UUserDefinedStruct* OwnedUserDefinedStruct = Cast<UUserDefinedStruct>(Desc.ValueTypeObject))
{
if (OwnedUserDefinedStruct == UserDefinedStruct
|| OwnedUserDefinedStruct->PrimaryStruct == UserDefinedStruct
|| OwnedUserDefinedStruct == UserDefinedStruct->PrimaryStruct
+ || (OwnedUserDefinedStruct->PrimaryStruct == UserDefinedStruct->PrimaryStruct
+ && OwnedUserDefinedStruct->PrimaryStruct != nullptr))
- || OwnedUserDefinedStruct->PrimaryStruct == UserDefinedStruct->PrimaryStruct)
{
return true;
}
}
}
}
という形に改めいただければ、①の不具合を修正可能です。当方で、UE5.6.1に適用・不具合修正ができることを確認いたしました。
お時間のある際に、ご確認いただけますと幸いです。
以上、よろしくお願いいたします。
ご確認ありがとうございました。
少なくとも①について、問題が解決したと聞き、安心いたしました。
それでは、本件は回答済みとしてCloseさせていただきます。
以上、よろしくお願いいたします。