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是最合适不过的。

时间: 2024-10-26 20:00:22

Unity Update 详解的相关文章

Unity Coroutine详解(一)

Unity 中协程是个非常强大的功能,其作用主要是用于游戏中的延时调用或者执行一连串的有时间间隔的事件流程,例如剧情对话等.简单总结了几点协程相关的知识点,旨在加深记忆,同时为初学者解惑. 1.协程.进程与线程 这是个面试中经常会问到的问题:协程.进程与线程的区别在哪? 说到协程,我们首先回顾以下线程与进程这两个概念.在操作系统(os)级别,有进程(process)和线程(thread)两个我们看不到但又实际存在的“东西”,这两个东西都是用来模拟“并行”的,写操作系统的程序员通过用一定的策略给不

MySql之on duplicate key update详解

在我们的日常开发中,你是否遇到过这种情景:查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段.你的处理方式是不是就是按照下面这样? $result = mysql_query('select * from xxx where id = 1'); $row = mysql_fetch_assoc($result); if($row){ mysql_query('update ...'); }else{ mysql_query('insert ...'); } 这样的写法可能有如下

Unity灯光详解

Lights will bring personality and flavor to your game. You use lights to illuminate the scenes and objects to create the perfect visual mood. Lights can be used to simulate the sun, burning match light, flashlights, gun-fire, or explosions, just to n

[Unity实战]详解换装系统(四)

关于换装系统基本上就是前三篇文章所说的那样了,这里说一下一些琐碎的.. 1.在网游中,推荐将各个部位打包成assetbundle,比如一个男性的角色,将他的基础骨骼打进一个包,再将身体各个部分的模型分别打包.如果一个模型由头.脸.身体.手臂.脚五个部分组成,那么打包后将会有六个资源包,分别是基础骨骼.头.脸.身体.手臂.脚. 2.合并mesh要注意的地方: 来源模型与材质数量必须相对应,否则模型的贴图将会变得不正常,也就是说如果裤子的 material 有两个,其他部位的 materail只有一

[Unity实战]详解换装系统(三)

在阅读本文章之前,本人强烈建议你先看看本系列的前两篇文章,对换装系统有一些了解后再继续! 在上一篇文章中,运行之后是这样的: 我们的target上挂上各种类型的mesh,而每一个mesh上都有一个Skinned Mesh Renderer组件,这无疑会增加运算量,根据官方demo的指引,我们应该合并mesh,这样target上就只有一个Skinned Mesh Renderer组件,从而达到优化的目的! 本人对上一篇文章的代码进行了一些修改,主要是添加了6处新的代码,并对不需要的代码进行了注释(

Unity坐标系详解

1. World Space(世界坐标系): 我们在场景中添加的物体(如:Cube),他们都是以世界坐标显示在场景中.transform.position 获取的便是这个 坐标数值. 2. Scene Space(屏幕坐标系): 以像素来定义的,一屏幕的左下角为(0,0)点,右上角为(Screen.with,Screen.height),Z轴的位置是以相机的世界单位来衡量的(个人感觉是世界坐标的Z值). 2.1 鼠标位置属于屏幕坐标,Input.mousePosition 可以获得该位置坐标.

UGUI RectTransform详解

UGUI RectTransform.Unity RectTransform详解 The first:look look API. http://docs.unity3d.com/ScriptReference/RectTransform.html 在新的UI系统中,无论Button,Text,Image,Toggle等组件,都是基于RectTransform进行布局的. 你可以不知Button为何物,不知Text为何物,不知Image为何物,但是一定要知道RectTransform. 自Uni

unity脚本执行顺序详解

unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch