学習記事一覧 · Unityクラス

【学習】Time クラス(時間の取得)

Unity 入門シリーズでは、

  • Time.deltaTime でフレームレートに依存しない移動を学んだ

という形で時間に関する処理を書いてきました。

しかし、Time クラスには他にも便利なプロパティがあります。

Time クラス

の主な API をまとめて押さえましょう。

今回は Time の deltaTime、time、timeScale などを解説します。

今日学ぶこと

  • deltaTime … 前フレームからの経過秒数
  • time … ゲーム開始からの経過秒数
  • timeScale … 時間の進み方(0 で一時停止)
  • fixedDeltaTime … 物理演算の固定間隔
  • unscaledDeltaTime … timeScale の影響を受けない deltaTime

Time とは

Time は、時間に関する情報を提供する静的クラスです。new でインスタンスを作らず、Time.deltaTime のようにプロパティに直接アクセスします。

// 毎フレーム、秒速 5 単位で移動
transform.Translate(5f * Time.deltaTime, 0, 0);

deltaTime(前フレームからの経過秒数)

deltaTime は、前フレームから現在フレームまでの経過秒数です。PC の性能によってフレームレートが変わるため、移動量に deltaTime をかけると、どの環境でも一定の速度で動きます。

// 秒速 speed 単位で移動
float moveX = speed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
環境 1 フレームの deltaTime(目安)
60 FPS 約 0.0167 秒
30 FPS 約 0.0333 秒
120 FPS 約 0.0083 秒

deltaTime をかけることで、どの FPS でも「秒速 X 単位」の移動になります。


time(ゲーム開始からの経過秒数)

time は、ゲーム開始(再生ボタン)からの経過秒数です。タイマーや一定時間後の処理に使います。

// 5秒後に処理
if (Time.time > 5f)
{
    Debug.Log("5秒経過");
}

// 一定間隔で繰り返す(InvokeRepeating の代わりに)
if (Time.time - lastSpawnTime > spawnInterval)
{
    SpawnEnemy();
    lastSpawnTime = Time.time;
}

timeScale(時間の進み方)

timeScale は、ゲーム内の時間の進み方を制御します。

Time.timeScale = 0;   // 一時停止(Update は呼ばれるが、deltaTime が 0)
Time.timeScale = 1;   // 通常速度(デフォルト)
Time.timeScale = 0.5f; // スローモーション(半分の速度)
動作
0 一時停止。Update は呼ばれるが、Time.deltaTime は 0
1 通常速度
2 2倍速

注意:timeScale を 0 にすると、Time.deltaTime も 0 になるため、Time.deltaTime を使った移動は止まります。UI のアニメーションなど、一時停止中も動かしたい場合は Time.unscaledDeltaTime を使います。


unscaledDeltaTime(timeScale の影響を受けない)

unscaledDeltaTime は、timeScale の影響を受けない deltaTime です。一時停止中も動かしたい UI などに使います。

// 一時停止中も動くタイマー
timer += Time.unscaledDeltaTime;

fixedDeltaTime(物理演算の間隔)

fixedDeltaTime は、FixedUpdate の呼び出し間隔です。デフォルトは約 0.02 秒(50 回/秒)です。

void FixedUpdate()
{
    // 物理演算用の移動
    rb.AddForce(force * Time.fixedDeltaTime);
}

通常の移動では Time.deltaTime、物理演算では Time.fixedDeltaTime を使うことが多いです。


完成コード例

using UnityEngine;

public class TimeSample : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    private float spawnInterval = 2f;
    private float lastSpawnTime;

    void Start()
    {
        lastSpawnTime = Time.time;
    }

    void Update()
    {
        // フレームレートに依存しない移動
        transform.Translate(speed * Time.deltaTime, 0, 0);

        // 2秒ごとに何かする
        if (Time.time - lastSpawnTime >= spawnInterval)
        {
            Debug.Log("2秒経過");
            lastSpawnTime = Time.time;
        }
    }
}

重要ポイント

Time は時間に関する情報を提供する静的クラスです。

  • deltaTime … 前フレームからの経過秒数。移動量にかけてフレームレートに依存しない動きにする
  • time … ゲーム開始からの経過秒数。タイマーに使う
  • timeScale … 0 で一時停止、1 で通常、2 で2倍速
  • unscaledDeltaTime … 一時停止中も動かしたいときに使う
  • fixedDeltaTime … 物理演算の固定間隔

発展アイデア

  • InvokeRepeating … 一定間隔で処理を繰り返す(Time.time で自作も可能)
  • Coroutine + WaitForSeconds … 遅延実行。timeScale の影響を受ける
  • WaitForSecondsRealtime … timeScale の影響を受けない待機

Time クラスは ゲームの時間制御 に欠かせません。deltaTime を忘れずに使いましょう。