环境
- 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。
网友评论