先大体的给一个官方的Flowchart然后再说一些实际上可能出现的细节问题。
image.png
原图地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg
就常用的函数来说顺序是这样的:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate > OnWillRenderObject > OnGUI
======================================================================================
然后说一下常见的问题:
-
FixedUpdate和Update问题:
Update每帧调用,但因为机器的性能原因,帧数是波动的,所以这个函数的刷新时间是不规律的。如果在Update中添加物体匀速运动,需要乘上Time.deltatime
FixedUpdate固定时间调用一次,即一秒钟调用的次数是固定的,如需更改频率,可至Edit -> Project Setting -> Time中修改Fixed Timestep。如果同一次循环中出现FixedUpdate和Update那么FixedUpdate优先,但不建议这两个函数有依赖(因为update的刷新频率一直在变啊,谁知道会发生什么) -
OnEnable和OnDisable函数都是一旦被setActive()修改,瞬间跳转执行。比如下图的输出是
“On Disable”
“Update”
虽然实际上是update先开始image.png
如果setActive(false), 那么先跳转OnDisable,然后进入正常流程等待OnDestory
-
另外以下函数:Awake,Start, FixedUpdate, Update, LateUpdate, OnWillRenderObject, OnGUI都是项目中所有**的component的同时运行的,比如:
“Awake code1”
“Awake code2”
......
"Update code1"
"Update code2"
......
而不是
“Awake code1”
“Start code1”
“Fixed code1”
......
“Awake code2”(这是错的)
...... -
实际上如果给OnEnable输出显示应该是这样的
“Awake code1”
“OnEnable code1”
“Awake code2”
“OnEnable code2”
......
"Update code1"
"Update code2"
......
因为就像我上文说的,OnEnable和OnDisable是跳转执行的。
如果通过Instantiate一个原先场景中没有的prefab,那么瞬间跳转执行完prefab中所以代码的Awake和Enable。 -
关于所有Awake等函数内部的顺序,是后挂到**的gameobject上的代码,先运行。可以理解为unity用一个“栈”来维护所有component的运行顺序,和对应gameobject挂入场景的顺序无关。但是OnWillRenderObject和OnGUI则不符合这个规律,他们有一套自己的先后顺序标准。我们以后再研究。而且OnGUI一个循环内会被调用多次。
-
关于StartCoroutine的问题,StartCoroutine(function())运行的function会先运行到yield,然后
yield WaitForFixedUpdate的话则到下一个有Fixupdate的循环再接着运行。
yield null(下次循环执行)
yield WaitForSeconds(t)(等待 t 时间后接着执行下面命令) -
InitializeOnLoad问题,[InitializeOnLoad]的且有static构造函数的类会随着unity项目的运行第一个运行,如下图例子
image.png
image.png
- 另外关于Reset()函数问题:Reset函数在项目运行阶段是不运行的,只在编辑模式运行,用于初始化参数:运行方式有两种 1.手动Reset如下图,2.给gameobject第一次挂上该script
image.png
image.png
上文都是我自己测试总结出来的,如果有疏漏欢迎指出~
作者:NorthShepherd
链接:https://www.jianshu.com/p/b1be7f8dd947
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。