【学習】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 を忘れずに使いましょう。