【Unity】時間計測の方法|ミリ秒・分秒タイマーを実装

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

時間計測を行い、ゲーム終了後にタイマーを停止してシーン切り替えて結果を表示

Unityでゲームを作成する際、時間管理やタイマーの導入はゲームの面白さを左右する重要な要素です。特にアクションゲームやパズルゲームなどでは、時間制限を設けたり、経過時間を計測したりすることでゲームプレイに緊張感や達成感を与えられます。

本記事では、unityで時間管理するメソッドを紹介して、時間計測やタイマーをゲーム内に導入します。

本記事は次の人におすすめ
  • Unityで制限時間付きのゲームを作りたい方
  • ゲーム内で経過時間を表示したい方
  • ゲームオーバー処理を時間で制御したい方
  • ミリ秒単位の高精度タイマーが必要な方
  • 時間経過で自動的にシーンを切り替えたい方
Udemyで学習する
スポンサーリンク

Unityで時間計測とタイマー

Unityでのゲーム開発において、時間計測やタイマー機能は非常に重要な位置を占めます。

ゲーム内で時間制限を明確に設定することにより、プレイヤーに対して緊張感や達成感を生み出し、ゲームのテンポを一定に保つことができるためです。

例えば、クイズゲームでは制限時間を設けることで迅速な判断を促し、制限時間内に答えられなければ不正解とする。カードゲームではプレイヤーが一定時間内に行動をしなければ自動的にターンが次のプレイヤーへと移る仕組みを作ることで、円滑な進行を促します。

Unityで4択クイズの作り方を紹介しています。

さらに、RPGゲームではクリアタイムを競うタイムアタック要素を設けることで、プレイヤーのモチベーションを維持したり、競争心を高めたりできます。また、時間制限がプレイヤーに明確に示されることで、プレイヤーがより戦略的にゲームを進めたり、瞬時の判断力が求められたりするため、ゲームへの没入感や興奮度を高めることにも繋がります。

こうした様々な側面から、時間管理はゲーム制作において不可欠な要素となっています。

以下で、Unityの時間計測やタイマー機能を実装するために必要な具体的メソッドを詳しく見ていきます。

Time.time

Time.timeUnityにおける基本的な時間計測メソッドで、ゲームの開始時から現在までの経過時間を秒単位で取得できます。

初心者でも簡単に利用でき、主にシンプルな経過時間表示や簡単なタイマー機能の実装に使えます。

実際のコードでは次のように書きます。

void Update()
{
    float elapsedTime = Time.time;
    Debug.Log("経過時間: " + elapsedTime + "秒");
}

毎フレームごとに経過時間をログに表示しています。素早く実装可能です。

ただし、この方法はあくまでも基本的な時間計測に向いており、細かい制御には不向きな場合があります。

Time.deltaTime

Time.deltaTimeは前フレームからの経過時間を取得する方法であり、特に動きのあるゲームや毎フレーム更新されるタイマーの実装に適しています。

実際のコードでは次のように書きます。

private float timer = 0f;
void Update()
{
    timer += Time.deltaTime;
    Debug.Log("累計時間: " + timer + "秒");
}

このコードはフレームレートに依存しないため、異なる端末や環境でも均一な動きを提供できます。移動速度の制御やアニメーションの時間管理にも非常に有効です。

Time.timeとTime.deltaTimeの違いは?

コード例を見ると、両者に違いがなくTime.timeの方が短く記述できるので、Time.deltaTimeの意味がなさそうに見えるでしょう。

Time.timeはゲーム開始からずっと加算される絶対時間ベースの処理です。タイマー、経過時間判定などに使えますが、リセットをすることができないので色々と不便です。

一方Time.deltaTimeは、前のフレームから今まで何秒経ったか。移動・回転・アニメーションなどをフレーム依存なしで進めることが可能です。

Stopwatch

StopwatchはUnityで高精度の時間計測(ミリ秒単位)が可能なメソッドです。これは主にベンチマークテストや処理の最適化を目的とした精密な処理時間の測定に使われます。

実際のコードでは次のように書きます。

using System.Diagnostics;

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// 計測したい処理
stopwatch.Stop();
Debug.Log("処理時間: " + stopwatch.ElapsedMilliseconds + " ms");

特定処理にかかる正確な時間をミリ秒単位で取得でき、パフォーマンス改善に役立ちます。特徴として、名前空間で「System.Diagnostics」が必要です。

ミリ秒のタイマー

Unityでミリ秒単位の高精度タイマーを導入する場合、Stopwatchが最も推奨されます。
特にリアルタイム性を求めるゲームや、処理精度を要求されるシミュレーションなどで有効です。

