読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ウィジェットのイベントConstructが発生するタイミング

ウィジェット ブループリント

f:id:una_unagi:20151202212106p:plain

妹「ウィジェットのConstructイベントから、こういうブループリントに繋がってるんだけど、ここが呼び出されるのが表示の後だから、表示される前に配列の大きさを使えないんだよ。Constructって作成した時に呼び出されるもんだとばっかり思ってたんだけど」

「一応ブレークポイント付けて調べてみたけど、やっぱりウィジェットを作成じゃなくて、AddToViewportの時に反応してるね」

f:id:una_unagi:20151202212534p:plain

複数回呼ばれることもあるって書いてあるけど、たしかに同じウィジェットが表示されるたびにイベントConstructが発生してる」

妹「Constructってそういう物なの?」

「アクターとかのは違うよ。表示しようがしまいが、作った段階でConstructしたという扱い。ただウィジェットの場合、イベントノードなのが気になるんだよ。アクターのコンストラクションスクリプトは別ページになってるでしょ? 返り値はないんだけど関数っぽい扱いになってる」

f:id:una_unagi:20151202213052p:plain

ウィジェットに関してはちょっと特殊な仕組みになってる感じがする。AddToViewportの時に"イベントConstruct"が発生して、RemoveFromParentで消した時に"イベントDestruct"が起きるけど、バグとかじゃなくてそういう仕様」

f:id:una_unagi:20151202213321p:plain

妹「でもそうするとウィジェットを作った段階ですぐに動かしたプログラムはどこに書けばいいの?」

「それが書ける場所はなさそう。他にそれらしいイベントはないし。C++も使えば可能かもしれないけど」

妹「そうするとアイテム保有上限をウィジェットから持ってこれないのが困るなあ……あ、最初に一瞬だけウィジェットを作って消せばいいんじゃない?」

「一応それでも動くんだけど、非表示にした後のウィジェットのパラメータをあてにするのはちょっと危ない気が。Constructの仕様からしてそういう使い方を想定してなさそうというか。そもそもなんでウィジェットから数持ってきてるの? アイテム上限みたいな数字変数を、主人公のアクターか、GameModeあたりに作っておけばいいのでは?」

妹「なんとなくなんだけど、ウィジェット配列の大きさでわかってるから、数字わかってるのに同じのを2つ作らなくてもいいかなあという気が。ウィジェット側を改造して持てる数増やした時に、所持数の数字も増やすとか意味ないじゃん? 片方だけ増やしたまま忘れそうだし」

「同じ事を表す数字が2つも要らないっていう考え方はいいと思うんだけど、この場合はしょうがないんじゃないかな。ただ片方だけ変更してしまうのを防ぐ方法ならある。ウィジェットのConstructイベントで、配列を作った後にその変数と数が一致するかブランチで調べる。一致してればそのまま次に進んで、不一致の時はエラーメッセージか何かを出す。こうしておくと、普段は意味がないけど、片方だけ書き換えてしまった場合にはすぐわかる」