スクロールボックスにウィジェットをAddChildしても描画されない時がある

女の子のNPCとチャットするゲームを作っています。
条件を満たすと「TalkGenerate」のカスタムイベントが走り、スクロールボックスにテキストを内蔵したウィジェット「ui_TalkMessage」が追加される処理をブループリントで作りました。

この処理の問題は、AddChildしたウィジェットが画面には描画されないことがあり、
画面には出ていないにも関わらず、「ui_TalkMessage」の内部処理は実行されてしまうことです。
それによって、チャット内容がツギハギになるという問題が発生しています。

具体的には1~3回目のAddChildでは画面にウィジェットが描画されるが、
4回目は描画されず、5回目は描画される、といったことが起こります。

どの様な条件の時に、AddChildしたウィジェットが画面に描画されない現象が起こりますか?
もしくは、描画されていないことを検知して、内部の処理を実行しない方法などありますか?

AddChild した瞬間に ui_TalkMessage の Event Pre Construct と Event Construct がエンジンによって呼び出されます
そこに何らかの非表示処理を書いていませんか?

返信ありがとうございます。

確かに呼び出された時にこのイベントが走っています。
ただ、ここに非表示処理は書いてはいません。

最初の数回は正常に描画され、その後数回描画されなくなり、また描画されるといった挙動をします。
例えば以下の様になります。

期待する挙動:
1.女の子A:おはよう
2.女の子A:今日はいい天気だね
3.女の子A:私は晴れた日に散歩するのが好きなんだ
4.女の子A:あなたと一緒に行きたいな
5.女の子A:また遊びに行こうね

実際の挙動:
1.女の子A:おはよう
4.女の子A:あなたと一緒に行きたいな
5.女の子A:また遊びに行こうね

Dynamically adding children to a scroll box?(From the top down?)

ここのようにClearChildenをしてからFor文でChildを全部追加しなおすようなコードにしてみてはどうでしょうか

ありがとうございます。
ClearChildren のノードを試してみました。
結果として、出力は変わらずでした…。

リアルタイムに「TalkGenerate」のカスタムイベント処理を行いたいため、For文で追加し直すわけにはいかず、都度AddChildが必要です。
そのため、最初にClearChildrenを実行した後に、最初に添付した画像の「TalkGenerate」の処理を走らせるテストをしてみたのですが、結果は変わりませんでした。

ではもっと簡単な例から試すことをおススメします
今まで使用していた処理やウィジェット類は忘れて、何もないレベルを作成し、レベルブループリントでスクロールボックスのみのウィジェットを生成するなどして、AddChildした結果がどうなるか確認してください
それで期待通りに働かなければエンジン側のバグなので、こちらのフォームから報告してください

あとこの場合AddChildを正しい回数行えているか確認したほうが良いので、TalkGenerateのブレークポイントが何回通っているか数えてみてください

追加でウィジェットリフレクターも試してみてください
[Tools] > [Debug] > [Widget Reflector]

Unreal Engine でスレート ウィジェット リフレクタを使用する | Unreal Engine 5.3 ドキュメント

[UE4] Widget Reflectorを使ってリソースや設定を調べよう #UE4 - Qiita

1 Like

改めてコードを見てみるとScrollBoxの子供に直接ウィジェットを増やしているので、これだと表示がうまくいかない可能性がありますね
スクリーンショット 2024-02-20 172530
このようにVerticalBoxかListViewを挟むと縦方向にスクロールができます

1 Like

こちら試してみたところ、全てのAddChildが描画されました!!
この見落としは自分では気づけなかったかもしれません…。

無事解決に至りました。
ありがとうございます!!

1 Like