スポンサーリンク
UnityUnityメモ

UnityのTimeクラスを徹底解説!正確な時間管理をマスターしよう

Unity

1. はじめに

Unityでゲームを作るとき、必ず直面するのが「時間の管理」です。
レースゲームでのラップタイム表示や、アクションゲームのカウントダウン演出、RPGでのスローモーション効果など…ゲームのあらゆる場面で正確な時間制御が求められます。

この時間制御をシンプルに、そして効率的に扱えるのがTimeクラスです。
ただ「Time.time」や「Time.deltaTime」を使えばOK、というレベルで終わらせてしまうと、フレームレートによる挙動のズレや、UIの表示がずれるなどのトラブルに悩まされることも少なくありません。

そこで本記事では、Timeクラスの基本から応用までをわかりやすく整理してご紹介します。初心者の方はもちろん、中級以上の方も「そういう使い方があるのか」と発見できる内容を目指しました。この記事を読み終えるころには、時間管理を武器にしてゲーム制作をより一歩前進できるはずです。

また、Unityの学習を進めるうえで体系的にC#やゲームロジックを身につけたい方には、以下の書籍もおすすめです。
学習のガイドブックとして活用すると、今回の内容がよりスムーズに理解できるはずですよ。




2. Timeクラスの基本

UnityのTimeクラスは、ゲーム内で利用できる時間に関する情報をまとめて提供してくれる便利な仕組みです。
「ゲーム開始から何秒経ったか」や「直前のフレームからどれだけ時間が経過したか」といったデータを簡単に取得できます。

代表的なプロパティを整理すると以下の通りです。

2-1. Time.time

ゲーム開始からの経過時間を秒単位で返します。
例えば、ゲームが始まって5秒後に呼び出すと 5.0 が返り、10秒後には 10.0 になります。
同一フレーム内で呼び出すと常に同じ値が返るため、計測用として非常に便利です。

2-2. Time.deltaTime

前のフレームからの経過時間(秒)を返します。
これはフレームレートが異なる環境でも、オブジェクトの動きを一定に保つために利用します。

例えば以下のコードでは、Cubeがフレームレートに依存せず常に一定の速さで移動します。

transform.Translate(Vector3.forward * 5f * Time.deltaTime);

2-3. Time.timeScale

時間の進み方を制御するプロパティです。
初期値は 1 で、0.5 にすれば時間の進みが半分になりスローモーション、2.0 にすれば倍速になります。
0 を指定するとゲーム全体が一時停止した状態になります。

このようにTimeクラスはシンプルですが、ゲームの挙動を大きく変える力を持っています。コードを試しながら学習を進めると理解が深まりますよ。

また、開発を効率化したい方には、スクリプトのパラメータを見やすく整理できるエディタ拡張「Odin Inspector」がとても便利です。インスペクター上で時間制御の値を直感的に調整できるので、デバッグ効率も格段にアップします。
👉 Odin Inspector & Serializer(Unity Asset Store)


3. 実装例:経過時間・カウントダウン

ここからは、実際にTimeクラスを使った具体的な実装例を紹介します。
ゲームに欠かせない「経過時間の計測」と「カウントダウンタイマー」を取り上げます。

3-1. 経過時間の計測

ゲーム開始からの経過時間を表示する簡単な方法です。
スクリプトを作成してオブジェクトにアタッチし、Update()メソッドで Time.time を出力します。

using UnityEngine;

public class TimeManager : MonoBehaviour
{
    void Update()
    {
        Debug.Log("経過時間(秒): " + Time.time);
    }
}

ゲームを再生すると、Unityのコンソールに毎フレームごとの経過秒数が表示されます。

3-2. カウントダウンタイマー

次に、特定の時間(例:60秒)から残り時間を減らしていくカウントダウンを実装してみましょう。

using UnityEngine;

public class CountdownTimer : MonoBehaviour
{
    public float startTime = 60f;

    void Update()
    {
        float remainingTime = startTime - Time.time;
        if (remainingTime < 0) remainingTime = 0;

        Debug.Log("残り時間(秒): " + remainingTime);
    }
}

残り時間が0以下にならないように条件分岐を入れているのがポイントです。
これをUIのTextやTextMeshProと組み合わせれば、ゲーム画面上にわかりやすく表示できます。

3-3. デバッグ効率を高めるツール

上記のように時間をログ出力して確認する場面は多いですが、コンソールがログで溢れてしまうこともあります。
そんなときにおすすめなのが「Editor Console Pro」です。検索・フィルタリング・カラー分け機能を使ってログを管理できるので、時間計測のデバッグが格段に快適になります。

👉 Editor Console Pro(Unity Asset Store)


4. 応用的な時間制御

ここからは、実際のゲーム制作で一歩踏み込んだ時間管理テクニックを紹介します。スローモーション、物理の固定ステップ、UIだけ等速で動かす方法、フレーム落ち対策、動画収録のための制御まで一気に押さえましょう。

4-1. スローモーション&一時停止(Time.timeScale)

ゲーム全体の時間の流れは Time.timeScale でコントロールできます。

  • 1.0 … 等速(初期値)
  • 0.5 … 1/2 速度(スローモーション)
  • 0.0 … 実質ポーズ(Updateは呼ばれるが deltaTime は0)
// スロー演出(1/10 速度)
Time.timeScale = 0.1f;

// 一時停止
Time.timeScale = 0f;

// 解除
Time.timeScale = 1f;

ポイント: ポーズ中でもUIアニメやカウントダウンを動かしたい場合は、後述の unscaledDeltaTime を使います。

