什么是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运动的速度问题。
Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).
There is 18h56m22s left until you can comment.