【UE5】別Widgetを「Add Child」した後、その子Widgetを使いたい
忘れそうなので覚書きです。
はじめに
直前が切れていますが「For Each Loop」を利用し、Scroll Box へ自分で作った WidgetB(子Widget)を「Add Child」していく画像です。
複数の WidgetB が Scroll Box 内に含まれます。
その追加した WidgetB 個別の関数や変数へアクセスしたい時にどうすればいいのかよく分かりませんでした。
Scroll Box から「Get Child...」で調べるといくつかヒットしました。
「Get Children Count」
追加されている子Widget の数を取得できます。
子Widget 分ループする場合、そのまま利用すると配列の範囲外へアクセスしてしまうため -1 する必要があります。
「Get Child At」
指定したインデックスの子Widget を取得できます。
欲しい子Widget はどうやって判断すればいいのか一応確認してみました。
「Add Child」した順番に画面も並んでたので心配する必要はなさそうでしたが、「Add Child」した順番で配列[0]から入ってそうでした。
「Cast To WidgetB」
この後、WidgetB へキャストしてアクセスできました。
まだ未確認ですが、ターゲットが指定できるのなら Blueprint Interface を利用できそうです。
「Blueprint Interface」を利用してみる
適当な Blueprint Interface を作成し、WidgetB に適当な変数を「Print String」するだけの実装を行いました。
結果はそれぞれの変数の値が出力されました。
あとは WidgetB に配置した「On なんとか」系のイベントが実行されたかを WidgetA 側で判断出来たら色々便利そうな気がしなくもないんですが、これも確認出来たら追記しようと思います。
イベントディスパッチャを使う(2023-04-11追記)
前述の WidgetA で「Add Child」した WidgetB に「Onなんとか」系のイベントがあった場合、それが実行されたかを親で知ることができないかなと思い Twitter に書いたところとても丁寧にご回答頂けました!
https://twitter.com/NelisLuna/status/1645449379397111810
まさにこの通りの実装で実現が可能でした。
ネリスさん、本当にありがとうございます!!
今後絶対使うテクニックですね!!
あまり使ったことがなかったため、バインドするイベントはカスタムイベントを作成してバインドしないと駄目なんだと思ってました。
そのため、関数内でのバインドに利用できないと勝手に思い込んでたのですが、バインドするイベントから引っ張ると「Create Event」というものがあり、更に "一致する関数の作成" を選択すると、その関数をバインドすることも可能でした。
これで通知するための手段が増えたので嬉しいですね~~!