Nexus Lab. Blog

0から始めるUnity物理演算②FixedUpdate

Milo


はいさーい! Milo です!
物理シミュを解説する本連載も、ついに第2回です
FixedUpdateとdeltaTimeについて、必要な知識を身につけましょう!
【Unity道場】物理シミュレーション完全マスターで勉強したことを元にしています。


この記事を書いたひと
最近勉強の機会をいろいろといただき、本当ありがたい限りです。


今日の目次です。比較的短いです。

毎度毎度、講義のスライドを見ながらですと理解しやすいです!

FixedUpdateとは

f:id:nexusyuumilo:20180127004442p:plain

ゲームは微小時間内に処理をして、それを連続につなげることで動きを表現してます。
この微小時間をフレームと呼んだりします。

f:id:nexusyuumilo:20180127004429p:plain

あるフレーム内に処理が終わらないと、次のフレームに超過分が借金されてしまいます。
さらに困ったことに、借金を返したフレームは、本来自分がすべき処理をせず休んでしまいます。

f:id:nexusyuumilo:20180127004652p:plain

では、休んだ分はどうなるのでしょう?
休んだ次のフレームが、2回処理を行うことで解決します。
このフレームがちゃんと仕事してくれないとまた借金することになるので、こいつを「責任重大フレーム」と呼ぶことにします。

f:id:nexusyuumilo:20180127004348p:plain

このように、責任重大フレームでは物理更新が2回されているんですね。
また、処理落ちがかさむと2回どころか3回、4回も1つのフレーム内で物理更新を行うハメになるので注意が必要です。

fixedDeltaTImeとは

物理更新1回にかかる時間がTime.fixedDeltaTimeです。
このdeltaTimeというのは微小時間を表わし、第1回で登場したdtに相当します。
"fixed"(固定された)とあるように、fixedDeltaTimeの長さは常に一定です。もし処理落ちしたら、責任重大フレームでもう一回fixedDeltaTimeをカウントすることで合計時間を正しいものに合わせています。

Update関数内ではTime.deltaTimeを使用しますが、deltaTimeは1回あたりの長さを調整してつじつま合わせをします。
具体的に言うと、処理落ちのあと、休んだフレームでのdeltaTImeは0になってしまいますが、
責任重大フレームでのdeltaTimeを長くすることで合計の時間は変化せず、正しいものに合っているのです。

どっちを使えばいいの?

よく物理計算はFixedUpdateでやれと言われますが、この辺の違いを理解してあえてUpdate
を使っているなら、それはそれで問題が起きないのでOKだそうです。

積分dtの間の変化量、微小なものを足し合わせる計算ですが、
足し合わせる量は FixedUpdateでもUpdateでも変化しません。

まとめ

  • 処理落ちのために、1つのフレームで複数回物理処理を行うことがある。
  • deltaTimeは微小時間 dtに相当
  • fixedUpdateを使おうが、Updateを使おうが、積分結果に影響はない。

次回は力についてです!