妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

妹、TickじゃなくDelayを使ってみた

妹「よく考えたら1秒待つのはTickイベントじゃなくてもDelay(ディレイ)ノードでいいのでは? やってみたらちゃんと動いたし」

f:id:una_unagi:20150624180948p:plain

「え……それで、その状態でもう一度敵に当たったら、ちゃんとイベント実行されてBranchノードで止まるの?」

妹「止まるけど……ほら」

「あ、ほんとだ。便利な世の中になったねえ」

妹「いやそれが普通なのでは。ちょっと待ちたい時っていっぱいあるでしょ」

「ちょっと待ってから続きをやるっての、コンピューター的には超ムズカシイ話なんだよ。ファイルの読み書きがムズカシイのと同じで。それが簡単に出来るように作ってあるから便利」

妹「いまいちピンとこないなあ」

「例えばDelayの代わりにループを……とりあえず1000万回ぐらいでいいか、これで時間を止めるとする。何秒かかるかはともかく、ちょっとだけ待って動くという同じ動作をするんだけど」

f:id:una_unagi:20150624181403p:plain

妹「そうなるんじゃないの?」

f:id:una_unagi:20150624181748p:plain

「こうなる」

妹「なんで???」

「無限ループだから。この場合は1000万回だから無限ではないけど、本当に無限かどうか確かめるには無限の時間がかかるわけで、一定時間経ったら止める」

妹「一定時間って、そんな経ってないと思うけど。1秒ぐらい?」

「ゲーム的には1秒もかかる処理は問題外」

妹「短かっ! 無限ループだと止めるのは先に進まなくて意味ないから?」

「いやそうじゃなくて、止めないとWindowsがまともに動かなくなってリセットするしかなくなるから。だから1秒ぐらいでもヤバイと判断して止める」

妹「そんな恐ろしいことをさらっとやるな!!!」

「最近のパソコンだとそこまで酷くなることはめったにないんだけどね。でも大昔のゲームではこうやって時間待ちしてたんだよ。Windowsみたいに沢山のを同時に動かす必要もなかったし、フリーズとゲーム中の待ち時間に区別してなかった」

妹「Delayだと待ってても強制終了しないのか?」

「しない。Delayはただ待つんじゃなく、待ってる間プログラムの実行権を他に明け渡すということだから。実はやってること自体はTickイベントと変わらない。Delayで待ってる間にキャラクタが動いてたり、別のイベントが実行されたりするから、その点に注意が必要」

妹「むしろDelayじゃない時に別のイベントが実行されないことの方がビックリしたよ。てっきり同時にやってるのかと」

「ほとんどの場合順番にやってるよ。高速でやるから全部一瞬に見えるけど。少なくともブループリントで作った部分に関しては、1度に1箇所しか動いてない」

妹「どういうことに注意したらいいんだ?」

「今回の例でいえば、他で無敵変数が書き換えられないかどうか。例えば無敵になってから0.7秒後に、別に3秒間無敵になるイベントが起きたとしても、その0.3秒後に最初の無敵の方で解除されちゃうから、3秒無敵の方は上手く機能しない」

妹「そういう場合はどうしたら」

「それぞれで別々の変数を作って、無敵の判定をするBranchでは無敵1と無敵2のORを判定条件にして、どちらかがtrueなら無敵にするとか」

妹「うーん……それだと3秒間は無敵になりそうだけど、上の場合で言うと足して3.3秒無敵にはならない感じ?」

「無敵時間の上書きじゃなくて追加がしたいなら、無敵変数をBooleanじゃなく数字にして、昨日説明したようなTickイベントを使えばいい。何もなければ元と同じ時間、途中で無敵時間が増えたら増えた分がなくなるまで無敵に出来る。Delayを細かく分けてループさせてもいい」

妹「Delayも大変なんだなあ」

「普通にプログラミングする分には気にしなくていいことだけど、知らないとバグった時に困るからね。あとシーケンスノードにDelayをつなぐとちょっと変わった動作するのも注意点」

もんしょの巣穴blog [UE4] SequenceとDelayの関係

「このサイトにまとまってたから、シーケンスとDelay両方使う時は読んどいた方がいいと思う。上手く使うと裏技的活用法もありそう」

妹「あ、ちょっと気になったんだけど、ゲーム的に1秒もかかるのは問題外って言うけど、フクザツな計算とかでそれぐらいかかる時もあるんじゃないの? ゲームボーイウォーズとか」

ゲームボーイウォーズ……は多分そういうの気にせず作ってると思うけど、計算の途中にDelayノードをいくつか挟んでおけばいいよ。その分計算は遅れるけど、強制終了したりパソコンが不安定になったりはしなくなる」

妹「それもDelayなのか。大変だけど便利だなDelay」