Unity3D中事件函数的运行顺序
Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下:
Editor模式下Reset:
当脚本第一次被挂到GameObject上或用户点击Resetbutton时,Reset被调用初始化脚本属性,最经常使用于在Inspector视图中呈现好的默认值。
载入第一个场景First Scene Load:
场景启动时会对场景中的每一个对象运行一遍例如以下事件函数:
- Awake:游戏启动之前初始化不论什么变量和游戏状态,仅在脚本生命周期中调用一次。不能做协程,Start函数之前以及预制物体实例化后被调用。
GameObject之间Awake的调用没有先后顺序规定,因而能够利用Awake建立脚本之间的引用。再使用Start 来回传递信息。(对于C#、Boo用户,当构造时组件序列化状态未定义,就应该使用Awake取代构造函数初始化)。
- OnEnable:仅仅有GameObject是激活状态下才被调用,通常发生于MonoBehaviour实例被创建。
第一帧更新之前Before the First Frame Update:
不论脚本enabled与否,Awake都会调用;假如初始化期间脚本disabled,则Start就不会与Awake在同一帧被调用。Awake和OnEnable一定是在Start之前调用(优点是:object A实例化代码依赖于object B实例化。B实例化就在Awake阶段完毕。A实例化就在Start阶段完毕)。
若暂停被检測到,当前帧运行后就调用OnApplicationPause函数,在正常的帧更新之间调用是有效的。在OnApplicationPause被调用后,添加额外的一帧来显示图像表明暂停状态。OnApplicationPause 能够是协程。假如其作为协程来运行。在初始化帧期间会被 用到两次:第一次用作前期通知,第二次发生在正常的协程更新步骤中。
更新顺序Update Order:
当想要追踪游戏逻辑、动画、相机位置等,能够在更新事件函数中运行这些任务,调用的顺序为FixedUpdate、Update、LateUpdate,当然脚本中不是必须三者都包括在内。三者不同见Unity3D的事件函数。
协程在全部Update函数完毕后运行。若在LateUpdate中开启了一个协程。它将在LateUpdate之后渲染之前也会被调用。
渲染Rendering:
- OnPreCull: 在相机剔除场景前被调用,剔除决定了哪些物体在相机中是可见的。
假如要改动相机的可视化參数(比方FOV,Transform等),就应该在这个函数中进行改动。此后场景中GameObject的可见性就取决于相机的參数了。
- OnBecameVisible/OnBecameInvisible:当GameObject在不论什么相机中变得可见/不可见时被调用。该消息被发送到不论什么挂在渲染器上的脚本。
使用这两个函数能够避免不必要的计算,仅当GameObject可见时才进行对应的计算。它们能够是协程,简单地使用yield 就可以,当在编辑器中运行时,场景视图摄像机也会导致它们被调用。
- OnWillRenderObject:假设物体可见而且脚本是enabled。在渲染每一个经过剔除操作之后的物体之前,它将为每一个相机调用一次。
- OnPreRender:仅当脚本挂在相机上而且enabled时,则在相机開始渲染场景之前被调用。
假如在这个函数中改动了相机的可视化參数(比方FOV)。那么这些參数仅仅会在下一帧中起到作用。
该函数能够是协程。仅在函数中使用yield就可以。
- OnRenderObject:在全部固定场景渲染之后被调用。此时你能够使用GL类函数或者Graphics.DrawMeshNow来画自己定义的几何体。
该函数和OnPostRender相似。除了一点:不论脚本挂在相机上与否。OnRenderObject都会在不论什么GameO上被调用。
- OnPostRender:在相机完毕场景的渲染后被调用。与OnRenderObject不同,仅当脚本挂在相机上而且是enabled时,该函数才会被调用。
假如想要在全部相机和GUI渲染之后做操作,使用WaitForEndOfFrame协程。
- OnRenderImage(Pro only):在场景渲染完毕后被调用,用于对屏幕的图像进行后处理,该消息被发送到挂到相机上的全部脚本。该函数同意利用基于shader的过滤器对终于图像进行处理。传入源渲染纹理。终止于目标渲染纹理;当相机有多个图像过滤器时,图像顺序被处理,前一个过滤器的目标渲染纹理作为下一个过滤器的源渲染纹理。
- OnGUI:为响应GUI事件,该函数每帧被调用多次,每一个事件就调用一次;运行时先响应布局和重绘事件,随后是为每一次的输入事件运行布局和键盘/鼠标事件。
- OnDrawGizmos:为了可视化的目的,从而在场景视图中绘制小图标。该函数使用相对于Scene视图的鼠标的位置,同意高速挑选场景中重要的GameObject,当然假如组件在inspector中collapsed,则该函数就不会被调用。
协程Coroutines:
协程的功能是。延缓其运行(yield) ,直到给定的YieldInstruction完毕。协程的不同用途:
- yield:协程在全部的Update函数在下一帧被调用后继续运行。
- yield WaitForSeconds:在一个指定的时间延迟后继续运行,在该帧全部的Update函数被调用之后,仅可用于协程中的yield语句。
- yield WaitForFIexedUpdate:在全部脚本上全部的FixedUpdate被调用之后继续运行,就可以用于协程中的yield语句。
- yield WWW:在WWW载入完毕之后继续运行。
- yield StartCoroutine:等待MyFunc协程先完毕。用于链接协程。该函数总是会马上返回,然而能够yield结果,这样就就会等到协程完毕运行然后返回。使用JavaScript不必使用该函数,由于编译器会为你做这个工作。若使用C# 就需使用该函数了。
对象被销毁时When the Object is Destroyed:
OnDestroy这个函数在全部帧更新之后被调用。在对象存在的最后一帧中(对象被销毁来响应Object.Destroy或关闭一个场景)。该函数不能够是协程。
当退出时When Quitting:
对于场景中全部active对象都会调用下列函数:
- OnApplicationQuit:在应用退出之前全部的游戏对象都会调用该函数。在编辑器中当用户停止播放时它将被调用;在webplayer中。当网页关闭时被调用。
- OnDisable:当行为不可用或非激活时。该函数被调用。
当对象被销毁时。或对于不论什么清理工作的代码。该函数相同可被调用。
当编译完毕之后又一次载入脚本,该函数可被调用,紧随其后脚本载入完毕时调用OnEnable。
脚本生命周期流程图:
综上所述,关于脚本整个生命周期可參见unity3d脚本生命周期流程图。
Unity3D中事件函数的运行顺序的更多相关文章
- Unity3D中组件事件函数的运行顺序
事件函数的运行顺序 Unity 脚本中有很多按预设顺序以脚本身份执行的事件函数. 其执行顺序例如以下: 载入第一个场景 启动场景时调用这些函数(为场景中的每一个对象调用一次). Awake: 始终在调 ...
- Unity3D中默认函数的执行顺序
直接用一张图来说明各个默认函数的执行顺序: FixedUpdate以固定的物理时间间隔被调用,不受游戏帧率影响.一个游戏帧可能会调用多次FixedUpdate.比如处理Rigidbody的时候最好用F ...
- unity3D技术之事件函数的执行顺序[转]
unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: ...
- Unity3D中自带事件函数的执行顺序(转)
原文:http://www.jianshu.com/p/1d93ece664e2 在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(E ...
- Unity3D中自带事件函数的执行顺序
在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对 ...
- Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照
原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...
- Unity3D事件函数的执行顺序
In Unity scripting, there are a number of event functions that get executed in a predetermined order ...
- AJAX中success函数的执行顺序
1,问题,在上图中,数据传输正常,但是一直输出为空的p,再输出66, 2,原因,默认开启了异步加载, 3,解决方法,开启同步,或者在success中添加函数.
- JS中同名函数有效执行顺序
html中如果出现函数同名时:如果有多个外部引入的js文件,例如a.js和b.js(引入顺序假定是a.js,然后是b.js),同时html中本身也有内部的js.那么针对 出现函数名一样的情况时,无论他 ...
随机推荐
- java类与对象的动手动脑和其他小问题
在Java中,我们可以通过组合一私有字段和一对get/set方法来定义一个属性.私有的变量,共有的方法. package sample; /** * 自定义Java类的示例 */ class MyCl ...
- 写好Hive 程序的五个提示
转自http://www.alidata.org/archives/622 使用Hive可以高效而又快速地编写复杂的MapReduce查询逻辑.但是某些情况下,因为不熟悉数据特性,或没有遵循Hive的 ...
- 上传控件swfupload的使用笔记
1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...
- erlang 时间处理
常用代码 date()返回P{年,月,日} erlang:now转本地时间 > calendar:now_to_local_time(erlang:now()). {{,,},{,,}} erl ...
- 给一已经排序数组A和x,求A中是否包含两个元素之和为x
亲爱的大神老爷们,这是小渣第一次写blog,欢迎大家来喷(批评指正),算法渣因为面试中连这道题都不会写就自己琢磨了一下,也参考了网上大家的做法 解法一: 思路:从首尾向目的靠拢,因为已经排序,[假设存 ...
- hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)
hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...
- CameraComponent Quality
CameraComponent1.Quality := TVideoCaptureQuality.HighQuality; procedure TCameraComponentForm.Set720p ...
- ListCell Animation in ListView
After a long time I am back again with new stuffs. I have seen that JavaFX has got so many demand no ...
- C#应用Newtonsoft.Json操作json[2]-反序列化不定类型
在读json时,有时不知道对方的数据类型是什么样的,本文用Newtonsoft,把json反序列化为List>,在某种情况下还是有用的. private static List<Dicti ...
- Gradle 1.3之前的Publishing artifacts
在Gradle1.3之前,Publishing artifacts是使用uploadConfigurationName来publish 声明artifacts是靠使用 build.gradle art ...