0x01:简单介绍
Unity的脚本继承了Monobehaviour类,在脚本中定义函数:
void FixedUpdate(){}
void Update(){}
void LateUpdate(){}
脚本假设是激活的,这三个函数会被上层逻辑每帧调用,FixedUpdate调用的次数和fixedTime有关。后面具体介绍,Update和LateUpdate每帧调用一次。
0x02:实现
一般游戏流程都相似以下代码演示样例:
/*****************************************
* Notice:c++ 演示样例代码,用于说明游戏循环逻辑
* Author:wulongfei
* Email:zgwulongefei@gmail.com
* 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:zgwulongefei@gmail.com
* 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是最合适只是的。