Time类

参考视频

常用API的研究

1. 对Time.time的研究

概念:这是从游戏开始到现在经过的时间(以秒为单位)。
用途:计算游戏中的时间或倒计时。

2. 对Time.deltaTime的研究

概念:这是一个float类型的值,表示上一帧到当前帧所需的时间(以秒为单位)。

应用场景1:在不同的帧速率下,动画都以相同的速度播放

// 应用场景1:保证不同的帧速率下,动画都能以相同的速度播放
public void Update()
{
    // 旋转速度 * 每帧消耗时间,可以保证旋转速度不受机器或渲染影响
    this.transform.Rotate(0, 1 * Time.deltaTime, 0);
}

3. 对Time.timeScale的研究

这是一个float类型的值,用于调整游戏的速度。
默认值为1,表示正常速度。
如果将其设置为0.5,则游戏会以一半的速度运行;
如果将其设置为2,则游戏会以两倍的速度运行。

注意: 当Time.timeScale为0时

  1. 不会执行FixedUpdate里面的代码,Update里面的代码是可以执行的
  2. Time.deltaTime会停止,但Time.unscaledDeltaTime不会停止
  3. Time.time会停止,但Time.unscaledTime不会停止
  4. fixedUnscaledTime将停止,但是当timeScale由0变为非0值时,这个值将会有个跳跃,接近于unscaledTime和realtimeSinceStartup

注意2: 实验总结

  1. timeScale的范围是0到100之间的浮点数,超过此范围时,Unity会给出一条错误信息
  2. timeScale改变时,会对以下值产生影响:time、deltaTime、fixedTime以及fixedUnscaledDeltaTime
  3. timeScale改变时,不会对以下值产生影响:realtimeSinceStartup、unscaledTime、unscaledDeltaTime、fixedUnscaledTime、fixedDeltaTime

应用场景1:倒计时

1. 使用Time.time和目标时间差来进行倒计时

using UnityEngine;
using UnityEngine.UI;
public class Timer : MonoBehaviour
{
    private bool run; // 是否开始倒计时
    private float curTime; // 当前时间
    private float startTime; // 开始时间
    private bool showTimeLeft = true;// 是否在倒计时
    private bool timeEnd = false; // 倒计时是否结束
    private float showTime; // 显示时间
    private float timeAvaiable = 30.0f; // 倒计时多久

    private string curStrTime = string.Empty; 
    public Text guiTimer; // 显示在屏幕上的时间

	// 开启倒计时倒计时
    public void RunTimer()  // 调用这个函数,就开始倒计时
    {
        run = true;
        startTime = Time.time;  // 设置开始时间
    }
  
    private void Update()
    {
        // 如果开启倒计时
        if (run) curTime = Time.time - startTime;
          
        // 如果正在倒计时
        if (showTimeLeft)
        {
            showTime = timeAvaiable - curTime;
            if(showTime <= 0) // 倒计时结束
            {
                timeEnd = true;
                showTime = 0;
            }
        }
        int min = (int)(showTime / 60); // 分
        int second = (int)(showTime % 60); // 秒
        int fraction = (int)((showTime * 100) % 100); 
        curStrTime = string.Format("{0:00}:{1:00}:{2:00}", min, second, fraction);
        guiTimer.text = "Timer: " + curStrTime; // 显示在屏幕上
    }
}

使用Time.deltaTime进行倒计时

using UnityEngine;
using UnityEngine.UI;
public class TimeBack : MonoBehaviour
{
    private Text textTimer; // 显示在屏幕上的时间
    public int second = 120; // 倒计时多久(单位:秒)
  
    public void Start()
    {
        textTimer = this.GetComponent<Text>();
    }

    private float totalTime; 
    public void Update()
    {
        totalTime += Time.deltaTime;
        if(totalTime >= 1)
        {
            second--;
            textTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
            if(second <= 10)
            {
                // 如果秒数小于10秒,屏幕上的时间颜色变红
                textTimer.color = Color.red;
            }
            totalTime = 0;
        }   
    }
}

使用InvokeRepeating进行倒计时

using UnityEngine;
using UnityEngine.UI;
public class TimeBack : MonoBehaviour
{
    private Text textTimer; // 屏幕显示的时间
    public int second = 120; // 倒计时多久
    public void Start()
    {
        textTimer = this.GetComponent<Text>();
        // 重复调用(执行的方法名,第一次执行的时间,每次间隔执行的时间)
        this.InvokeRepeating("Timer", 1, 1);
    }
    public void Timer()
    {
        second--;
        textTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
		if(second <= 0)
            this.CancelInvoke("Timer");  // 清除计时器
    }
}