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.那么针对 出现函数名一样的情况时,无论他 ...
随机推荐
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...
- http-equiv
HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容.常用的HTTP-EQUIV类型有:Content-Type.Refresh .Expires ...
- 9段高效率开发PHP程序的代码
php是世界上最好的语言 在php网站开发中,大家都希望能够快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是起飞的感觉.今天由杭州php工程师送出福利来了,以下9段高效率开发PHP ...
- 【Android】使用persist属性来调用脚本文件
Android系统中有许多属性,属性由两个部分组成:name & value,可以使用这些属性来记录系统设置或进程之间的信息交换.Android系统在启动过程时会按序从以下几个文件中加载系统属 ...
- iOS tableview 优化总结
根据网络上的优化方法进行了总括.并未仔细进行语言组织.正在这些优化方法进行学习,见另一篇文章 提高app流畅度 1.cell子控件创建写在 initWithStyle:reuseIdentifier ...
- TcxDBTreeList导出EXCEL
function ExportExcel(tree: TcxDBTreeList; const fileName: string = '1.xls'): Boolean;var sd: TSave ...
- 遇见了这个问题:App.config提示错误“配置系统未能初始化”
解决办法查找之后居然是这样的,受教了,记录一下 解决: "如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元 ...
- HDU 3586 Information Disturbing (二分+树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- C# 运用params修饰符来实现变长参数传递
一般来说,参数个数都是固定的,定义为集群类型的参数可以实现可变数目参数的目的,但是.NET提供了更灵活的机制来实现可变数目参数,这就是使用params修饰符.可变数目参数的好处就是在某些情况下可以方便 ...
- Castle IOC容器构建配置详解(一)
主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...