倒计时

使用协程实现倒计时

可以封装成为一个工具类,用的时候直接调用即可

using DY.Utils;
using System.Collections;
using TMPro;
using UnityEngine;

/// <summary>
/// 倒计时 脚本
/// 放置位置:任意一个对象下即可
/// </summary>
public class CountTime
{
    /// <summary>
    /// 倒计时多久,单位:秒
    /// </summary>
    private float timer = 30;

    /// <summary>
    /// 当前剩余时间
    /// </summary>
    private float remainTime;

    private TextMeshPro textMeshPro;

    public CountTime(float time, Vector3? localPos = null)
    {
        if(localPos == null) localPos = Vector3.zero; 
        this.timer = time;
        this.remainTime = timer;
        string textTimer = "00:30";
        textMeshPro = DYCreateUtils.CreateWroldTextPro(textTimer, "CountDown", null, (Vector3)localPos);
    }


    public IEnumerator StartCountDown()
    {
        WaitForSeconds waitForSeconds = new WaitForSeconds(1);
        while(remainTime > 0)
        {
            HandleremainTime();
            yield return waitForSeconds;
        }
        yield return null;
    }

    private void HandleremainTime()
    {
        remainTime--;
        int min = (int)remainTime / 60;
        int second = (int)remainTime % 60;
        // int fragment = (int)(remainTime * 100 % 100);
        textMeshPro.text = string.Format("{0:00}:{1:00}", min, second);
    }


}

正计时

using TMPro;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 倒计时 脚本
/// 放置位置:任意一个对象下即可
/// </summary>
public class Timer : MonoBehaviour
{
    public static Timer Instance;

    private void Awake()
    {
        if(Instance == null)
        {
            Instance = this;
        }
    }


    public float currentTimer = 0;

    [SerializeField] TextMeshProUGUI textTimer;

    /// <summary>
    /// 是否计时
    /// </summary>
    bool isTimer;

    private void Start()
    {
        isTimer = true;
        currentTimer = 0;
    }

    private void Update()
    {
        if (!isTimer) return;
        currentTimer += Time.deltaTime;
        int min = (int)currentTimer / 60;
        int second = (int)currentTimer % 60;
        textTimer.text = string.Format("{0:00}:{1:00}", min, second);
    }

    /// <summary>
    /// 结束计时
    /// </summary>
    public void EndTimer(UnityAction action)
    {
        isTimer = false;
        action?.Invoke();
    }
}