Unity脚本生命周期

1,



编辑
Reset:Reset函数在脚本属性第一次添加到对象上初始化的时候就被调用,当然这个函数也可以显式调用。
场景第一次加载
下面的函数会在场景加载的时候被调用(场景中的每个对象只会调用1次)。
Awaka:当一个prefab在初始化完成之后,这个函数会在任何Start函数调用前被激活。(如果一个对象在启动阶段是未激活状态,Awaka是不会被调用的)
OnEnable:只有当对象是激活状态才会被调用,这个函数会在对象被激活之后立刻调用。一个MonoBehaviour实例被创建后就会调用,例如关卡被加载或一个带有脚本组件的对象初始化完成。
OnLevelWasLoaded:这个函数是用来通知游戏一个新的关卡已经加载完成。
对于所有添加到场景中的对象来说,Awaka和OnEnable函数对于所有的脚本来说会在Start、Update之前被执行。
在第一帧更新前
Start:当脚本实例被激活时的第一帧刷新前,Start就会被调用。
对于所有添加到场景中的对象,Start函数对于所有的脚本来说会在Update之前被调用。
在每一帧中
OnApplicationPause:当暂停状态激活的那一帧的最后,这个函数会被调用。
刷新顺序
FixedUpdate:FixedUpdate比Update函数更经常被调用,它可以在一帧内多次调用。如果帧率比较低,它可能会被调用多次,如果帧率比较高,它可能不会被调用。所有的物理计算和刷新都会在FixedUpdate之后立即进行。如果要在FixedUpdate中执行移动计算,你不需要使用Time.deltaTime来乘以你的值,因为FixedUpdate是基于一个可靠的定时器被调用,独立于帧率之外。
Update:Update函数会每帧调用一次,它是每帧最重要的刷新函数。
LateUpdate:每帧Update函数结束后,LateUpdate就会被调用。当LateUpdate开始时,任何Update内的计算都会结束。一个常见的LateUpdate应用就是第三人称视角跟随,如果你让你的主角移动和转向在Update函数内进行,你可以把所有的摄像机移动和旋转计算放在LateUpdate里面,这可以保证主角在摄像机跟随前已经移动结束。
渲染
OnPreCull:在摄像机剔除整个场景的时候调用,剔除决定了哪些对象对摄像机来说是可见的。OnPreCull会在剔除进行前调用。
OnBecameVisible/OnBecameInvisible:对任意的摄像机,在对象变可见和不可见的时候调用。
OnWillRenderObject:对每个摄像机只有当对象是可见的情况下调用一次。
OnPreRender:在摄像机开始渲染场景之前调用。
OnRenderObject:当常规的场景渲染完成后被调用,可以在这个时候使用GL类或者Graphics.DrawMeshNow来绘制自定义的几何。
OnPostRender:当摄像机完成场景渲染后调用。
OnRenderImage:当场景渲染允许执行图片的后期处理的时候调用,例如ImageEffects。
OnGUI:在一帧中调用多次来应答GUI事件。布局和重绘事件会优先处理,接着是键盘/鼠标的输入事件。
OnDrawGizmos:出于可视化目的,处理场景中绘制Gizmos对象。
协同程序
正常的协程刷新是在Unpdate函数返回时运行。一个协程是一个能够暂停其执行(yield)直到YieldInstruction结束后的一个函数。下面是协程的不同用法:
yield:协程会在下一帧调用完所有的Update函数后持续执行。
yield WaitForSeconds:在下一帧调用完所有的Update函数后,一个特定的延迟之后执行。
yield WaitForFixedUpdate:在所有的脚本已经调用完所有的FixedUpdate后执行。
yield WWW:一个WWW的下载完成后执行。
yield StartCoroutine:协程链,会先等待自定义协程完成后执行。
对象销毁
OnDestroy:这个函数会在对象存在的最后一帧所有的帧刷新函数调用结束后调用(对象可能会因为Object.Destroy而销毁或者随着场景的关闭)
退出
这些函数会在场景中所有的激活的对象上调用:
OnApplicationQuit:在应用程序退出前所有的游戏对象会调用。在编辑器中,当停止playmode就会调用这个函数。在web播放器中,当web view关闭时就会调用这个函数。
OnDisable:当behaviour变为disabled or inactive状态,这个函数就会被调用。



2,


先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其他的任何方法,都将不再被执行。

如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable,当然我们可以在另外一个脚本中实现这个脚本的启动:this.enable = true;

再向下执行,会进行一个判断,如果start方法还没有被执行一次,则会被执行一次,如果已经执行了,则不会再被执行。这是什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启动时会转到OnEnable处执行,这时继续往下走,发现start执行过了,将不再被执行。比如说:第一次启动时,将怪物的初始位置定在了(0,0,0)点,然后怪物可能会发生了位置的变换,后来被禁用了,再次启动时,不会让怪物又回到初始的(0,0,0)位置。

继续向后执行,就是Update了,然后FixUpdate,再然后是LateUpdate,如果后面写了Reset,则会回到Update,在这4个事件间可以进行循环流动。

再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI,用于绘制图形界面。当然,如果你使用了NGUI,这个生命周期的事情你就不用考虑了。

再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestory。当被禁用(enable=false)时,会执行OnDisable方法,但是这个时候,脚本不会销毁,在这个状态下,可以重新回到OnEnable状态(enable=true)。当手动销毁或附属的游戏对象被销毁时,OnDestory才会被执行,当前脚本的生命周期结束。

原文地址:https://www.cnblogs.com/liuhan333/p/6477161.html