[UE4][UE5]Delayメモ
まとめ
次Frameまで待ちたい時、Tickから呼ばれる処理ならDelay 0を2個つなげる必要がある
1個目は同FrameのLatent Actionで発火する
そのLatent Action内で呼び出した2個目が次FrameのLatent Actionで発火する
「元からLatent Actionから呼ばれる処理中に次Frame待ちをする」ならDelay 0を1個でよい
Delay Until Next TickはDelay 0と同じ挙動になる
LE Extended Standard Library の Delay(Frame) も、引数0と1はDelay 0と同じ挙動になる
「Delay呼び出し側の状況問わず、次FrameのLatent Action送りにするノード」はC++で作れる(後述)
様々なDelayノードの実験図
※SequenceノードはDelayで中断されないので、図の場合、全てのDelayノードは最初のTickで呼び出されている
※UE5.0.1で挙動調査
"Delay 0" + "Delay 0" = ?
Delay 0ノードを二つ繋げて1Frameの遅延を得るというテクニックがある
下記動画(39:20付近)でロブさんが実演している。Robo Recallでも使われているとか
Animationの更新を待ちたい為にやっている様だ
Delayノードの挙動
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でも同じ挙動になる
Delayノードを自作する
GFrameCounterを使えば、Tick中なのかLatent Action中なのかを意識せず、確実に任意Frame待つDelayを作れる。
ヘッダファイルだけで完結する。適当なBlueprint Function Libraryに追加しても良いかも。結果は本頁最初の画像参照。
おまけ:Delayを使った擬似Tick
こうすると、
こうなる。期間限定でTickっぽいことをしたい場合などに便利。