unity中Time.deltaTime的使用和帧数问题

unity中Time.deltaTime的详细使用

deltaTime–增量时间

官方解释如下:
此属性提供当前帧和上一帧之间的时间。使用Time.deltaTime以每秒单位的速度向该方向移动游戏对象。
乘以Time.deltaTime并添加到组件。

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

// Time.deltaTime example.
//
// Wait two seconds and display waited time.
// This is typically just beyond 2 seconds.
// Allow the speed of the time to be increased or decreased.
// It can range between 0.5 and 2.0. These changes only
// happen when the timer restarts.

public class ScriptExample : MonoBehaviour
{
     
    private float waitTime = 2.0f;
    private float timer = 0.0f;
    private float visualTime = 0.0f;
    private int width, height;
    private float value = 10.0f;
    private float scrollBar = 1.0f;

    void Awake()
    {
     
        width = Screen.width;
        height = Screen.height;
        Time.timeScale = scrollBar;
    }

    void Update()
    {
     
        timer += Time.deltaTime;

        // Check if we have reached beyond 2 seconds.
        // Subtracting two is more accurate over time than resetting to zero.
        if (timer > waitTime)
        {
     
            visualTime = timer;

            // Remove the recorded 2 seconds.
            timer = timer - waitTime;
            Time.timeScale = scrollBar;
        }
    }

    void OnGUI()
    {
     
        GUIStyle sliderDetails = new GUIStyle(GUI.skin.GetStyle("horizontalSlider"));
        GUIStyle sliderThumbDetails = new GUIStyle(GUI.skin.GetStyle("horizontalSliderThumb"));
        GUIStyle labelDetails = new GUIStyle(GUI.skin.GetStyle("label"));

        // Set the size of the fonts and the width/height of the slider.
        labelDetails.fontSize = 6 * (width / 200);
        sliderDetails.fixedHeight = height / 32;
        sliderDetails.fontSize = 12 * (width / 200);
        sliderThumbDetails.fixedHeight = height / 32;
        sliderThumbDetails.fixedWidth = width / 32;

        // Show the slider. Make the scale to be ten times bigger than the needed size.
        value = GUI.HorizontalSlider(new Rect(width / 8, height / 4, width - (4 * width / 8), height - (2 * height / 4)),
            value, 5.0f, 20.0f, sliderDetails, sliderThumbDetails);

        // Show the value from the slider. Make sure that 0.5, 0.6... 1.9, 2.0 are shown.
        float v = ((float)Mathf.RoundToInt(value)) / 10.0f;
        GUI.Label(new Rect(width / 8, height / 3.25f, width - (2 * width / 8), height - (2 * height / 4)),
            "timeScale: " + v.ToString("f1"), labelDetails);
        scrollBar = v;

        // Display the recorded time in a certain size.
        labelDetails.fontSize = 14 * (width / 200);
        GUI.Label(new Rect(width / 8, height / 2, width - (2 * width / 8), height - (2 * height / 4)),
            "Timer value is: " + visualTime.ToString("f4") + " seconds.", labelDetails);
    }
}

但是官方的说话太复杂了

然后我觉得如下解释会比较清楚

如果要让一个物体移动10米,代码如下:

    void Update()
    {
     
        transform.Translate(Time.deltaTime * 10, 0, 0);//物体沿着自身x轴,每秒移动10米 
    }

这里为什么要用Time.deltaTime呢,为什么要乘以时间增量呢?为什么不用直接transform.Translate(10,0,0);
这里就涉及到一个问题了,我们先假设咱们的电脑不错,每秒60帧,意思是一秒内执行了60此Update,那么一下子就结束了,如果按照transform.Translate(10,0,0);写,那么60此以后就是60*10=600米。

但是,我们的电脑配置好不代表其他电脑性能好,其他电脑可能一秒内只能到30帧,那么按照上面那么写的话,那他在一秒内只能走30*10=300米。

这就意味这一个问题,每个同一个游戏在不同电脑上执行的情况就会和设计该游戏的人的预期不一样,这种表现如果到网络游戏上,那就更不能接受了,(想象一下,一个赛车比赛,因为别人的电脑性能好,所以每次比赛都是他第一,因为每秒他的电脑能跑更多的帧数,)这并不是设计者所想要的。

为了解决这个问题,伟大的前辈们就发明了一种方法,从而引入了增量时间的概念

1秒30帧,那增量时间就是 1/30 秒
1秒60帧,那增量时间就是 1/60 秒
1秒166帧,那增量时间就是 1/166 秒

这样的设计理念,就保证了无论帧率是多是少,我们让物体1秒移动10米,最后1秒移动的就一定是10米
这种方法就是:
假如你电脑每秒60帧
那么这个时间增量deltaTime就是1/60,这样你在执行Update的时候,执行60次,那出来结果就是1,

如果是30帧,那结果也是1,所以这很好的解决了帧数不一致的问题。

公式:路程=速度*时间

10米=1秒 * 10米/秒
10米=(1/60 * 60) *10米/秒
10米=(1/166 * 166) *10米/秒
10米=(增量时间 * 1秒总帧数) *10米/秒

重点:

Update函数是每帧执行一次,那么经历过一帧耗费的时间就是 增量时间/deltaTime

1秒内Update执行的次数,就是1秒内执行的总帧数

所以我们只需要写上

 transform.Translate(0, 0, Time.deltaTime * 10)

这一个函数

Update执行了1次,transform.Translate(0, 0, 1/60 * 10)执行一次,物体移动了1/6米

Update1秒内执行了60次,就是transform.Translate(0, 0, Time.deltaTime * 10)乘以60次
相当于 =(每帧时间1/60 * 速度 * 60)=10米

你可能感兴趣的:(unity,c#)