Unity中四种倒计时实现方法

目录

Time.time:可以直接执行(适用于先执行在等待,且不固定时间)

Time.deltaTime:适用于先等待在执行,且不固定时间

InvokeRepeating:适用于固定时间重复执行(与CancelInvoke配合使用)

IEnumerator:使用协同程序编写倒计时


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

/// <summary>
/// 功能:倒计时
/// 作者:Dtc
/// </summary>
public class Countdown_Sic : MonoBehaviour
{

    //需求:倒计时,1秒修改1次Text文本内容,十秒后文本变红
    //1.查找组件引用
    //2定义变量:秒second
    //3.120 --> 02:00119 -->01:59
    //4.修改文本
    
   //声明Text变量
    private Text timerText;
    /// <summary>
    /// 游戏运行时间
    /// </summary>
    float timer;
    /// <summary>
    /// 倒计时多少秒
    /// </summary>
    public int second = 120;

    /// <summary>
    /// 下次修改时间
    /// </summary>
    float nextTime = 1;


    private void Start()
    {
        //获取Text 物体的引用
        timerText = Object.FindObjectOfType<Text>();        //重复调用(会一直调用:对应CancelInvoke 取消调用)
        //InvokeRepeating(调用方法的名字 ,第一次调用时间 ,调用时间间隔)
        InvokeRepeating("CountDownF3", 1f, 1f);
    }
    
    private void Update()
    {
        //方法一
        //CountDownF1();
        //方法二:
        CountDownF2();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("倒计时"))
        {

            //方法四:
            //开启协程
            StartCoroutine(TimeFun02(5));
        }

   }

    /// <summary>
    /// 倒计时方法1(通过Time.time)     
    /// 可以直接执行(适用于先执行在等待,且不固定时间)
    /// </summary>
    private void CountDownF1()
    {
        if (Time.time >= nextTime && second > 0)
        {
            //则倒计时减一秒
            second--;
            //显示倒计时文本
            timerText.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
            nextTime = Time.time + 1;//设置下次修改时间   在当前时间上加一
            if (second <= 10)//当时间 小于等于10秒时,变为红色字体
            {
                timerText.color = Color.red;
            }
        }
    }

   

    /// <summary>
    /// 倒计时方法2(通过Time.deltaTime)    
    /// 先等,到时间在执行(适用于先等待在执行,且不固定时间)
    /// </summary>
    private void CountDownF2()
    {
        //计时器
        timer += Time.deltaTime;
        //当时间累加到一秒 并且 倒计时未终止  
        if (timer >= 1 && second > 0)
        {
            //则倒计时减一秒
            second--;
            //显示倒计时文本
            timerText.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
            timer = 0;//且计时器归零  重新计时
            if (second <= 10)//当时间 小于等于10秒时,变为红色字体
            {
                timerText.color = Color.red;
            }
        }
    }

   

     /// <summary>
    /// 倒计时方法3(通过InvokeRepeating(调用的方法,第一次调用的时间,调用一次的时间间隔)在Start中重复调用)
    /// 适用于固定时间重复执行
    /// </summary>
    private void CountDownF3()
    {

        //则倒计时减一秒
        second--;
        //显示倒计时文本
        timerText.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);

        if (second <= 10)//当时间 小于等于10秒时,变为红色字体
        {
            timerText.color = Color.red;
        }
        //当时间小于等于0时  停止InvokeRepeating的重复调用
        if (second <= 0)
            CancelInvoke("CountDownF3");
    }
    /// <summary>
    /// 倒计时方法4: 协程 (在一帧 方法中实现倒计时效果)
    /// </summary>
    /// <param name="timer">倒计时时间</param>
    /// <returns></returns>
    private IEnumerator TimeFun02(float timer)
    {
        //当时间大于零时 执行循环  时间到了 退出循环
        do
        {
            //输出时间  
            print(timer +"秒");
            //并通过协程隔一秒执行一次 累减数据代码
            yield return new WaitForSeconds(1);
            timer--;
        }
        while (timer > 0);
        
        print("时间到");
    }


 

猜你喜欢

转载自blog.csdn.net/weixin_44906202/article/details/126901056
今日推荐