読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

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

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

全然無限じゃないのに無限ループと言われる問題

アルゴリズム ブループリント UE4.10

f:id:una_unagi:20160312214128p:plain

f:id:una_unagi:20160312214132p:plain

妹「パンチのボタンを押した時に、アニメーション中の特定のタイミングでだけ当たり判定を出したいんだけど、なんか無限ループだと言われるんだよ。タイミング的に1秒もないだろうし、全然無限じゃないよね?」

「なるほど、これは見事な無限ループですな

妹「えー……」

「アニメーションのフレームが切り替わるまでにたぶん数百回とか数千回とかループしちゃってて、その間他のブループリントは実行出来ないわけだから、これは無限ループだって言われるよ」

妹「この程度のことにティックを使うまでもないかと思ったんだけど」

「この場合は使っていいと思うよ。ブループリントを書く場所があれなら、先頭にイベントノードをくっつけて、そのイベントをティックから呼び出すようにすればこの場所に書いても問題ないわけだし。パンチ中のフラグが立ってる時だけ実行するようにすればたいして負荷もかからないはず。ただどうしてもティックは嫌だという場合には、こういう手もあるよ」

f:id:una_unagi:20160312214920p:plain

「基本的にDelayを挟めば無限ループにはならない。ただWhileLoopは内部でシーケンスノードを使ってるから、途中にDelayをつないでも無視して次のループが始まってしまって、結局無限ループになる。だからノードはちょっと汚くなるけど、単純にブランチを繰り返す設計に変える。それでDelayを挟むと思った通りの動作になるはず」

妹「これだと無限ループにならないの?」

「ならない。Delayのタイミングで他のブループリントとか諸々の仕事が進められるから。無限ループの何がいけないかっていうと、処理を独占しているからで、休み休みやってる分には何時間かかろうが何年かかろうが、無限ループという警告は出ない」