首页 > 代码库 > Unity3d学习 基础-关于MonoBehaviour的生命周期

Unity3d学习 基础-关于MonoBehaviour的生命周期

  其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解。而且在刚开始就接触Unity3D时,看到所有脚本中编写的类

几乎都继承了MonoBehaviour这个父类,那么MonoBehaviour这个类是干什么的

  首先我们看一关于MonoBehavior这个类的继承关系:

  技术分享

  从上图可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的角色,当我们需要将一个自定义脚本已组件的形式添加到对应的GameObject时,该脚

是必须要继承MonoBehaviour。所以综上MonoBehaviour的作用就是开发者可以自定义自己的组件类。

  当我们拥有拥有自己的组件类时,我们会对类的生命周期,和一些重要的接口感兴趣,以便在使用过程中,不那么疑惑。

  我们可以先看一下 Unity3D官网上的一张图 可以先熟悉一下整体的流程(在网页的中间):

  首先我们可以将这张图分成两种状态:

  • 编辑器下的状态:可以点击设置,Reset函数,将脚本恢复默认状态
  • 运行状态(真正的生命周期):,除Reset函数外,其余函数都在运行状态执行(加特殊字段,该脚本也可已在编辑器运行)

  我们主要关心的是在运行状态,因为此时脚本的生命周期真正开始,先看如下图:

  技术分享

  当我们点击Unity3D的Play按钮时,脚本会从编辑器模式进入运行模式,会先走Initialization步骤,从名字可以看出,该步骤做的是初始化操作,且确定了三个函数的调用时序

  那三个函数有啥区别:

  • Awake:
    •  调用条件: gameObj is Active(场景开始时 当前obj的Active 是 true) 或者 在 Instantiate 一个 Prefab之后
    •  注意事项:
      • 总是在所有脚本调用Start之前调用如下图:

        技术分享

      • Awake函数只调用一次
  • OnEnable:
    • 调用条件: 当执行完Active时
    • 注意事项 : 将enable = false, 会在执行完OnEnable后,直接执行OnDisable,在OnDisable设置enable = true就会跳到OnEnable(切记不要出现死循环:)
  • Start:          
    • 调用条件 : OnEnable执行完
    • 注意事项:Start只会执行一次,无论下次第几次调用到OnEnable,均不会在执行(适合初始化)

  上述是生命周期的开始,我们先不讲生命周期运行,直接将生命周期的结束,如下图:

技术分享

  • OnApplicationQuit:当你的应用程序退出时,会先调用OnApplicationQuit(你可以在此时来save你的数据)
  • OnDisable:除在OnApplicationQuit调用时会调用,还会再设置enable = false 或 active = false 调用
  • OnDestory:除在OnApplicationQuit调用时会调用,还有在手动的Destory gameObject时  

  讲完了生命周期的开始和结束,现在聊聊比较重要的部分:

  技术分享

  技术分享

  上述有很多Update 和 很多yield , 关于yield知识点可以看这里 , 我们可以从上述看到三个Update调用的顺序,FixedUpdate --> Update --> LateUpdate:

  技术分享

  我们可以看到,Unity是调用完所有脚本的FixedUpdate,在调用所有脚本的Update,在调用所有脚本的LateUpdate。

  关于协程中的yield其实很好理解 ,如下图:

  技术分享

  比如 yield null ,表示当函数运行到此处时,会挂起(中断),等下一帧,所有的脚本Update运行完后,会继续执行此函数。

  (上图的意思是回去检测所有因yield null 挂起的协程 并恢复)

  

 

Unity3d学习 基础-关于MonoBehaviour的生命周期