目录
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("时间到");
}