Stopwatch timer = new Stopwatch();
timer.Start();
// 時間を測る処理
timer.Stop();
long milliseconds = timer.ElapsedMilliseconds;
Debug.Log("経過時間: " + milliseconds + " ms");

番外編:Coroutine + WaitForSeconds

一定時間後に処理を行う際に役立つのが、CoroutineとWaitForSecondsです。これは遅延処理やクールタイムの実装で頻繁に利用されます。したがって、時間計測には向かないです。例えば、クイズゲームで解答表示3秒後に次の問題を出題するというときに使います。

コールチンについて解説しています。

例として、3秒後に特定の処理を行うコードは以下です。

実際のコードでは次のように書きます。

IEnumerator DelayedAction()
{
    yield return new WaitForSeconds(3f);
    Debug.Log("3秒経過しました。");
}

void Start()
{
    StartCoroutine(DelayedAction());
}

このように、指定した時間経過後に処理を自動的に実行できるため、イベント制御やゲームロジックの調整に非常に便利です。

ゲームクリア後、シーン遷移して時間計測結果を表示する

これまでの方法を踏まえて、実際のゲームでクリアタイムを分秒表示し、クリア後はタイマーを停止シーンを移動して結果を表示する機能を作ります。

シーン移動やドラッグ&ドロップは別記事で紹介していますので、本記事ではタイマーのみ解説をします。

ドラッグ&ドロップについて解説しています。

実装にはTime.deltaTimeを使った簡易タイマーを使います。それぞれのオブジェクトにドラッグ&ドロップ機能をつけて、クリア時にタイマー停止後シーンを遷移し、結果表示します。

ソースコード1

using UnityEngine;
using TMPro;

public class Timer : MonoBehaviour
{
    [SerializeField] private TMP_Text timerText; // ゲーム中のタイマー表示用
    private float elapsedTime = 0f;
    private bool isRunning = true;

    // クリア時の最終時間を保持する static 変数
    public static float finalTime = 0f;

    void Update()
    {
        if (isRunning)
        {
            elapsedTime += Time.deltaTime;
            int minutes = Mathf.FloorToInt(elapsedTime / 60f);
            int seconds = Mathf.FloorToInt(elapsedTime % 60f);
            timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
        }
    }

    // タイマー停止時に最終時間を保存する
    public void StopTimer()
    {
        isRunning = false;
        finalTime = elapsedTime;
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/



解説

  • 名前空間

「UnityEngine」:Unityの基本機能を利用するために必要。GameObjectやMonoBehaviourクラス、Timeクラスなどが含まれる。
TMPro」:TextMeshProコンポーネントを使用し、高品質なテキスト表示を実現するために必要。

TextMeshProの導入と日本語取り扱いの解説をしています。
  • フィールド(メンバ変数)

「timerText」:ゲーム画面に経過時間を表示するTextMeshProコンポーネントへの参照。
「elapsedTime」:ゲーム開始から経過した時間(秒)を保持するための変数。
「isRunning」:タイマーが現在動作中かどうかを示すフラグ(trueで動作中、falseで停止)。
「finalTime」:ゲームクリア時に計測した最終時間を保持するstatic変数。他のクラスからも参照可能。

  • Updateメソッド

タイマーが動作中(isRunningがtrue)の場合、経過時間(elapsedTime)に前フレームからの経過時間(Time.deltaTime)を加算する。経過時間を分と秒に分解し、テキスト形式(MM:SS)でtimerTextに表示する処理を行う。

  • StopTimerメソッド

タイマーを停止する際に呼ばれ、isRunningフラグをfalseに設定して計測を停止させる。同時に、計測された経過時間をfinalTimeに格納し、クリア時の最終時間として保持する。

実演

タイマースクリプトはゲームマネージャーなど共通管理用オブジェクトにアタッチします。

ゲームを再生すると、冒頭で紹介したような挙動が可能になります。

経過時間を画面上に表示(TMP_Textコンポーネント)ゴールした時点でTimerクラスのStopTimerメソッドを呼び、タイマーを止めます。

まとめ

本記事ではUnityの時間管理やタイマー機能を詳しく解説しました。

Time.time、Time.deltaTimeの基本的な使い方から、Stopwatchを利用した高精度タイマー、Coroutineを利用した時間制御の方法まで、幅広くカバーしました。

これらの技術を活用し、より質の高い、魅力的なゲームを作りましょう。

Udemyで学習する
タイトルとURLをコピーしました