unity脚本自带函数执行顺序

在unity的脚本中,有大量的脚本执行按照预先确定的顺序执行的事件函数,由于篇幅有限,无法一一列举,这里只列举一些常用的自带函数的顺序,并论述他们之间的区别。

在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的。

Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy

秉着实践是检验真理的唯一标准,咱们可以将下面脚本挂在一个物体运行,从打印结果中便可以看到执行顺序

    void Awake()
    {
        print("Here is Awake");
    }

    void OnEnable()
    {
        print("Here is OnEnable");
    }

    void Start()
    {
        print("Here is Start");
    }

    void FixedUpdate()
    {
        print("Here is FixedUpdate");
    }

    void Update()
    {
        print("Here is Update");
    }

    void LateUpdate()
    {
        Debug.Log("Here is LateUpdate");
    }

    void OnGUI()
    {
        print("Here is OnGUI");
    }

    void Reset()
    {
        print("Here is OnReset");
    }

    void OnDisable()
    {
        print("Here is OnDisable");
    }

    void OnDestroy()
    {
        print("Here is OnDestroy");
    }   

下面是打印结果

接下来针对每个方法进行详细的说明

1.Awake

用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。它不能用来执行协同程序。

2.Start

仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。在所有脚本实例中,Start函数总是在Awake函数之后调用。

3.FixedUpdate

固定帧更新,在Unity导航菜单栏中,点击“Edit”-->“Project Setting”-->“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,其中“Fixed Timestep”选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02s。

4.Update

    正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

Update()与FixedUpdate()的区别

从字面上理解,它们都是在更新时会被调用,并且会循环的调用。但是Update会在每次渲 染新的一帧时,被调用。而FixedUpdate会在每个固定的时间间隔被调用,那么要是Update 和FixedUpdate的时间间隔一样,是不是就一样呢?答案是不一定,因为Update受当前渲染的物体,更确切的说是三角形的数量影响,有时快有时 慢,帧率会变化,update被调用的时间间隔就发生变化。但是FixedUpdate则不受帧率的变化,它是以固定的时间间隔来被调用,那么这个时间间
隔怎么设置呢?Edit->Project Setting->time下面的Fixed timestep。

5.LateUpdate

在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。LateUpdate,在每帧Update执行完毕调用,他是在所有update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

Update和LateUpdate的区别

在圣典里LateUpdate被解释成一句话,LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。

LateUpdate是晚于所有Update执行的。例如:游戏中有2个脚本,脚本1含有Update和LateUpdate,脚本2含有Update,那么当游戏执行时,每一帧都是把2个脚本中的Update执行完后才执行LateUpdate
。虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行。

现在假设有2个不同的脚本同时在Update中控制一个物体,那么当其中一个脚本改变物体方位、旋转或者其他参数时,另一个脚步也在改变这些东西,那么这个物体的方位、旋转就会出现一定的反复。如果还有个物体在Update中跟随这个物体移动、旋转的话,那跟随的物体就会出现抖动。 如果是在LateUpdate中跟随的话就会只跟随所有Update执行完后的最后位置、旋转,这样就防止了抖动。

6.OnGUI

在渲染和处理GUI事件时调用。比如:你画一个button或label时常常用到它。这意味着OnGUI也是每帧执行一次。

7.Reset

在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个默认值。

8.OnDisable

当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。

9.OnDestroy

当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。

时间: 2024-10-07 13:42:04

unity脚本自带函数执行顺序的相关文章

[Unity-20] Unity不同脚本之间的执行顺序

我们都知道,Unity中某个脚本的执行顺序是Awake.Start.Update.LateUpdate等,但是不同的脚本之间的执行顺序是怎样的呢? 例如我有两个脚本Script1和Script2,那么这两个脚本的Awake执行顺序是怎样的呢? 要知道真相我们就必须了解Unity后台的运行原理,其实Unity后台是单线程执行的,所谓的协程都是伪多线程.不同脚本的Awake在后台的执行真相是这样的: 后台Awake() { 脚本0Awake(); 脚本1Awake(); ........ } Sta

高性能网站优化-确保异步加载脚本时保持执行顺序

<高性能网站建设进阶指南> 脚本如果按照常规方式加载,不仅会阻塞页面中其他内容的下载,还会阻塞脚本后面所有元素的渲染.异步加载脚本可以避免这种阻塞现象,从而提高页面加载速度.但是性能的提升是要付出代价的.代码的异步执行可能会出现竞争状态.简单地说就是页面内部的脚本需要的标示符如果是在外部文件中定义的,而当外部文件异步加载的时候,如果没有保证外部文件和内部脚本执行顺序,很有可能会出现未定义标示符的错误 当异步加载的外部脚本与行内脚本之间存在代码依赖时,就需要通过一种保证执行顺序的方法来整合这两个

unity的默认文件目录及脚本之间的执行顺序

在unity中,有几个默认的文件目录,这些目录对于开发者来说是非常重要的,今天记录一下这些目录的功能和一些相关的知识 大神雨松给出的帖子我个人觉得还是很有价值的,附上链接 http://www.xuanyusong.com/archives/3229 简书中一位大神也给出了详细的说明,而且附加上了文件的编译顺序:https://www.jianshu.com/p/e9d6f3bb69c5 大神对目录的解释,我自认为没有他们理解的更深,但是我亲测了一个问题,就是脚本的执行和文件夹有没有关系呢? 答

Unity Instantiate各函数执行顺序

GameObject go = Instantiate(aaa) ;        go.GetComponent<NewBehaviourScript>().Init(); Instantiate一个gameobject后,马上执行一个自定义的方法Init,经过测试发现顺序为Awake Init Start Update.

unity脚本执行顺序详解

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

unity脚本运行顺序具体的解释

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

Unity3d脚本执行顺序详解

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 在调用脚本的时候遇到下面报错情况: NullReferenceException: Object reference not set to an instance of an object 意思就是:未将对象引用设置到对象的实例脚本内部的 Start()函数并不能作为构造的形式,因为在同一个对象

关于Cocos Creator脚本执行顺序的几点补充

Cocos Creator开发远非初看起来那么容易,正早一些可视化开发语言,例如VB,入门很容易,但进入实战阶段,你很可能会发现问题一股脑儿出现.但是,不要怕,根本原因还在于你不熟悉它.其效率不必怀疑,而且官方的主打产品也正是它.开发中,深感官方关于Cocos Creator脚本执行顺序尚存在很多不详细或者透彻的地方:因此,本人结合最近一个时段的学习,作以下几点补充. 一,官方文档最重要 地址是:http://docs.cocos.com/creator/manual/zh/scripting/

LABjs学习(一)之无阻塞动态并行加载脚本文件以及管理执行顺序

什么是LABjs LABjs是一个动态的脚本加载器,LABjs的定义特性是能够在浏览器允许的范围内以最快的速度并行加载所有JavaScript文件,但是如果文件之间存在依赖关系,则可以选择确保正确的执行顺序. 总计来说就是:动态并行加载脚本文件以及管理加载脚本文件的执行顺序 使用方法 $LAB对象替代了<script>标签,然后.script()方法表示加载Javascript文件,不带参数的.wait()方法表示立即运行刚才加载的Javascript文件,带参数的.wait()方法也是立即运