美文网首页
[Unity] 脚本生命周期

[Unity] 脚本生命周期

作者: _Walker__ | 来源:发表于2022-05-11 19:53 被阅读0次

    环境

    • 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] 脚本生命周期

          本文链接:https://www.haomeiwen.com/subject/acprurtx.html