目次
※この記事で使用している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にアップされています
サンプルプロジェクト