DelayはLatent Actionへの登録処理である
ノード右上に時計のアイコンが付いているものはLatent Action登録ノード
各ActorはTick処理後に登録されたLatent Actionを条件判定して実行する
Tickの実行パスから次Frameまで待ちたい時、Delay 0 を2個つなげる
1個目は同FrameのLatent Actionで実行され、2個目が次FrameのLatent Actionで実行される
Latent Actionの実行パスから次Frameまで待ちたい時、 Delay 0 を1個つなげる
「実行パスを問わず次FrameのLatent Action送りにするノード」はC++で実装可能
Delay Until Next Tick は Delay 0 と同じ挙動
LE Extended Standard Library の Delay(Frame) も、引数0と1で使う場合、Delay 0と同じ挙動
※SequenceノードはDelayで中断されないので、図の場合、全てのDelayノードは最初のTickで呼び出されている
※UE5.0.1で挙動調査
Delay 0ノードを二つ繋げて1Frameの遅延を得るというテクニックがある
下記動画(39:20付近)でロブさんが実演している。Robo Recallでも使われているとか
Animationの更新を待ちたい為にやっている様だ
Delayノード実行時、Worldが持つLatentActionManagerにLatent Actionが登録される
KismetSystemLibrary.cpp参照
ActorはTick内でBP側のTick処理が終わった後、登録したLatent Actionを再開すべきかチェックする
Delayノードはここで指定時間が経過していれば処理再開する
Tick内でDelay 0を実行すると、同FrameのLatent Actionで時間経過判定を通るので、同Frameで処理が再開する
それはもうDelay Until Next Latent Actionなんよ
Latent Action中にDelay 0を実行すると、次FrameのLatent Actionで処理が再開する
詳しい挙動は以下の小ネタを参照
詳しくはActor.cpp参照
待機Frame指定でDelayするノードがある
引数0だとそのFrameのLatent Actionで続きが実行される
引数1でもそのFrameのLatent Actionで続きが実行される
実装
実行時にLatent Action登録、LatentActionの待機中に呼ばれるUpdateOperation()で経過Frameを記録
(経過Frame >= 引数指定Frame) がTrueなら処理再開なので、0でも1でも同じ挙動になる
GFrameCounterを使えば、Tick中なのかLatent Action中なのかを意識せず、確実に任意Frame待つDelayを作れる。
ヘッダファイルだけで完結する。適当なBlueprint Function Libraryに追加しても良いかも。結果は本頁最初の画像参照。
こうすると、
こうなる。期間限定でTickっぽいことをしたい場合などに便利。