4-2. 物理挙動は「固定時間ステップ」で!(FixedUpdate × Time.fixedDeltaTime)

物理演算は固定フレームで計算されます。間隔は Time.fixedDeltaTime(既定は0.02秒=50Hz)。物理に関わる処理は FixedUpdate に書くのが基本です。

void FixedUpdate()
{
    // 物理挙動はここで
    // 例:Rigidbodyへの力の加算など
}

設定の目安: 高速アクションなら 0.02 → 0.0167(約60Hz)にすると判定が安定しやすくなります。激重なら上げすぎ注意。

4-3. UIは時間スケールの影響を受けないようにする(unscaled 系)

スローモーション中でもUIだけ等速で動かしたいときは、Time.unscaledTime / Time.unscaledDeltaTime を使います。

using UnityEngine;
using UnityEngine.UI;

public class CountdownUI : MonoBehaviour
{
    public Text timerText;
    public float remain = 10f;

    void Update()
    {
        // timeScaleの影響を受けない減算
        remain -= Time.unscaledDeltaTime;
        if (remain &lt; 0) remain = 0;

        timerText.text = $"残り: {remain:F1}s";
    }
}

ポイント: アニメーションやフェード、進捗バーなど「ゲームの進行」とは独立させたいUIに最適です。

4-4. 急激なフレーム落ち対策(maximumDeltaTime / smoothDeltaTime)

  • Time.maximumDeltaTime:一時的なカクつきで deltaTime が異常に大きくなるのを抑える上限。壁抜けなどのバグ低減に役立ちます。
// 1フレームあたりの最大経過時間を 0.05 秒に制限
Time.maximumDeltaTime = 0.05f;
  • Time.smoothDeltaTime:最近の deltaTime を平滑化した推定値。カメラの追従やUIアニメの「フレームごとのブレ」緩和に便利。
// 例:カメラ追従を滑らかに
transform.position = Vector3.Lerp(
    transform.position,
    target.position,
    5f * Time.smoothDeltaTime
);

4-5. フレーム精度を揃えた動画・連番出力(Time.captureFramerate)

プレイ動画の連番キャプチャなどでフレーム間隔を固定にしたい場合は Time.captureFramerate を使用します。指定フレームレートの「時間刻み」で Update が進むため、カクつきのない素材を収録できます。

// 連番キャプチャ用途:30fpsで時間を進める
Time.captureFramerate = 30;

// 収録を終えたら必ず戻す
Time.captureFramerate = 0;

注意: 実行速度は実時間より遅くなります(録画の安定性を優先)。通常プレイ向けでは使いません。

4-6. デバッグ効率を上げる小ワザ

  • パラメータをインスペクターで直感調整:スロー倍率や固定ステップ値をスクリプトのフィールドにしておき、実行中に微調整すると最適値を見つけやすいです。エディタ拡張でさらに見やすくしたいなら、Odin Inspector & Serializer が便利。
  • ログを素早く仕分け:時間計測や警告をタグ別にチェックしたいときは、Editor Console Pro のフィルタリングが役立ちます。

4-7. 実装ステップ(手順の型)

  1. プロジェクトウィンドウを右クリック「Create」→「C# Script」を選び、新しいスクリプトを作成し、「TimeController」と名前を付けます。
  2. 作成したスクリプトをドラッグ&ドロップで、検証用の空オブジェクト(例:TimeDemo)にアタッチします。
  3. スロー倍率(timeScale)や固定ステップ(fixedDeltaTime)などの公開フィールドを用意し、再生中に値を調整して最適化します。
  4. UIだけ等速にしたい処理は unscaledDeltaTime を使用、物理関連は FixedUpdate に寄せる、という役割分担を徹底します。

体系的にC#と時間管理を学ぶなら、基礎~実践まで一冊でつながる書籍もおすすめです。


5. まとめ

今回はUnityでゲーム開発を行う上で欠かせないTimeクラスについて、基本から応用までを徹底的に解説しました。
単純に「時間を取得する」だけでなく、deltaTimeを活用してフレームレートに依存しない動きを実現したり、timeScaleでスローモーションや一時停止を実装したりと、Timeクラスはゲーム演出や正確な挙動に直結する非常に重要な機能です。

また、物理挙動に関わるFixedUpdateとfixedDeltaTime、UIの独立制御に便利なunscaledTime系、フレーム落ち対策に使えるmaximumDeltaTimeなど、知っておくと開発がグッと安定するテクニックも紹介しました。
これらを正しく理解し使い分けることで、より自然で快適なプレイ体験をユーザーに届けられるようになります。

実際にプロジェクトで試しながら調整するのが理解の近道です。特にゲームの進行管理やUIの制御などは実装後に「なるほど!」と思うことが多いので、ぜひ小さなサンプルから試してみてくださいね。


あわせて読みたい


よくある質問(FAQ)

Q
Time.deltaTimeを使わないとどうなる?
A

フレームレートが高いPCではオブジェクトが速く動き、低いPCでは遅く動くなど、動作が不安定になります。
必ず deltaTime を掛けてフレームレートに依存しない処理を行いましょう。

Q
Time.timeScaleを0にするとゲームは完全停止する?
A

ほとんどの挙動は停止しますが、Updateは呼ばれ続けます。
また、unscaledDeltaTime を使えば、ポーズ中でもUIやエフェクトを動かすことが可能です。

Q
UIのカウントダウンがスローモーションの影響を受けて遅れてしまうのはなぜ?
A

通常の deltaTime を使っているからです。
スロー演出中も等速でUIを動かしたい場合は、Time.unscaledDeltaTime を使うようにしてください。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク