找回密码
 立即注册
查看: 318|回复: 0

[Unity] 脚本生命周期

[复制链接]
发表于 2022-5-12 08:55 | 显示全部楼层 |阅读模式
环境

    Unity 2020.3.25f1
内容


这里准备记录的不是,生命周期执行的顺序,而是它什么时候不会执行!!!关于执行顺序,Unity Manual里有非常详细的流程介绍:Order of execution for event functions
1. Awake
Awake: This function is always called before any Start functions and also just after a prefab
is instantiated. (If a GameObject is inactive during start up Awake is not called until it is made active.)
Manual对Awake的说明里提到:如果一个GameObject在启动时处于inactive状态,Awake不会被调用
这是今天突然发现的一个问题,直接把我整不会了Orz...很多年前,专门对它进行过测试(版本是Unity4.7.2以左),当时的结论【Awake在Instantiate时一定会执行,OnEnable、Start需要等到active的时候】,没想到它竟然变了。
2. OnDestroy


OnDestroy是这篇记录的起因。
在测试重启流程时,发现有些脚本的OnDestroy没有执行,导致一些引用没有被及时清理,比如:C#里持有的xLua回调。如果这些delegate没有被及时清理,在销毁Lua State时会报错InvalidOperationException: try to dispose a LuaEnv with C# callback!.
经过推测+测试,OnDestroy跟Awake是要配对执行的。如果一个对象的Awake没有执行,那么它销毁时OnDestroy也不会执行!
这个机制其实会产生一些问题,
3. OnDisable


OnDisable跟OnDestroy类似,它要跟OnEnable配对执行。一次OnEnable后,只会执行一次OnDisable。
如果一个脚本,先Inactive再Destroy,那么在Inactive时OnDisable就执行完了,后面的Destroy不会再次执行;如果一个Active的脚本直接被Destroy,会先执行OnDisable,然后执行Destroy。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 12:32 , Processed in 0.154148 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表