【Unity】簡単!時間制限、計測を画面に表示する方法

Creating Game

こんにちは。あっきーです。
Unityでゲームを制作をしているニートです。

ゲームを制作していると、時間を考慮する必要が出てくるんですよね。

  • 制限時間を設定
  • タイムアタック機能を追加
  • 〇〇秒後にビーム

こういったプログラムを実装する方法をここで紹介していきます。
具体的な内容は以下の通りです。

  • 時間のカウントアップ・ダウンのやり方
  • 時間を「1:00:00」のように「時間:分:秒」と画面に表示する方法
  • 一定時間過ぎた後にある行動を実行する方法

初めにUnityでプロジェクトを開いて、画像のように設定をしておきましょう。

  • Canvasを追加
  • TextMeshPro(UI)を追加
ちなみに、TextMeshProでなく普通のTextを使っても良いんですが、TextMeshProが完全上位互換なのでこっちをおすすめします。

時間経過では”Time.DeltaTime”が優秀です。

カウントアップ・ダウンのやり方ですが、結論はTime.DeltaTimeを使うのが一番早いです。
先にスクリプトを紹介します。(スクリプト名は”TimerText”としています。)


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class TimerText : MonoBehaviour
{
    private TextMeshProUGUI timerText;
    private float timer;

    // Start is called before the first frame update
    void Start()
    {
        timerText = GetComponent();
        timer = 0;    
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        timerText.text = timer.ToString("f2");
    }
}

このスクリプトをTimerTextオブジェクト(最初に作ったTMPオブジェクト)にアッタッチして実行します。
すると以下のように、タイマーを作ることができます。

コードの解説をしていきます。

“Time.deltaTime”の使い方

Time.deltaTimeというのは、1フレーム間の時間の長さです。
フレームという言葉が出てきましたが、簡単に言えば、現時点から次の行動に移るまでが1フレームです。なので、行動と行動の間の時間がこのTime.deltaTimeで表せるということです。

これをtimerという変数にどんどん加えていくことで時間経過を表すことができます。
timer += Time.deltaTimeの中の+=は「右辺を足していく」という記号です。よく使うので覚えておきましょう。

Time.deltaTimeUpdateメソッドの中で使うことで意味があります。というのも先ほどの通りフレームに関することなので、毎フレーム処理を行うUpdateでこの処理を書くことでカウントアップが可能になっています。

ちなみに、カウントダウンを実装する場合は +=の部分を-=にすればOKです。

時間を画面に表示する

時間を表示するには、もちろん時間の値を持ったtimerを使えば良いんですが、1つ工夫が必要です。
timerText.text = timer.ToString("f2")のように、ToStringメソッドを利用します。

これは、文字表示なのでstring型にしないといけないんですが、timerfloat型なので、型を変換させないといけないからです。

ToString("f2")のように、()内に文字に変換した際の表記方法を設定することができます。今回の”f2″は「小数第2位まで表示する」という意味になります。

時間を表示するには”時間” “分” “秒” で数値をそれぞれ分ける

ゲーム開発をしていくとおそらく時間を”1:23:45″のように「〇時間〇分〇秒」という形式で表示したくなります。
これを実装してみましょう。

先ほどのスクリプトを変更します。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class TimerText : MonoBehaviour
{
    private TextMeshProUGUI timerText;
    private float second;
    private int minute;
    private int hour;

    // Start is called before the first frame update
    void Start()
    {
        timerText = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        second += Time.deltaTime;

        if(minute > 60)
        {
            hour++;
            minute = 0;
        }
        if(second > 60f)
        {
            minute += 1;
            second = 0;
        }

        timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
    }
}

これを実行すると以下のように時間を表示させることができます。

60秒経過すると分の値が1増えて、「1分〇〇秒」と表示できているのが分かりますね。1時間経過しても同様に表示されていきます。

コードの解説に映ります

「60分→1時間」、「60秒→1分」と計算していく

ここでは「時間」「分」「秒」の値を分けて考えます。コードにあるようにhour, minute, secondで分けていきます。

second += Time.deltaTimeは先ほど説明した通り、経過時間を表してます。


        if(minute >= 60)
        {
            hour++;
            minute = 0;
        }
        if(second >= 60f)
        {
            minute++;
            second = 0;
        }

ここがポイントで、minuteが60を超えたら、つまり60分経つとhourに1加えるという操作をしています。
同様に、secondが60を越えたら、つまり60秒経つとminuteに1加えるという操作を行っています。

ちなみにhour++などは「1加える」という意味です。

最後に
timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
と文字表記をすればOKです。

ちなみに、ToString("00")は「int型(整数)の値を2桁で表示する」という意味で、0を”00″, 1を”01″のように表現できます(見栄えの都合でこういう表記にしています。)

if文で条件をつけることで「一定時間経過」を表現

これについては言葉だけで説明します。

答えはもうお伝えしていて、先ほど「60秒→1分」という操作をした際にif文を使いましたね。これと同じ方式でやればOKです。

ifを使って「5秒後にオブジェクトを生成する」みたいな処理が書けます。これができると「チャージショット」のようなプログラミングも書けるようになります。

まとめ

ということで、今回は時間制限、計測を画面に表示する方法を解説しました。
カウントアップだけの例を見せましたが、カウントダウンも全く同じですね。”+”を”-“に変えるだけでOKです。

では、さっそくUnityライフを楽しみましょう。
それでは、素敵な1日を。

【時間測定のテンプレート。ご利用ください】


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class TimerText : MonoBehaviour
{
    private TextMeshProUGUI timerText;

    //時間、分、秒を表示する用
    private float second;
    private int minute;
    private int hour;

    // Start is called before the first frame update
    void Start()
    {
        timerText = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        second += Time.deltaTime;

        //60分→1時間に置き換え
        if(minute >= 60)
        {
            hour++;
            minute = 0;
        }
        //60秒→1分に置き換え
        if(second > 60f)
        {
            minute++;
            second -= 60f;
        }

        //時間を表示
        timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
    }
}

人気記事現役大学生が告白!大学生がブログを始めるのをオススメする理由

人気記事WordPress(ワードプレス)の始め方【初心者でも15分で開設】