脚本生命周期

Posted cganote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了脚本生命周期相关的知识,希望对你有一定的参考价值。

技术分享图片

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

Awake(一次):Awake在所有对象被初始化之后调用,用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内Awake仅被调用一次。Awake不能用来执行协同程序。
每个游戏物体上的Awake以随机的顺序被调用。所以在一般时候,用Awake来设置脚本间的引用,然后用Start来传递信息。

OnEnable:在Awake之后调用。控制脚本中组件的启动与禁用。
例如:this.enable=false,则会直接跳转到OnDisable方法执行一次,其它的任何方法,将不再被执行。

Start(一次):Start函数总是在Awake函数之后调用。Start在生命周期中只被调用一次。
Start和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码,协调初始化顺序。

FixedUpdate(每帧):固定帧(固定的时间间隔,不受帧率(FPS)影响)更新,更新频率默认为0.02s。
FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。

Update(每帧):正常帧更新,每一帧都执行,用于更新逻辑。
Update比较适合做控制。如果卡帧了Update就不会再执行,而FixedUpdate则继续执行。

LateUpdate(每帧):在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行。
LateUpdate可用于调整脚本执行顺序。例如:相机跟随就可以用这个函数,即人物移动在Update中实现,相机跟随在LateUpdate()中实现,播放后的效果是:角色移动发生在前,相机移动紧跟其后。(如果相机也在Update里执行,就可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。)

OnGUI(每帧)在渲染和处理GUI事件时调用。每帧都执行。
在界面显示一个button或label时常常用到它。

OnDisable:脚本被卸载时,OnDisable将被调用(脚本不会被销毁)。OnDisable不能用于协同程序。
常用于一些用于清理的事件。

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

函数执行顺序:

**Awake→OnEable→ Start → FixedUpdate→Update →LateUpdate →OnGUI →Reset → OnDisable →OnDestroy **

最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,如果在这个地方将当前脚本禁用:this.enable=false,则会直接执行OnDisable方法,其它的任何方法,都将不再被执行。

如果当前脚本处于可用状态:this.enable =true,则按正常的执行顺序是继续向下执行OnEnable

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

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

再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI,用于绘制图形界面,每帧都执行。

再向后,就是卸载模块(TearDown),当被禁用(enable=false)时,会执行OnDisable方法,但是这个时候,脚本并不会被销毁,在这个状态下,可以重新回到OnEnable状态(enable=true)。

当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。



作者:FLY旳影子
链接:https://www.jianshu.com/p/32ce8768607f
來源:简书













以上是关于脚本生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Unity---脚本事件函数和生命周期

Unity脚本生命周期

Unity脚本的生命周期

unity脚本生命周期

脚本生命周期

把脚本的生命周期用虚拟方法可以重写调用