Unity Update 详解

0x01:简介

Unity的脚本继承了Monobehaviour类,在脚本中定义函数:

void FixedUpdate(){}
void Update(){}
void LateUpdate(){}

脚本如果是激活的,这三个函数会被上层逻辑每帧调用,FixedUpdate调用的次数和fixedTime有关,后面详细介绍,Update和LateUpdate每帧调用一次。

0x02:实现

一般游戏流程都类似下面代码示例:

/*****************************************
* Notice:c++ 示例代码,用于说明游戏循环逻辑
* Author:wulongfei
* Email:[email protected]
* Date:2016-2-10
*****************************************/
#include <iostream>

void FixedUpdate(){}
void Update(){}
void LateUpdate(){}

int main(){
 while(true){
 FixedUpdate();
 Update();
 LateUpdate();
 }
}

简单说明一下:
1、while每循环一次,对应游戏里一帧
2、Unity里的三个Update调用的次序是按照上面代码所示的次序
3、Update和LateUpdate每帧调用一次,FixedUpdate和FixedTime相关联

下面代码说明FixedTime和FixedUpdate是如何关联的:

/***************************************** * Notice:c++11 示例代码,用于说明游戏循环逻辑 * Author:wulongfei * Email:[email protected] * Date:2016-2-10 *****************************************/

#include <iostream>
#include <ctime>
#include <chrono>
#include <thread>

static const long kMilliSecondsPerFrame = 1000;
static const float kFixedTime = 0.2f;

void FixedUpdate(){
    std::cout<< "FixedUpdate\n";
}

void Update(){
    std::cout<< "Update\n";
}

void LateUpdate(){
    std::cout<< "LateUpdate\n";
}

int main(){
    clock_t t = clock();
    while(true){
        float detTime = (clock() - t)/(float)CLOCKS_PER_SEC + kMilliSecondsPerFrame/1000;
        t = clock();
        int count = detTime/kFixedTime;
        for(int i = 0; i < count; ++i){
            FixedUpdate();
        }
        Update();
        LateUpdate();
        std::this_thread::sleep_for(std::chrono::milliseconds(kMilliSecondsPerFrame));
    }
}

上面代码用到了C++11的sleep_for和chrono类,其实主要就是实现程序休眠一段时间,主要理解FixedUpdate的逻辑即可,FixedUpdate根据每帧需要的时间来和自己的FixedTime去比较,所以FixedUpdate每一帧调用几次取决于程序一帧执行的时间以及FixedTime。

0x03:应用

为啥要有三个Update?
Update:

每帧需要更新的逻辑在Update函数里调用

LateUpdate:

是当Update调用结束,并且渲染逻辑调用完,才会调用LateUpdate,所以当渲染结束后,需要更新状态的逻辑可以放到LateUpdate。

FixedUpdate:

精确计时需要用到FixedUpdate,因为FixedTime是定值,无论每一帧调用花费多少时间,到FixedUpdate调用时都会按照FixedTime来决定调用次数。因为程序每一帧渲染的时间是不能确定的。

这次我们项目中需要做战斗录像,为了保证逻辑都是按照精确时间调用,所有和时间相关的实例需要总的FixedUpdate调用过来。

当然如果是和物理相关,或者做类似保证按照对应的次数和时间调用,FixedUpdate是最合适不过的。

你可能感兴趣的:(unity)