Time.timeScaleを変更した上でdeltaTimeを取る方法

一口にTime.timeScaleを取ってみても注意点は幾つかあると思いますけど、この記事ではTime.timeScaleの値を変更したときに、Time.deltaTimeも一緒にずれてしまうのでその計算方法についてです。

Time.deltaTimeと、Time.realtimeSinceStartup

ゲームなどでよくある制限時間などは、Time.deltaTimeを利用して計算することが多いです。しかし、Time.timeScaleを変更すると、そのTime.deltaTimeの時間の流れをも変えてしまいます。(どう変わるかは後述します)

まず、Time.timeScaleの値の意味合いは以下になります。

  • Time.timeScale = 1.0f (通常(1倍速))
  • Time.timeScale = 2.0f (2倍速)
  • Time.timeScale = 0.5f (0.5倍速)

そのため、Time.deltaTimeも上記の速度になるので、Time.timeScaleが1fでないと実際の時間(1倍速)とはずれてしまいます。それは困りますよね。『おれ、ゾーンにでも入っているのか…』みたいな気持ちにさせてしまうかもしれませんよね。まぁそれはそれでアリな気もしなくはないですけど。

ということで、この場合に使えるgetterが用意されているわけです。それが、Time.realtimeSincesStartupです。これは、ゲームの開始から実際の時間軸で起動時間を計測しているので、この起動時間を利用すればTime.timeScaleに影響せずにdeltaTimeが取れるようになります。

そこで、Time.timeScaleと、Time.deltaTime、Time.realtimeSincesStartupを検証してみました。検証に使ったスクリプトと結果は以下になります。この結果のように、Time.timeScaleの値を変更しているときは、Time.realtimeSincesStartupを使ってdeltaTimeを計算できますよーという話でした。(多少のズレはご愛嬌ということで…)