torano111
(torano111)
1
実現したいこと
10個以上のウィジェットを連結する構造を作る必要があり、ウィジェットを追加または削除するたびになるべく大きな変更が少ない仕組みを考えています。しかし、バグによってうまく実現できていません。
詳細
ウィジェットのあるボタンを押したら、そのウィジェットを隠し、他のウィジェットを表示するような仕組みを作っています。例えば、ウィジェットの「戻る」や「次へ」ボタンを押したら該当するウィジェットが現れるようなイメージです。ウィジェットが隠れたり現れたりする際にはアニメーションも使っています。(そのため、WidgetSwitcherは最適でないと考えています。)
実装方法は次のようにしました。親ウィジェットを一つ作り、デザイナータブで子ウィジェットを追加します。この子ウィジェットが隠れたり現れたりするウィジェットです。親ウィジェットのボタンを押すと最初の子ウィジェットが現れます。子ウィジェットは10個以上あります。
子ウィジェットは、UserWidget型の変数として次のウィジェットの参照を持ちます。インターフェースを使って次のウィジェットに切り替えています。直接次のウィジェットクラスを参照せずにインターフェースを使っているのは、子ウィジェットをそれぞれ独立させることで、子ウィジェットを親に追加または削除した際に変更が少なくて済むからです。
親ウィジェットのみが子ウィジェットの参照を持っています。UserWidget型変数を公開して、親ウィジェットのデザイナータブ上でセットしています。
問題
おそらくバグだと思いますが、エディターを再起動するたびにセットしたものがリセットされてしまいます。一応の回避策としては、デザイナータブ上でセットするのではなく、親ウィジェットのグラフ上でセット、つまり動的に変数に値を入れるようにすれば同じようなことはできます。しかしこれだと、子ウィジェットを追加または削除するたびにコードを変更しなくてはなりません。また、アーティストなどには使いずらそうです。
この問題の解決策か、またはより良いやり方があれば教えていただきたいです。よろしくお願いします。
環境
Windows 11
UE 5.1.1
kiruru002
(kiruru002)
2
「詳細」部分は何となく言いたいことは分かります
しかし、なにが問題なのかいまいちわかりづらいです
エディターを再起動するたびにセットしたものがリセットされ
- 「エディター」とはUEエディターとUMGエディターどっちですか?
- 「セットしたもの」は何を指してますか?リセットされるとどうなるのですか?
子ウィジェットを追加または削除するたびにコードを変更しなくてはなりません
なぜですか?動的に子ウィジェットをすべて取得することは単純かつ一般的です。何の目的があるのですか?
torano111
(torano111)
3
- UEエディターです。
- デザイナータブでUserWidget変数をセットしています。セットしたのは他の子ウィジェットです。リセットされるとデフォルト値、つまりNoneになります。添付画像で示した部分です。
なぜですか?動的に子ウィジェットをすべて取得することは単純かつ一般的です。何の目的があるのですか?
ちょっとわかりにくかったかもしれないので、ひとつの例で説明させてください。

親ウィジェットと子ウィジェットは画像のようになっています。
親の次はA、その次Bとなります。ただし押したボタンによっては親の次がCやFになることもあります。
ここで、このようなウィジェット同士の関連付けは最初の投稿の画像のように、デザイナータブ上で変数に値をセットすることでつくっています。
デザイナー上で値をセットするのではなく、親のグラフ上でボタンへのバインドなどを使って関連付けをつくった場合ですが、子ウィジェットを追加または削除するたびにコードの変更が必要になってしまいます。子は10個以上あるのでこれはなかなか大変です。
画像の例でいうと、Dを削除してCからEにしたいと思った時には親コード上の変更が必要で面倒です。
子ウィジェットを追加や削除をしたときになるべく変更が少なく簡単に済む方法は無いか、というのが質問の趣旨になります。
DROSS_JP
(DROSS_JP)
4
ここですが、このUserWidget変数はオブジェクト参照になってますか?オブジェクト参照の変数にデフォルトの値を入れることは出来ないはずです。なんやかんやで一時的に入れられてもリセットしたら消されるのは自然なことに思えます。
仮にオブジェクト参照ならそんな風に変数を作成しなくてもIIsVariableにチェックを入れれば子Widgetのオブジェクト参照を変数として利用できます。

