Gaming Life

一日24時間、ゲームは10時間

イベントディスパッチャーを使ってUMGの文字を変える

前回の続き。

ai-gaminglife.hatenablog.com

 UMGの詳細パネルからプロパティに関数バインディングすると毎フレーム処理が走ってしまい良くない。今回はその一つの解決法。

イベントディスパッチャーを使って必要な時だけ関数を呼び出す

 今回はThirdPersonCharacterが持つInteger変数をUMGのTextに表示させるということをしてみる。

 UMGのDesigner編集画面でTextを追加。詳細パネルでIs Variableにチェックを入れると"TestTextBlock"をBP上で変数として扱うことが出来る。

f:id:ai_gaminglife:20180625233815p:plain

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

f:id:ai_gaminglife:20180625233821p:plain

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

f:id:ai_gaminglife:20180625233829p:plain

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

f:id:ai_gaminglife:20180625233837p:plain

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

f:id:ai_gaminglife:20180625233845p:plain

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

f:id:ai_gaminglife:20180625233853p:plain

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

f:id:ai_gaminglife:20180625233902g:plain

 TestCountが変更されたときだけディスパッチャーが発行され、UMGを更新することが出来た。

Event Constructの話

 最初、キャラクターのBPのEvent BeginPlayでディスパッチャーをCallしてSetTextBlock_Text関数を呼び出そうとした。

f:id:ai_gaminglife:20180625233946p:plain f:id:ai_gaminglife:20180625233949p:plain

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

f:id:ai_gaminglife:20180625234002p:plain

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

f:id:ai_gaminglife:20180625234012p:plain

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