赞
踩
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;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。