UE5.2から5.4に更新したアセットでプロパティの値が不定になる不具合について

お世話になります。類似の不具合について情報があれば教えてください。

<br/>

UE5.2ベースのカスタムエンジンで作成していた弊社プロジェクトを、

UE5.4ベースにカスタム部分を移植した環境で動かそうとしています。

<br/>

その際、次のようなプロパティの読み込み問題が出ています。

<br/>

UserWidgetアセットA、B、Cがあり、AのパーツとしてBとCが配置されています。

BにはBPでUserWidget型の変数があります。

Aに配置されたBでは、そのプロパティでC(BにとってはAnoHierarchyにおいて兄弟関係にあるパーツ)がDetailsで設定されています。

このような構造のアセットにおいて、エンジン更新後にそのアセットを開いたところ、そのプロパティが一見して何も設定されてない状態になりました。実際動作させてみると未設定(リファレンスが空)のときの挙動となります。

<br/>

次のような特徴があります。

1.改めて手入力で設定すると問題ないようです

2.Aを編集後(SVNですが)リバートすると正しい設定に戻ります、動作もします、ただAクラスが別のアセットになったと認識されるのか、Aを参照している変数で型のエラーが出ます、そしてそのAを保存したところで、次回エディタ起動時にはやはりプロパティが空になります

3.クックしてパッケージで確認しても同様です(プロパティが設定されてない挙動になる)

4.A,B,Cについて全く同じ構成になっているところは同様に全て空になりますが、同じようなプロパティを待たせるD、Eがあったとして、A,D,Eでは問題ないなど、UserWidget型のリファレンス変数が全ておかしいというわけではないようです

<br/>

UserWidget以外でこのようなプロパティが不定になる問題が起きているかはわかっていません。

例が見つかるかもしれませんし、A固有の問題かもしれません。

<br/>

UE5.2や5.3から5.4にアップデートされたプロジェクト(アセット)について、類似の報告やこのような症状のときに疑われる問題など情報がありましたら、返答いただけると助かります。

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

UE 5.4 へのアップグレードが引き金となって Widget の参照が外れてしまう件につきまして、現在のところ アップグレード自体が直接の原因と特定された事例は確認できておりません。ただし、アップグレードとは無関係と思われる状況では、UE 5.4で Widget 内のアセット参照が保存されず None 扱いになる という報告を2件ほど見つけることができました。いずれも Widget 関連でのみ発生 しており、他のアセットタイプでは同様の報告は見つかっておりません。

Cook後にButton参照が外れるというフォーラム投稿

(同様の問題が数多く発生しているというニュアンスのコメントがついていますが、当方の捕捉範囲では類似報告はほぼないという認識です)​

