イベントディスパッチャーを使ってUMGの文字を変える
前回の続き。
UMGの詳細パネルからプロパティに関数バインディングすると毎フレーム処理が走ってしまい良くない。今回はその一つの解決法。
イベントディスパッチャーを使って必要な時だけ関数を呼び出す
今回はThirdPersonCharacterが持つInteger変数をUMGのTextに表示させるということをしてみる。
UMGのDesigner編集画面でTextを追加。詳細パネルでIs Variableにチェックを入れると"TestTextBlock"をBP上で変数として扱うことが出来る。

ThirdPersonCharacterのBP編集画面を開き、Integer変数、testCountと、イベントディスパッチャー、ED_CountUpdateを追加。ED_CountUpdateの詳細パネルで画像の様にInputsを編集するとIntegerを入力に取るイベントをバインド出来るようになる。

ThirdPersonCharacterでは画像のようにBPを組む。キーボードのUを押すとTestCountがインクリメントされディスパッチャーが発行される単純なもの。

UMGに戻り、画像のような関数、SetTextBlock_Textを用意。

EventGraphでは次の画像の様にBPを組む。ThirdPersonCharacterでディスパッチャーが発行されたらEventCountUpadateが実行され、その中で先程作った関数が呼び出される。

いつもの様にレベルBPでUMGをCreateしAdd to Viewport。

実際動かしてみたのが以下。

TestCountが変更されたときだけディスパッチャーが発行され、UMGを更新することが出来た。
Event Constructの話
最初、キャラクターのBPのEvent BeginPlayでディスパッチャーをCallしてSetTextBlock_Text関数を呼び出そうとした。

これでEvent BeginPlayが起きた時にディスパッチャーがCallされ、0で初期化できると思ったのだが……

0で初期化されない。OutputLogを見てみるとUMGのEvent Constructが呼ばれる前にキャラクターBPのEvent BeginPlayが呼ばれている。バインドする前にCallしてしまっているのが原因だった。

色々調べるとEvent ConstructはAdd to Viewportする時に呼ばれるものらしいが。現状これに対する解決策が浮かばなかったのでEventConstructで直接SetTextBlock_Textを呼ぶことで無理やり解決した。