で、本題の話ですが
要件が正確に理解できているかはわかりませんが、聞いた感じイベントディスパッチャーを理解すれば出来るようになるんじゃないかなあと思えます。
ドキュメントも貼ろうと思ったのですがウィジェットで使ってるいい感じの事例が見つからないですね・・・
torano111
(torano111)
5
もちろんオブジェクト参照になっています。
変数は子ウィジェット側で作成したものですが、値は親ウィジェット側でセットしています。リセットされるというのはこのセットした値が再起動すると外れるという意味です。
イベントディスパッチャーの使い方も理解しているのですが、イベントディスパッチャーを使うと結局変更が多くなってしまうと思い使っていません。イベントディスパッチャーを使う場合、おそらく親ウィジェットのグラフ上で各ボタンにイベントをバインドするのがベストそうですが、このようにすると当然ウィジェットを追加または削除した際にそれも変更が必要になってしまいます。
kiruru002
(kiruru002)
6
@torano111
オブジェクト参照になっているなら値をセットして運用することはできません
ちなみにウィジェット階層で、子は親を取得できます
これは標準機能のため、全ウィジェットで使えます
子が親を取得でき、親も子を取得できる相互参照の状態です
やりたいことがウィジェット同士の関連付けだけならすでに達成できていると言えるのではないでしょうか
あとは直参照という考えを捨てて、ボタンごとに遷移ルールを設定してあげられるようにしたほうが回しやすそうです
torano111
(torano111)
7
値をセットというのは正確な表現ではなかったですね、子オブジェクトに対する参照をセットしているんだと思います。
やりたいことがウィジェット同士の関連付けだけならすでに達成できていると言えるのではないでしょうか
質問の趣旨は、より変更の少ない構造をつくることです。
あとは直参照という考えを捨てて、ボタンごとに遷移ルールを設定してあげられるようにしたほうが回しやすそうです
これは前の投稿でおっしゃっていたイベントディスパッチャーを使ったやり方のことでしょうか?
親のグラフ上で10個以上のウィジェットのボタンのイベント関連付けを行うという方法は手間がかかりそうですし、それより簡単に済む方法が思い浮かばないのですが、あれば教えてください。
kiruru002
(kiruru002)
8
子ウィジェットのクラス名を仮にChildとすると、ChildクラスがChildクラスの変数(ObjectReference)を持っている状態ですよね?
私の環境だと値をセットしてからエディター再起動してもNoneに変わったりはしなかったっすね
まあパッケージしてもOkなのかは分かりかねますが
やるならFString型で名前つけてオブジェクト参照の代わりに名前指定でUserWidgetを取得できるようにすると安全そうな気がします
バグによってうまく実現できていません。
バグではありません
ただの再インスタンス化によるリセットです
まず「参照」というものについての理解を深めたほうが良いでしょう
「参照」が指し示すのは特定のモノではなく、そのモノがどこにあるか、という情報です
オブジェクトをゲーム内で扱うにはクラス情報からインスタンス(実際に動かすもの)を生成します
そしてこれはEditor上で扱うものと同一ではありません
なので、実行時には成り立たなくなります
同じEditor上でも同様です
BPの編集とプレビューのために、Editor上では一時的にインスタンス化を行いますが
前回作ったインスタンスと今回作ったインスタンスは同一ではありません
ですので、保存された参照は無効な情報であるとして、参照はInvalid(None)扱いになります
以上のことから、結局は何らかの形で動的に参照を解決する必要があります
蛇足ですが、個人的なアイデアを書き添えておきます
ChildWidgetに直接設定しようとするのは見通しが悪いので、Widgetを管理するクラス(親Widgetでも構いませんが)に階層構造を表現するデータを持たせ、それをもとに参照を解決する方法が考えられます
また、1つのWidget内に子Widgetとして大量のWidgetをまとめるのは、取り回しが悪くなるので避けたいところです
torano111
(torano111)
10
バグではありません
ただの再インスタンス化によるリセットです
リセットされるのは全てではなくリセットされないものもあり、それは何度再起動してもリセットされないので、おそらくバグだとは思いますが。。
ChildWidgetに直接設定しようとするのは見通しが悪いので、Widgetを管理するクラス(親Widgetでも構いませんが)に階層構造を表現するデータを持たせ、それをもとに参照を解決する方法が考えられます
アーティストにも使いやすいよう階層構造をつくるのは難しそうですね、諦めてひとつひとつグラフ上でセットするようにします。
kiruru002
(kiruru002)
11
@torano111
すみません、最初にやりたかったことは何だったのかもう一度教えてもらえませんか?
アニメーションがあるからWidgetSwitcherは最適でないとおっしゃってますが、もしアニメーションが無ければWidgetSwitcherで要件を満たせそうですか?