PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 Delay nodeと実行順序について

環境 : UE4.23.0

目次

Delayの挙動のよくある勘違いについて

Delayを挟んだはずなのに何故か処理が遅れて実行されないという経験をした人のためにありがちな実行順序の勘違いについて書き記す

ケース1 (Delay)

まずは下図のようなノードを組んだとしよう。
「DelayEvent」は1秒待ってから「Delay」と表示する
「PrintEvent」は呼び出されたら直ぐに「Print」と表示する
f:id:PaperSloth:20190930211938p:plain


実行結果として
1秒後にDelayと表示されてからPrintと表示されると思った人もいるかもしれないが、実際はPrintが表示された1秒後にDelayと表示される
f:id:PaperSloth:20190930212720p:plain
ここではBeginPlayの後に「DelayEvent」を呼び出して直ぐに「PrintEvent」を呼び出している
CustomEventは前の処理が終了するまで待つような機能は特にないため
「DelayEvent」の終了を待たずに「PrintEvent」が先に処理される
今回はCustomEventで説明するがFunctionの場合も同様である
※FunctionではLatent nodeが使えないため、今回無関係

ケース2 (Delay + Seqeuence)

下図のようにSequenceを挟んだ場合も同様の結果となる
f:id:PaperSloth:20190930212555p:plain
SequenceはThen * と表記されたOutput pinに繋がれた処理を上から順に実行するが
終了結果を待つような処理にはなっていないため
実行結果は先程と同じ結果になる

処理を遅らせたい場合 -> Macroとして処理する

「DelayEvent」の処理をMacroにする
f:id:PaperSloth:20190930214457p:plain

「DelayEvent」の時とは異なり「DelayMacro」には
Delay node同様の時計マークが付く
Latent nodeとして認識されていることが確認できた
f:id:PaperSloth:20190930214610p:plain

実行結果としては
1秒後にDelayと表示されてからPrintと表示される
f:id:PaperSloth:20190930215730p:plain


さてこれで意図した通りの結果となるわけだが
Delayを加えたMacroの運用には注意してほしい

例えば他の作業メンバーが意図せずDelay付きのMacroをどこかで呼び出した場合に
ゲーム仕様と異なり、何故か数秒遅延する謎の処理が生まれてしまうケースがある
5秒など長ければ直ぐに問題に気付けて良いが
0.1秒などの短い遅延の場合は気付きにくく意図しない不具合が生まれるかもしれない