Unity Update 详解
2016-02-10 22:07
513 查看
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是最合适不过的。
相关文章推荐
- Unity Update 详解
- unityTaidou(四)unity中package包导入失败的解决方法
- Unity初探之黑暗之光(1)
- unityTaidou(三)unity模型材质比较暗的解决方法
- UNITY 4.7.0 Release Note解读
- 【Unity3D 笔记】 一个2D游戏Rougelike
- Unity实战开发之《代码汪的第一步》
- Unity3D之Vector3.Dot和Vector3.Cross的使用
- 火炬之光模型导出(Unity载入火炬之光的模型)
- Unity3D NGUI,uGUI总结
- Unity在编辑器状态下清空控制台信息
- unityTaidou(二)NGUI之列表的动态创建
- Unity3d中使用OnGUI()函数判断“键盘按下抬起”功能的新方法。
- Unity GameObject.activeSelf, GameObject.activeInHierarchy,GameObject.SetActive和SetActiveRecursively
- unity2D动画和图片切割
- unityTaidou(一)NGUI之列表的创建与使用
- Unity插件_____DoTween(一)
- unity + vuforia 初体验
- unity3d下用wikitude sdk开发图片识别的AR
- [Unity3D]Window Phone代码通信