zoukankan      html  css  js  c++  java
  • Unity Update 详解

    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
    ";
    }
    
    void Update(){
        std::cout<< "Update
    ";
    }
    
    void LateUpdate(){
        std::cout<< "LateUpdate
    ";
    }
    
    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是最合适不过的。

  • 相关阅读:
    语法上的小trick
    [算法模版]斜率优化
    CF886E Maximum Element
    【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)
    【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)
    【poj 2478】Farey Sequence(数论--欧拉函数 找规律求前缀和)
    【poj 1284】Primitive Roots(数论--欧拉函数 求原根个数){费马小定理、欧拉定理}
    【poj 2407】Relatives(数论--欧拉函数 模版题)
    【bzoj 2038】 [2009国家集训队]小Z的袜子(算法效率--莫队分块算法 模版题)
    【uva 1312】Cricket Field(算法效率--技巧枚举)
  • 原文地址:https://www.cnblogs.com/fengju/p/6174279.html
Copyright © 2011-2022 走看看