【Unity】Unityにて時間計算をするときのまとめ

09/20/2018

Unity的な時間計算

はじめに

サマータイムが話題な今日この頃。突然時間がずれることは、Unityに限らずコンピュータには面倒な事案です。でもたぶんOS側でうまくやってくれるはず。業務システムを扱ってる頃ならちゃんとテストしないと・・・とか、立ち合いとか必要?なんて考えてましたが、無職の自分は作成したアプリだけ。
実際の対応は簡単だろと思ていますが、いざとなって慌てないように転ばぬ先のなんちゃらとして、今回はUnityで利用する時間計算についてまとめておきます。

Time

一番使うのは、Time型だと思います。

deltaTime

:最後のフレームを完了するのに要した時間(秒)(Read Only)
主にUpdateで使うと思いますが、フレーム間の時間が取れます。
サンプル

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeltaTimeTest : MonoBehaviour
{
    float time = 0.0f;
    int   x    = 0;
  void Update ()
    {
        time += Time.deltaTime;
        if (time > 1.0f)
        {
            x++;
            time = time – 1.0f;

            Debug.Log("時間 " + x + " 秒経過");
        }
   }
}

正確には計算できませんが、おおよそ1秒毎にDebug.Logが表示されます。FPS60(1/60) で動いていた場合、0.01666秒あたりの値が返ってきます。なので1秒ジャストを検知できませんので、厳密に計算したい場合は使えません。
サンプルのように誤差を織り込んで使います。体感的にはわからない程度の誤差です。同様にfixedDeltaTimeもFixedUpdateの間隔時間を取る違いで同じ扱いです。(fixedDeltaTimeではなく、deltaTimeを使えUnityは言ってますがw)

timeScale

timeScale:時間の経過をスケールします。スローモーション効果やポーズを実現します。残念ながら倍速とかはできません。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeTest : MonoBehaviour
{
    float time = 0.0f;
    int   x    = 0;

	void Update ()
    {
        time += Time.deltaTime;
        if (time > 1.0f)
        {
            x++;
            time = time – 1.0f;
            Debug.Log("時間 " + x + " 秒経過");
        }
        if (x > 10)
        {
            Debug.Log("ポーズ:停止します");
            Time.timeScale = 0.0f;
        }
  }
}

注意としては、時間は進まないだけだと認識してください。Update処理自体は呼ばれ続けます。スローモーション効果やポーズを実装したい場合は、時間を計算式に埋め込みや時間が関わる処理を必ず入れる必要があります。
下記のサイトがまとめてくれています。感謝

その他

あまり使いません。必要になったことはありません。

captureFramerate フレーム間で保存されるスクリーンショットを許可するためゲームの再生時間が遅くなります。
deltaTime 最後のフレームを完了するのに要した時間(秒)(Read Only)
fixedDeltaTime Physics や (MonoBehaviour の FixedUpdate のような) 他の固定フレームレートの更新を実行するインターバル(秒)
fixedTime 最新の FixedUpdate を開始した時間 (Read Only) 。これはゲーム開始からの時間(秒)です。
fixedUnscaledDeltaTime The timeScale-independent interval in seconds from the last fixed frame to the current one (Read Only).
fixedUnscaledTime The TimeScale-independant time the latest FixedUpdate has started (Read Only). This is the time in seconds since the start of the game.
frameCount 経過したフレーム数の合計(Read Only)
inFixedTimeStep Returns true if called inside a fixed time step callback (like MonoBehaviour’s FixedUpdate), otherwise returns false.
maximumDeltaTime フレームがとれる最大時間。( MonoBehaviour の FixedUpdate のように) Physics やその他固定フレームレートを更新します。
maximumParticleDeltaTime The maximum time a frame can spend on particle updates. If the frame takes longer than this, then updates are split into multiple smaller updates.
realtimeSinceStartup ゲーム開始からのリアルタイム(秒)(Read Only)
smoothDeltaTime 延ばした Time.deltaTime (Read Only)
time このフレームの開始する時間(Read Only)。ゲーム開始からの時間(秒)です。
timeScale 時間の経過をスケールします。これはスローモーション効果で使用できます。
timeSinceLevelLoad フレームが開始された時間 (Read Only) 。最後のレベルが読み込まれてからの時間 (秒) です。
unscaledDeltaTime The timeScale-independent interval in seconds from the last frame to the current one (Read Only).
unscaledTime The timeScale-independant time for this frame (Read Only). This is the time in seconds since the start of the game.

DateTime

日時を扱う事ができます。ちなみに、Unity2017以降.NET Framework 4.6.1みたいです。Unity2018.2.5から.NET Framework 4.7.1になるみたい。さっきですが警告が出るようになったんだよね。自分は、4.6.1で利用してるけど。


一番使うのが、現在の時刻取得だと思います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TimeTest : MonoBehaviour
{
    DateTime dateTime;
    TimeSpan timeSpan;
  void Update ()
    {
        dateTime = DateTime.Now;
    }
}

DateTime型は、DateTime型同志だと演算に利用できません。そのため、TimeSpanがあります。
1時間加算したい場合は、下記のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TimeTest : MonoBehaviour
{
    DateTime dateTime;
    TimeSpan timeSpan;
  void Update ()
    {
        dateTime = DateTime.Now;
        timeSpan = new TimeSpan(1, 0, 0);
        dateTime = dateTime + timeSpan;
    }
}

比較演算はガチで嬉しいです。
頭の片隅に機能があることを覚えておきましょう。

さいごに

結局 サマータイム対応ってどうやるんだっけ??といった謎には回答できてませんね。ですが実際にDateTimeはよく使います。スリープ処理復帰時に何分寝ていたのか? とか計算する時に必須になります。
ながくなったのでここまでにします。

スポンサーリンク