俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

Godot GDScript 13 「delta(デルタ)と秒速」 ... _process(delta)

前回、_process(delta)のばーちゃんファンクション内で、「自分で設定した秒速・秒角の変数に"delta"を掛け忘れるな。」という話をしたが、もっと簡単な説明の仕方を思いついたので、書いておこうと思う。とは言っても、やっぱりバカには分からないので、いちいち理解しようとせず「my_speed * delta」にするとでも暗記しちゃおう。煽っているわけではなく、俺からのアドバイス。今回は速度にのみ焦点を絞って解説する。 f:id:ore2wakaru:20180311190015p:plain


PCとFPS

イイPCなら200FPS、しょぼいPCなら50FPSとか書いたけど、これは忘れていいな。だって、普通、処理が重い所でFPSが下がって、処理が軽い所でFPSが上がるやん。可変なんだよFPSって。イイPCだからといって、常時ピッタリ200FPSなワケがない。kuso悪い説明だったな。FPSで説明しようとするヤツはバカだと思っていいな。

FPSが可変なのに、1秒間に進む距離を揃えましょうとする試み」、ここが真のポイントだ。


秒速10メートル(10m/s) とは

[1]

1秒間に10メートル進む、これが秒速10メートル(10m/s)だよな。直進な。図にするとこうだろ。
f:id:ore2wakaru:20180311143241p:plain

[2]

では、2秒だったら何メートル進む? 当たり前だが20メートルだよな。2秒で20メートル進むのが、秒速10メートルだよな。式は、こうだろ。「10(m/s) × 2(s) = 20(m)」だ。 f:id:ore2wakaru:20180311143449p:plain

だが、もうバカには付いてこれないだろ。「なんで20メートル進んでるのに、秒速10メートルなんだよ! 20なのに10って何だよ!」ってなる。だから、「my_speed * delta」で暗記しろって言ってんだよ。結果、20メートル進もうが、これは秒速10メートル。(つまりは、1秒間には10メートル進むぜってことね。)ここを理解する能力のある人だけ次に行こう。

[3]

じゃあ、0.5秒だったら何メートル進む? ちょっと難しいか? 5メートルだよな。
f:id:ore2wakaru:20180311143920p:plain
どうやって導き出した? ここが大問題だ。0.5秒は1秒の半分だから、進む距離の方も半分にする。つまり2で割って、「10メートル ÷ 2 = 5メートル」? これではダメだ! 答えとしてはマルだ。だが、考え方がバツだ。

[2]でどう式を立てた? 「速度(10m/s) × 時間(2s) = 距離(20m)」で式を立てたろ。今回もそう考えるんだ、つまり、「10(m/s) × 0.5(s) = 5(m)」とするんだ!
速度 × 時間 = 距離
にこだわるんだ。しかもイイか、5メートルしか進んでないが、これだって立派な秒速10メートルなんだぜ! (1秒間にすると10メートル進んでるのと一緒ってこと。)

「なんで10に0.5をかけると、5になるの???」という人は、もうおしまいだ。お疲れさん。「my_speed * delta」で暗記しろ。

[4]

さあ、もう1段先に進むぞ。今度は、0.2秒の時だ。何メートル進むかだけでなく、式にもこだわるぞ。
f:id:ore2wakaru:20180311151549p:plain
もう大丈夫だよな。「10(m/s) × 0.2(s) = 2(m)」だ。(何度も言うが、1秒に直すと10メートル進む。)

「0.2(秒)は1(秒)の5分の1だから、10(メートル)を5で割って~」としか思いつかない人は、「delta」は到底理解できないので、「my_speed * delta」で暗記だ!


秒速10メートルに、かかった時間を掛けてやれば、進みたい距離がでる。だが、20メートルだ、5メートルだ、2メートルだと、進んだ距離が違っても、それは何秒かかったかによる違いで出ただけで、秒速10メートルであることは不変。つまり、1秒間に10メートル進みたいって思いは変わらないってことだ。
f:id:ore2wakaru:20180311163858p:plain

上の図でいくと、ABCDは、それぞれ1回で進んでる距離は違うけど、どれも秒速10メートルで平等ってことだ。1回に進む距離と時間と秒速の関係が分かればイイ。単純に言うと、「かかった時間が違っても、どれも平等にしたかったら、秒速に、かかった時間を掛けてやればイイ(秒速×かかった時間)」となる。ここまで理解できた人はもう大丈夫だ。「delta」との関係の話に進もう。

やっぱり意味不明という人は「my_speed * delta」暗記でいいよ。もう、さいなら。


delta との関係

[5]

続き。では、delta秒だったら、どう? 何メートル行く? どーする? 式、頭の中に出た? 

  • 0.5秒で 「10 × 0.5 = 5」で、 5メートル。
  • 0.2秒で 「10 × 0.2 = 2」で、 2メートル。

だったよね。

  • delta秒なら、 「10 × delta = 10delta」で、 10deltaメートルじゃろ。

f:id:ore2wakaru:20180311160450p:plain

で、復習。「delta」には、_process(delta)が前回何秒前に呼ばれたかの情報が入るっている。復習終わり。

これは前回の処理から「delta」秒経ってるってことで、つまりは、「delta」かかった時間と同意だ。それから、「delta」は可変だろ。PCの処理の重さで色々変わる。処理が重ければ0.2とか(5FPS)入るし、処理が軽ければ0.004(250FPS)とかが入る。

だが、どんな数値が入ってようと、秒速10メートルなら、1回の処理で進ませたい距離は「10delta」メートルという事になるよね。

[6]

で、秒速10メートルじゃなくて、一般化して、"my_speed"にすれば、こうなる。
f:id:ore2wakaru:20180311182054p:plain

「delta」にどんな数値が入ってようと、1回の処理で進ませたい距離は「my_speed * delta」メートルという事になる。おっ、なんか出たゾ。


まとめ。

可変時間下で、いやいやえーっと、「かかった時間が違っても、どれも結局1秒間に進む距離を平等にしたい時は、秒速×かかった時間。」、これでイイ。 f:id:ore2wakaru:20180311174751p:plain

最後の最後で意味不明~~って人は、あれだ、「my_speed * delta」の暗記組だ。もうちょいだったのに、おしかったな。残念!


何? 秒速じゃなく、時速にしたい? 何言ってんだ! 「delta」の単位はなんだよ。だから、秒速で考えろ!

0.0167秒が何時間か計算したい人だけ、時速で考えろってこと。


_process(delta)が呼ばれる間隔(delta秒)を利用し、1回に進む距離を違えることで「1秒間に進む距離は一定」を実現する。分かったかな?

「やっぱり分からん」って言う人は、、、

もういい加減覚えたろ? 「my_speed * delta」

分からん時は、「一時的にも暗記する」、これって大事だろ。これが真の狙い。