【Unity】Time.fixedDeltaTimeとTime.deltaTimeの違い

更新日:2023/05/22

別のページでUnityのUpdate()とFixedUpdate()について紹介しましたが、その中でTime.fixedDeltaTimeTime.deltaTimeの違いについて考察しました。
ここでは、考察した結果についてまとめています。

このページの目次

 

Time.fixedDeltaTime

Time.fixedDeltaTimeは前回の物理フェーズ(FixedUpdate())の開始から、現在の物理フェーズの開始までの経過時間を表す値がセットされています。

ただし、これは実際の経過時間ではなくて固定値でデフォルトは0.02です。

この値は、メニューEdit > project SettingsTimeにある、fixed timestepで設定できます。

Unityでは物理演算フェーズは、単位時間が上記メニューのMaximun Allowd Timestep(規定値0.3333333)を超えない限り、単位時間時間あたりに呼び出される回数が保証されます。

例えば単位時間を0.1秒とすると、0.1 割る 0.02 で、単位時間当たり5回物理演算フェーズが実行されます。

単位時間当たり5回物理演算フェーズが実行される

上の図の0.06秒付近はUpdate()が実行されているため、物理演算を行えていません。
この場合は、次の周期を待たずに即座に物理演算が実行されます。

FixedUpdate()の処理時間が非常に長かったときなど大幅にタイミングが遅れたときは、実行できなかった物理演算フェーズの回数分だけ即座に実行されます。

FixedUpdate</span><noscript><img decoding=

Update()の処理が重いときも同様です。

Update</span><noscript><img decoding=

これにより、単位時間あたりの物理演算フェーズの実行回数が保証されます。
そしてTime.fixedDeltaTimeが固定値であることで、FixedUpdate()が一定周期で呼び出されているような状況を作り出しています。

ここで問題になるのが、Update()よりも物理演算フェーズのつじつま合わせが優先される点です。

FixedUpdate()が毎回0.02秒を超えると、つじつま合わせでFixedUpdate()が呼ばれ続け、その結果Update()が呼び出されません。

Update()が呼び出されない

そこで、Maximun Allowd Timestep(規定値0.3333333)を超えたら、つじつま合わせを断念してUpdate()を呼び出します。

Maximun Allowd Timestepを超えたらUpdate()

ゲームでカクカクした動きになるのは、このような処理をおこなっているからです。

 

Time.deltaTime

Time.deltaTimeは、前回のフレーム(Update())から、今回のフレームの経過時間です。

ただしFixedUpdate()内では、呼び出し前にUnityがTime.fixedDeltaTimeの値をTime.deltaTimeにセットします。そのためTime.deltaTimeは物理演算の周期(デフォルト0.02)です。

Time.deltaTimeは、実際の時間経過がセットされます。

前項で挙げた図を見てもらうと分かりますが、FixedUpdate()やUpdate()等で重い処理を行うと大幅に周期がズレます。
その結果、Time.deltaTimeの値も大きく変化します。

更新日:2023/05/22

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。