大部分的主要Mono函数周期大家可能都已经了解了,但这些函数实在太多太杂,目前网上也并没有一个靠谱的完整周期测试,所以顺手也做了吧~
协程是假线程,还是基于Update周期的,其执行位置在Update和LateUpdate中间,可以看到执行协程的时间总是跟帧周期相同,并不是精准的计时执行。
(相比之下InvokeRepeating则是非常精准的计时周期。)
(但是新手请注意的是,协程绝不是为了让你做开枪间隔的计时器而设计的。)

在IEnumerator Start()内使用yield不会阻塞主线程,可见Start其实也是一种协程调用(Awake不是)。
(注:经常被忽略的是yield return new WaitForFixedUpdate()的使用,可以等待一次物理判定,用于只要一帧检测物理的需求,比如持续一帧的爆炸范围伤害。实例化,物理一次即销毁。)
但如果在Start内yield return null延迟一帧,则后续内容在第二个Update之后执行,见下图,因为第一个Update跟Start同帧执行,而下一个Update赶在了Start协程前面

执行协程的等待过程中,禁用GameObject对象会中断协程(这很体贴),但是!禁用脚本组件不会中断。
StopCoroutine可以中断协程对象,但是StopAllCoroutines()只能中断自己脚本中的协程。
下面是一张完整的周期循环图,可以说明很多问题,包括物理判定的先后

这一张图就更有趣了

关于Enable 和 Disable:
对象在被Destroy之前会调用Disable,对象被实例化在Awake之后调用Enable,但是!这里有个很微妙的关系,如果对象是启用状态,那么Enable紧跟在Awake之后调用,在这段代码中A物体在Awake里实例化B物体,而B物体的Enable抢在A的Enable之前执行,因为B物体的Awake先执行完毕,注意看A物体Awake里的Debug,也在B的Enable之后。但是从Start开始 就恢复正常顺序了。这也是Awake和Start在调用阶段上最大的区别。
还有一点需要注意的是物理周期在实例化当帧马上进行了碰撞判定。

再看这张,跟上一张不同的是实例化移动到了Start里,前面的顺序正常,但可以看到区别是B物体的Start改为在A的FixedUpdate之后执行了,但是仍然赶在了同一帧(这对一些极为细致的物理判定微操十分有用)。(此为第一帧的情况,之后Update和FixedUpdate便分道扬镳不再同步执行)
以上,以后有更多测试再补充吧~
其实很多答案可以从这张著名的周期图上找出,要多观察,不要只是看看,比如很多人的疑问是为什么我在代码里更改不了动画角色的骨骼角度数据?因为Update在Animation周期的前面呀,你改掉之后动画又帮你重置了,所以把修改动画数据的代码写在LateUpdate里就可以了,因为它在Animation周期后面~
这个图比较老的,其中Animation的周期部分发生了一些变化,其它还是适用当前的~

协程是假线程,还是基于Update周期的,其执行位置在Update和LateUpdate中间,可以看到执行协程的时间总是跟帧周期相同,并不是精准的计时执行。
(相比之下InvokeRepeating则是非常精准的计时周期。)
(但是新手请注意的是,协程绝不是为了让你做开枪间隔的计时器而设计的。)

在IEnumerator Start()内使用yield不会阻塞主线程,可见Start其实也是一种协程调用(Awake不是)。
(注:经常被忽略的是yield return new WaitForFixedUpdate()的使用,可以等待一次物理判定,用于只要一帧检测物理的需求,比如持续一帧的爆炸范围伤害。实例化,物理一次即销毁。)
但如果在Start内yield return null延迟一帧,则后续内容在第二个Update之后执行,见下图,因为第一个Update跟Start同帧执行,而下一个Update赶在了Start协程前面

执行协程的等待过程中,禁用GameObject对象会中断协程(这很体贴),但是!禁用脚本组件不会中断。
StopCoroutine可以中断协程对象,但是StopAllCoroutines()只能中断自己脚本中的协程。
下面是一张完整的周期循环图,可以说明很多问题,包括物理判定的先后

这一张图就更有趣了

关于Enable 和 Disable:
对象在被Destroy之前会调用Disable,对象被实例化在Awake之后调用Enable,但是!这里有个很微妙的关系,如果对象是启用状态,那么Enable紧跟在Awake之后调用,在这段代码中A物体在Awake里实例化B物体,而B物体的Enable抢在A的Enable之前执行,因为B物体的Awake先执行完毕,注意看A物体Awake里的Debug,也在B的Enable之后。但是从Start开始 就恢复正常顺序了。这也是Awake和Start在调用阶段上最大的区别。
还有一点需要注意的是物理周期在实例化当帧马上进行了碰撞判定。

再看这张,跟上一张不同的是实例化移动到了Start里,前面的顺序正常,但可以看到区别是B物体的Start改为在A的FixedUpdate之后执行了,但是仍然赶在了同一帧(这对一些极为细致的物理判定微操十分有用)。(此为第一帧的情况,之后Update和FixedUpdate便分道扬镳不再同步执行)
以上,以后有更多测试再补充吧~
其实很多答案可以从这张著名的周期图上找出,要多观察,不要只是看看,比如很多人的疑问是为什么我在代码里更改不了动画角色的骨骼角度数据?因为Update在Animation周期的前面呀,你改掉之后动画又帮你重置了,所以把修改动画数据的代码写在LateUpdate里就可以了,因为它在Animation周期后面~
这个图比较老的,其中Animation的周期部分发生了一些变化,其它还是适用当前的~

