Developer

【初心者Unity】Time.timeの基本的な使い方
2021.09.30
Lv1

【初心者Unity】Time.timeの基本的な使い方

1.はじめに

本記事では、Unityで時間を扱うための最も入門的な機能であるTime.timeについて解説します。
Time.timeを使用することで、以下のことが実現できます。

  • ゲーム開始時からの経過時間を取得
  • ある時点からの経過時間を取得 etc…

解説には以下の構成を使用します。
自身で手を動かして確認したい方はこちらのファイルをインポートしてください。
【初心者Unity】unitypackageのインポートとエクスポート方法

Timerオブジェクトには以下のスクリプトがアタッチされています。
【初心者Unity】uGUI(Text)の使い方を詳しく解説

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

public class TimerScript : MonoBehaviour
{
    private Text timerText;
    
    void Start()
    {
        timerText = GetComponent<Text>();
        timerText.text = "0.00";
    }

    void Update()
    {

    }
}

2.Time.timeの仕組み

Time.timeはゲーム開始時から現在までの経過時間(秒)を表す変数です。
前回の記事では、フレームを跨いだ経過時間を取得するためにUpdate関数の中でTime.deltaTimeの和を求めていましたが、Time.timeを使用することで繰り返し処理を行わずに同様の値を取得することができます。

3.ゲーム開始時からの経過時間を取得

まずは、最も基本的な機能である、ゲーム開始時からの経過時間を取得してみます。
ゲームでの使用例としては、クリア時間の計測等が挙げられるでしょうか。

TimerScriptを以下のように記述します。

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

public class TimerScript : MonoBehaviour
{
    private Text timerText;
    private float elapsedTime; // 経過時間を格納する変数

    void Start()
    {
        timerText = GetComponent<Text>();
        timerText.text = "0.00";
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            elapsedTime = Time.time; // 経過時間を格納
            timerText.text = elapsedTime.ToString("0.00");
        }
    }
}

Time.timeは21行目で使用しています。
経過時間を表すelapsedTimeという変数を用意し、そこに格納しています。
22行目のToString(“0.00”)はfloat型をstring型に変換するメソッドです。
引数は変換後のフォーマットを意味しており、上記の書き方は「(四捨五入をし、)小数第2位まで表示する」ことを表しています。

以上で設定は完了です。ゲームを実行してみましょう。
左クリックをするたびに、その時点での経過時間が表示されるようになります。

4.ゲーム開始時から?

ここで少し、Time.timeの動作を検証してみましょう。
このTime.timeですが、シーンが切り替わった場合も値は引き継がれるのでしょうか?

スクリプトに以下の記述を追加します。

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        elapsedTime = Time.time; // 経過時間を格納
        timerText.text = elapsedTime.ToString("0.00");
    }
    // ↓追記
    if (Input.GetMouseButtonDown(1))
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

右クリック時に、現在のシーンを再読み込みする、という内容になります。
➡【初心者Unity】シーンの切り替え

ゲームを実行してみましょう。
カウントが0になっているタイミングでシーンのリロードを行っていますが、それまでの経過時間は引き継がれているようです。

検証は割愛しますが、全く別のシーンを呼び出した場合でも、同様の動作になります。
Time.timeで取得できる時間は、ゲームが開始してから現在までの経過時間です。
シーンが開始してから、ではないことに注意してください。

5.ある時点からの経過時間を取得

Time.timeの計測の始点はゲーム開始時ですが、書き方を工夫することで任意の始点からの経過時間を計測することができます。

TimerScriptの記述を以下のように変更します。

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

public class TimerScript : MonoBehaviour
{
    private bool beingMeasured; // 計測中であることを表す変数
    private Text timerText;
    private float start; // 計測の開始時間を格納する変数
    private float elapsedTime; // 経過時間を格納する変数

    void Start()
    {
        beingMeasured = false; // 初期値は「計測中ではない」状態
        timerText = GetComponent<Text>();
        timerText.text = "0.00";
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            beingMeasured = !beingMeasured;
            if (beingMeasured)
            {
                start = Time.time; // 開始時間を格納
                timerText.text = "計測中...";
            }
            else
            {
                elapsedTime = Time.time - start; // 経過時間を格納
                timerText.text = elapsedTime.ToString("0.00");
            }
        }
    }
}

発想は単純で、計測開始時の経過時間と計測終了時の経過時間の差分を求めれば、それが2点間の経過時間になる、というものです。
その際、後に参照する値となる「計測開始時の経過時間」を保持しておくために用意した変数がstartです。
26行目で「計測開始時の経過時間」を格納し、31行目で「計測終了時の経過時間」との差分(elapsedTime)を求めています。

実際にゲームを再生すると、以下のような動作になります。

6.おわりに

Time.timeの使い方について簡単に解説しました。
今回の記事で解説した内容は頻出ですので、是非ご自身で書けるように練習してみて下さい。
また、関連記事として以下を紹介します。併せてご確認ください。

【初心者Unity】Time.deltaTimeの基本的な使い方
【初心者Unity】Time.deltaTimeとTime.timeの使い分け
【初心者Unity】Time.timeScaleの基本的な使い方

 

連載目次リンク

「初心者のための」Unityゲーム制作 目次
 

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次