UnityAPI——Time类中的静态变量Time.deltaTime

UnityAPI官方文档

Unity3d - Time.deltaTime

Update():每帧被调用一次。

FixedUpdate():每隔Time.fixedDeltaTime被调用一次。Time.fixedDeltaTime默认是0.02s,可以通过Edit->ProjectSettings->Time来设置。

在游戏中,因为受场景渲染的复杂程度,还有输入的一系列事件等等各种原因影响,游戏画面的帧率是在不断变化的。

所以,在控制游戏逻辑的过程中,一般是需要按照每帧去处理的(使用Update())。而物理相关的处理,则需要根据时间的变化去处理(使用FixedUpdate())。

而当我们在Update()中,希望通过每隔一段时间去执行一些逻辑,比如修改GameObject的Transform,需要使用Time.deltaTime。
主要原因,就是帧率在不断变化,Update()被调用的时间并不是线性的。
在Update()中,时间轴上,渲染出的5帧画面Frame_1~Frame_5,以及每帧的时间间隔t1~t4:
这里写图片描述
Transform的Translate方法接受的参数,实际上是一个位移,而不是速度。
在FixedUpdate()中,发生的情况是这样的:
这里写图片描述
因为FixedUpdate()的调用间隔就是0.02s=t1=t2=t3=t4,所以实际上,位移=速度*时间。

由于Update()并不是按照单位时间被调用的,所以要乘以每次的“帧间时间”,而这个时间就是Time.deltaTime。这样的操作相当于一个“补偿”,将每次帧率的变化,通过时间的变化同步体现到执行逻辑上。

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

public class API02Time : MonoBehaviour {

    public Transform cube;
    public int runcount=10000;
    void Start () {
    //Time.realtimeSinceStartup用于性能测试
        float time1 = Time.realtimeSinceStartup;
        for (int i = 0; i < runcount; i++)
        {
            method1();
        }
        float time2 = Time.realtimeSinceStartup;
        Debug.Log(time1-time2);
        float time3 = Time.realtimeSinceStartup;
        for (int i = 0; i < runcount; i++)
        {
            method2();
        }
        float time4 = Time.realtimeSinceStartup;
        Debug.Log(time4 - time3);

    }
    void Update () {
            cube.Translate(Vector3.forward*Time.deltaTime);
            Time.timeScale = 0.5f;
    }
    void method1()
    {
        int i = 1 + 2;
    }
    void method2()
    {
        int i = 1 * 3;
    }
}

猜你喜欢

转载自blog.csdn.net/xiaokunzhang/article/details/80408175
今日推荐