パープルハット

※当サイトではGoogleアドセンス広告を利用しています

Unity カウントダウンタイマーの作成




はじめに

制限時間付きのミニゲームなど、カウントダウン用のタイマーが欲しい場面が色々あったので、作ってみました。




作成したスクリプト

タイマーには、以下の機能が備わっています。

  1. カウントダウンの機能
  2. 時間をUIのテキストに表示
  3. 特定の時間になったら処理を行う(残り5秒になったら文字を赤くする)
  4. 時間が0になったら、何らかの処理を行う。
  5. 関数の説明は以下の通り。


先ほどのスクリプトには、外部から呼び出すために3つの関数が用意されています。

CStart カウントを、はじめから行う。
Restart Pauseで中断したカウントを再開する。
Pause カウントを中断


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

public class CountDownTimer : MonoBehaviour
{
    float time = 0; //現在のタイム
    bool isRunning = false; //カウントしている状態か
    [SerializeField] float limitedTime; //制限時間
    [SerializeField] Text text; //表示用テキスト
    [SerializeField] List<Schedule> schedules; //指定した時間に呼び出す処理
    [SerializeField] UnityEvent endEvent; //カウント終了後の処理

    //スケジュール用クラス
    [Serializable]
    public class Schedule
    {
        [SerializeField] float _time = -1; //マイナスの値を設定しておく
        [SerializeField] UnityEvent _unityEvent;

        public float Time
        {
            get => _time;
            set => _time = value;
        }

        public UnityEvent UnityEvent
        {
            get => _unityEvent;
            set => _unityEvent = value;
        }
    }

    //はじめから
    public void CStart()
    {
        time = limitedTime;
        isRunning = true;
    }

    //つづきから
    public void Restart()
    {
        isRunning = true;

        //time < 0なら、初めからカウントする
        if (time < 0)
        {
            time = limitedTime;
        }
    }

    //一時停止
    public void Pause()
    {
        isRunning = false;
    }

    void Update()
    {
        //Debug.Log($"{time}:{isRunning}");

        if (isRunning)
        {
            //時間を減らす
            time -= Time.deltaTime;

            //タイマーの指定した時間になったかどうか
            for (int i = 0; i < schedules.Count; i++)
            {
                //スケジュールを実行
                if (schedules[i].Time > time)
                {
                    schedules[i].UnityEvent.Invoke();

                    //実行したら、そのスケジュールは取り除く
                    schedules.RemoveAt(i);

                    break;
                }
            }

            //UIを更新
            text.text = $"Time:{time.ToString("F2")}";

            //0未満になったら終了
            if (time < 0)
            {
                isRunning = false;
                text.text = $"Time:{0.0f.ToString("F2")}";
                endEvent.Invoke();
            }
        }
    }
}





使用例1(関数の動作チェック)

1. テキストの用意

適当なプロジェクトを立ち上げたら、右クリック⇒「UI」⇒「Text」と選択して、テキストを設置する。



2. スクリプトの設定

「CountDownTimer.cs」を先ほど設置したテキストにアタッチして、次のように設置する。



3. 実行結果の確認






使用例2(UnityEventでの処理の呼び出し)

1. 処理の作成

以下のスクリプトを作成する。

using UnityEngine;
using UnityEngine.UI;

public class Sample : MonoBehaviour
{
    [SerializeField] Text text;

    public void Red()
    {
        text.color = Color.red;
    }

    public void Green()
    {
        text.color = Color.green;
    }

    public void Yellow()
    {
        text.color = Color.yellow;
    }
}



2. スクリプトの設定

「使用例1」で使用したテキストについて、スクリプトの設定を以下の様に変更する。



3. 実行結果の確認

実行すると、10秒を切ると緑、5秒を切ると赤、0になると黄色になることが確認できます。