​・[5.4パッケージビルド時に Widget 変数が None [Content removed]

[Content removed]

何らかの原因で、AからBやCを参照している情報が無効なものとみなされている(①)か、Aをロードした時点でBやCがロードされておらず、プロパティにNoneが入ってしまった(②)と考えられます。②だとすると「改めての手入力」や「SVNのリバート」で参照が元通りになる理由の説明もつくのですが、「改めての手入力」では再起動後も問題が修復され、「SVNのリバート」では再発するという点がまだ不可思議で、現時点では確定的なことを申し上げるのが難しいというのが正直なところです。

同じ参照構造をもつ、他のアセットでは起こらないということから、なにかA、B、Cで、他のアセットでは行わなかった操作を行っている可能性はないでしょうか?(過去にアセットを移動させたり、リネームさせたりして、リダイレクタに依存しているなど)

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

申し訳ありません。

>1.改めて手入力で設定すると問題ないようです

こちらの説明が不足していました。「手入力すると期待通りに動作する」という意味で、「その状態で保存しなおすと正常なデータになってエディタを再起動しても想定通りに読まれて動く」という意味ではありませんでした。

手入力で正しいデータにしたときもリバートによって正しいデータにしたときも同じ挙動に見えます。

Cook前のエディタ時からNoneなのでフォーラムやEPSの報告事例とは違うかもしれませんが、

ロードの問題や、過去の移動なども調査のヒントになりそうです。アドバイスありがとうございます。

(確かに元がとても古いアセットで複数回のエンジンアップデートとともにアセット自体も移動やリネームなど繰り返されています)

本件、こちらにて継続調査します。

何かあるかもしれませんので、このチケットはまだクローズせず様子見させていただきます。

こちらで問題が出ているパターンのルールが少しわかったので念のため情報共有しておきます。

これまでの説明で登場しているA(BとCという別のユーザーウィジェットを持つ)と、B,C(Bはユーザーウィジェット型の参照でAに配置されたCを指し、CはB​型の参照でAに配置されたBを指す)にて、AをUMGで開くとBが指すCがNoneになる(Cが指すBは問題ない)という問題です。もちろん実際に動かすと意図せずNoneになっているところが動かず問題となります。

​そしてAにそのようなBを複数配置した場合、同様の異常が全てのBに起きます。ただしDがユーザーウィジェット型の参照でAに配置されたEを指し、EはD型の参照でAに配置されたDを指す、という同様の構成のケースでDのEへの参照は問題なく、EのDへの参照の方がNoneになる、という逆向きに異常が起きてもいるので、参照の型や向きが問題ではなさそう。

ですが、A,B,C,D,Eなどそれ自体の中身に問題はなさそうです。(リバートしたときに正常になるのは正しいデータが入っている証拠でもあるでしょうが)

この現象が確認されるのは、B,C,D,Eのようなパーツを従えるAが、プロジェクト起動時に使われるプロジェクト用にカスタマイズされたゲームモードに設定された、プロジェクト用にカスタマイズされたHUDがAを参照している(CreateWidgetでAを作ったり、A型のメンバ変数を持っていたり、どちらかだけで)、そのときだけ発生していました。

AをHUDアセットから参照しないようにすると、A(の中のB,C,D,Eすべて)が正常になりました。

またHUDアセットが参照する別のUserWidgetにB,C,D,Eのようなものを持たせてリンクしてみると、

同様にNoneになる​現象が確認されました。

プロジェクト起動時のゲームモードでそのAを参照するHUDを使わないようにしても、

どこかからの連鎖で読まれるのか​Aはおかしいままでした。

このあたり引き続きこちらでの調査をしつつ、条件が整理できてきたので再現プロジェクトを作れないかも挑戦してみます。

HUDからのWidgetアセット利用で、デシリアライズがおかしくなった報告はありませんか。​

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

お世話になります。アドバイスありがとうございます。

■HUDアセットからの参照変更

>HUDアセットからの参照をAのみでなく、テスト用のダミーのプロパティを追加して、B、C、D、Eを参照させた場合、動作に変化が生じるかお試しいただけますでしょうか。

すみません、こちら報告忘れていました。

HUDから参照していてB,C,D,Eのようなものを持たない正常だったアセットに、B,C,D,Eにあたるパーツを追加したところ、やはりおかしくなりました。

またLauncher版のリテールエンジン(UE5.4.4)を使って、同様の構造を持つアセットを作ってみましたが、問題なかったです。

アドバイスいただけたログの調査と、リテールエンジンでUE5.2で同様の構造をつくりそれをUE5.4で扱う、

HUD以外のアセットから参照して利用したらどうなるか、というのはやってなかったのでそれも試してみようと思います。

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

お世話になります。

その後良い対策も思いつかず、現在のところの解決策としては、HUDから参照するとNoneになってしまうので、

HUDからプロキシとなるアクターを作りそこのイベントを呼ぶことで本来のWidgetを操作するような迂回を行いました。

プロキシとなるアクターの中では普通にWidgetを作って利用しています。

HUDでプロキシとなるアクターの型を参照してしまうと​結局Noneになってしまうので、

HUDでは動的にロードしてActor型のままキャストもせず保持、利用するようにしています。

この方法で期待通りの動きはしており、幸い問題となるWidgetの呼び出しは低頻度かつ保持や呼び出し時のコスト​があまり問題にならないところですので、この回避策で最後まで行くことになっても許容できる範囲ではあります。

追加の情報が得られない場合、このやり方で進めようと思います。

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

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

お待たせして申し訳ありません。

いろいろなチャンネルで情報収集を試みたのですが、大変残念ながら、情報を得ることができませんでした。

症状としては、「CからBへの参照がNoneになることは、Cクラスのオブジェクトをロードした時点で、Bのクラス情報が何らかの原因でロードされていないため参照が切れた」で説明ができなくはないのですが、上図のBからCへの参照がNoneになるのが(UserWidgetのクラス型は確実にロードされているはずなので)不明で、類似症例報告もなく、ヴァニラエンジンでの再現もできていないことから、情報が集まりませんでした。

お役に立てず大変申し訳ございませんが、許容範囲であれば、現状の回避手段をご採用いただければと思います。

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

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

情報共有ありがとうございます。

いただいた情報を元に、社内外のデータベースを調査したのですが、未だに類似報告を発見できずにおります。以下、お手すきの際に、二点ほどお試しいただきたいことがあります。

■ログ詳細度の変更

プロジェクトのDefaultEngine.iniに以下のログ詳細度変更設定を書くか、-LogCmds引数を利用して、関係がありそうなログカテゴリのログレベルをVerboseまで下げ、プロジェクト起動やUMGエディタを開く際に何か気になるレポートがログに書き込まれないか​ご確認いただけないでしょうか。

[Core.Log] LogSerialization=Verbose LogAssetRegistry=Verbose LogReferenceChain=Verbose LogBluerprint=Verbose LogUObjectGlobals=Verbose LogSlate=Verboseもしくは

-LogCmds="LogSerialization Verbose, LogAssetRegistry Verbose, LogReferenceChain Verbose, LogBluerprint Verbose, LogUObjectGlobals Verbose, LogSlate Verbose"■HUDアセットからの参照変更

​HUDアセットからの参照をAのみでなく、テスト用のダミーのプロパティを追加して、B、C、D、Eを参照させた場合、動作に変化が生じるかお試しいただけますでしょうか。

決め手となる新しい情報がなく、申し訳ございません。​

ご確認のほど、よろしくお願いいたします。

調査結果を共有します。

ログ

Verboseで追加されるログに特別関係しそうなことはなかったです

リテールエンジンでのエンジン更新

UE5.2で問題の構造をつくって、そのプロジェクトをUE5.4でみましたが、問題は起きなかったです

アセットの接続経路の変更

HUDから接続されておかしくなるアセットをHUDからリンクしないように外して、

レベルBPからCreateしたり、レベルBPからCreateされるWidgetのパーツとして使ってみたケースでは問題は起きなかったです

引き続きいろんなパターンでセットアップして問題の絞り込みができないかみてみます。

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

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

情報共有ありがとうございます。

またテストもありがとうございました。

社内で報告のあった一例が、クラスのロードが終わる前にクラスの参照をデシリアライズしてしまい参照を失ったというものでしたので、この「クラスのロードの掛け違い」がHUDクラスによって生じているのであれば、B、Cなどの参照を直接加えればあるいは・・・と考えたのですが、あてが外れました。お手数をかけしました。

当方も引き続き、類似報告がないか調査を行ってまいります。

念のため確認ですが、

> これまでの説明で登場しているA(BとCという別のユーザーウィジェットを持つ)と、B,C(Bはユーザーウィジェット型の参照でAに配置されたCを指し、CはB型の参照でAに配置されたBを指す)にて、AをUMGで開くとBが指すCがNoneになる(Cが指すBは問題ない)という問題です。もちろん実際に動かすと意図せずNoneになっているところが動かず問題となります。

上述の件について、私の方では下のような理解をしておりますが、合っておりますでしょうか?

[Image Removed]また、HUDクラスでのAの持たせ方は、HUDクラスのブループリントあるいはC++のロジックからAクラスを指定してCreateWidgetをする、という関係性/利用方法となりますでしょうか?

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

返答遅れてすみません。

はい。その図のような症状です。

が、BからCの方向のUserWidgetの参照がNoneになるケースもあれば、

CからBのような特定の型(ここではB)の参照がNoneになるケースもあります。

製品で使おうとしているアセット(Aにあたる)では、どちらも起きていました。

ただ同じBCの組み合わせではどちらか一方しか起きません。

BCではBからCの参照(UserWidget型)がNoneだとすると、

BCの組み合わせのパーツでは全て同様にBからCの参照でNoneが発生し、

D(UserWidget型でEを指す)とE(D型でDを指す)の組み合わせでEからDへの参照(D型)がNoneを指すと、他のDEの組み合わせのパーツも全て同様のところがNoneとなる、という具合です。

そしてA(B,C,D,E)がそのままでも、AがHUDから参照されてなければ正常に動きます。

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

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

ご確認いただいた情報を元に、心当たりがないか社内でも確認を進めております。ただし、一部のセクションを除き、現在全社的に夏季休暇に入っているため、本社や開発チームの方に問い合わせを出すことができません。大変恐縮ですが、しばらく本件は「Open」状態で保留させていただき、7/14以降に本社側に問い合わせを出していきたいと考えております。

また、今回生じた問題ですが、ワークアラウンドとして「A」のイベントグラフの「Event Construct」を使用して、BとCの参照をノードグラフのロジックの中で再セットすることで(すなわちプロパティの初期値で設定するのではなく、初期化スクリプトの中で設定する形で)参照を問題ない形に修復可能かどうか、お試しいただくことは可能でしょうか?

なかなか解決に至らず申し訳ございません。​

よろしくお願いいたします。

お世話になります。

はい。PreConstructでSet,Getしてプロパティを設定することで動作することは確認しました。

ただ非常にパーツの多いアセットでして、​不具合も大量にでています。

単純なパターンの繰り返しですが、エンバグしないようグラフを書き、それを検証するのも工数がかかりそうです。​

また何より他に問題になるアセットや変化がないか不安になりますが、全体を検索する方法もなさそうで、

実際に動作確認して発見するのも困難です。

そのため、このアセット限定でグラフに書いて解決というのは最終手段として、

まずは原因や問題の検出方法、再現方法など見極めたいと考えています。​

その後こちらで新しい検証​や修正の方法は思いついておらず、

追加で試せたことはありません。

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

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

夏季休暇も明けまして、現在、社内でこのような症例の心当たりがないか、いくつかのチャンネルで聞き取りを行っておりますが、現時点ではまだ情報がありません。

いましばらく、チケットを「Open」のまま保持させていただければと思います。

なお、ワークアラウンドのご共有もありがとうございます。

HUDからプロキシーのアクタ型で参照してしまうと結局None化現象が起きてしまうという点が特徴的で、なにかありそうだと感じますが、なかなかこれといった手がかりを見つけられておらず、申し訳ございません。

引き続き、よろしくお願いいたします。​

お世話になります。

いえ、調査ありがとうございます。

プロジェクトの方で様子を見ていますが、今のところ現状の回避手段でいけそうです。

本件はクローズいただいて大丈夫です。

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

ご確認ありがとうございます。

それでは本件はCloseとさせていただきます。

また何か問題が生じました場合は、いつでもご連絡ください。

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