其实在刚接触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 挂起的协程 并恢复)