【UE4】Delayノードについての検証 【★★~★★★】

※この記事で使用しているUnrealのVersionは04.20.3です。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト

Delayって? レベル【★★】

よく無闇に使っては行けませんと言われているDelay。

Delayノードは、指定した時間待ってから処理が実行されるBlueprintノードです。
似たノードでRetriggerable Delayというのもあります。

・Delay
Delayの処理は走ったあと、Complete処理が走る前に再びDelay処理が走った場合、再び走った処理は無効になる。

・Retriggerable Delay
Delayの処理は走ったあと、Complete処理が走る前に再びDelay処理が走った場合、カウント初期化して、新たにDulation分待つ

このDelayのDulationはエンジン内経過時間で換算してのものです。

主に演出意図とかで、「~~が終わってちょっとまってからXXを始める」などのときに使います

Q,DelayのDulation=0.0にしたらどんな挙動をするの?待たないで処理しちゃったり? レベル 【★★☆】

こんな疑問を解消するためにまず↓のようなBlueprintを作ってみた。

もしDelayノードで0.0の場合は待たずに処理してしまうのなら、これは1フレーム内での無限ループとほぼ変わらない処理になる。

プレイしてみると…

大量のログが流れたが、無限ループでゲームが止まることはなかった。
さらに、Printされている文字が、ずっと出続けているような現象になった。

おそらく、どんな小さい秒数にしても、最低1フレームは待つようになっている(結果的にそうなっている)のだろう。

PrintStringも似た仕様で表示時間がどんなに短くても、最低1フレームは出てくれるようだ。

結果的に1フレームだけ出るPrintが毎フレーム出ているので、文字が出続けるような現象になったのだろう。

これは、応用すればなかなか使えそうな感じがする……

ちょいたし-Delayを使ってTickもどきを作る レベル 【★★★】

たとえば以下のようなマクロを作る。

そしてこんなBrueprintを作る

この処理の結果、「K」ボタンを押した瞬間に毎フレームPrintが走り、「J」ボタンを押すと毎フレームの処理が止まって終了用のPrintが走りました。これぞ疑似Tick。

と、ここまでは良かったのですが、検証していて一つ気になる現象が現れました。

何回かMyTickを起動させていると、確率で押した瞬間だけ文字が2回出ている場合がある。(↓一瞬を捉えてやりました!)

おそらくですが、Delayは「最低必ず1フレーム待つ」という仕様なのではなく、どこかしらから「時間が来てんならさっさと処理しろよ!」ってう命令が全Delayに飛ばされて、それを受けてCompleteに処理されているのでは? という結論に至りました。

なのでたまたまStartしたタイミングがそのタイミングより前の場合は同フレーム内で処理されてしまう現象が起こった、と考えられるのではないかなと思います。

Delayで必ず1フレーム待って”見える”のは、単にCompleteに来るタイミングでは、すでにDelay処理しろよ命令は来終わっているからなのかな……そうだといいな。

(間違ってたらTwitterなどでボコボコにしてください)

※近い内にTimerEventとかのお話も書きます。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト