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

妹でもわかるUnrealEngine4

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

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

ブループリントではゼロ除算エラーは起きない

ノード解説 ブループリント UE4.10

※3/20 割る数と割られる数を逆にして実験してしまっていて、説明と図に間違いがあったので修正


妹「今コンストラクションで色々やる仕組みを作ってるんだけど、割り算の時にゼロって使っても良かったんだっけ? パラメータによってはそんな事になる可能性があるんだけど」

「ゼロを割ってもゼロになるだけなんだけど、何かをゼロで割ると駄目」

妹「でもなんか割れてるみたいなんだけど……」

f:id:una_unagi:20160321002201p:plainf:id:una_unagi:20160319213913p:plain

妹「別にエラーとかは出なくて。結果は0になってる」

「ほんとだ。アウトプットログにはWarningって出てるけど、強制終了はしてない」

f:id:una_unagi:20160320114620p:plain

f:id:una_unagi:20160319213958p:plain

「これが割り算ノードの中身というか、実際に実行されてるC++コード部分なんだけど、これを見ると割る数が0の時は、Warningを出して、そのあと割られる数を無視して0を返す仕組みになってる」

妹「0になるんだ」

「実際問題として、ゲームでは0で割ったら普通に0を返してくれるだけでいい場合が多いから、UE4以外でもこういう感じの0で割ったら0になる割り算マクロは使うことがある。もう1つの理由としては、エラーが起きたらそれを捕捉する仕組みがブループリントにはない。どうにかして続行するか強制終了かの2択。で、0ということにして続行という方法を選んでる」

妹「エラーが起きてるのに、強制終了以外の方法がありえるの?」

「色々事前に決めておく方法があるんだよ。ここからここまでの範囲で何かしらエラーが起きたら、今やってるプログラムは中断して、代わりに指定したイベントを実行する、みたいなことを。例外処理と言って、C++にはあるんだけど、ブループリントにはない。ただ割り算の中身を見ると、ブループリントにも例外処理を作ろうとしてる気配がある。FFrame::KismetExecutionMessageってやつ」

妹「それが完成すると……?」

「対応した例外処理を作るとか、自前で0で割らないようにチェックしてないと、警告ではなくエラーで止まってしまうようになるかもしれない。でも今のところは問題ない。もちろん問題ないのは0で割った結果が0でもかまわない場合の話で、それじゃ困る場合はやっぱり自前で0かどうかチェックしないと駄目だけど」

妹「Warningもなくした方がいいんだよね?」

「今回の場合はコンストラクションの時の初期値の問題ということだから、そんなに気にしなくても良さそうではあるけど、チェックするとしたら割る段階じゃなくてもっと前で、数字や設定座標が想定の範囲内かを調べるのがいいと思う。そうすると結果的にゼロ除算も起こらないようになるはず」