EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

[Unity]什么是deltaTime?

什么是deltaTime?

解释这个概念,先得说明为什么要用deltaTime?

delataTime的出现,用于应付普通Time无法应对的情况。

简单地说,是为了应付 【随帧移动】 还是 【随秒移动】。 

 

void Update() 是Engine每帧都会执行一遍的函数,如果你在Update里面写上了移动1m,那么每帧都会移动1m。

如果1秒有30帧,Target就会移动30m。

但如果你想要的是每秒移动1m,那就不得不用deltaTime来实现。

 

不同的环境运行游戏,帧数是不会一样的,按帧数更新画面明显是不合理的。

以最基本的PlayerCtrl.cs为例:

 

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

public class PlayerCtrl : MonoBehaviour
{
    //水平变量
    private float h = 0.0f;
    //垂直变量
    private float v = 0.0f;
    //用于改变3D物体位置、方向的变量
    private Transform tr;
    //移动速度(声明public以显示到Inspector)
    public float moveSpeed = 10.0f;


    // Start is called before the first frame update
    void Start()
    {
        //初始化该组件
        tr=GetComponent<Transform>();
       
    }

    // Update is called once per frame
    void Update()
    {
        h = Input.GetAxis("Horizontal");//根据InputManager的预设值,默认接受AD,作为横向
        v = Input.GetAxis("Vertical");//根据InputManager的预设值,默认接受WS,作为纵向

        Debug.Log("H="+h.ToString());
        Debug.Log("V=" + v.ToString());

        //Vector3.forward理解为(0,0,1),即向前1个单位,*deltaTime的目的是移动不受帧率影响<=以每秒10.0f行动而不是每帧10.f
        //Vector3.forward * moveSpeed 每帧移动(自动)
        //Vector3.forward * moveSpeed * Time.deltaTime 每秒移动(自动)
        //Vector3.forward * moveSpeed * v * Time.deltaTime 你按WS键的时间*移动

        tr.Translate(Vector3.forward * moveSpeed * v * Time.deltaTime, Space.Self);
        tr.Translate(Vector3.right * moveSpeed * h * Time.deltaTime, Space.Self); 
    }
}

 

通过乘以Time.deltaTime完美解决了,不同环境下Target运动的速度问题。

 

 

 

 

This article was last edited at 2020-04-07 22:12:23

* *