Unity脚本在层级面板中的执行顺序测试2

上一篇测试了生成顺序对执行顺序的影响,链接:LINK

执行顺序测试3: LINK

 

这篇主要测试一下Awake,OnEnable,Start三个常用消息的循环顺序

 

 


 

1.测试消息循环顺序

 

先上一个最简单的打印测试

测试结果为Awake和OnEnable在第一次循环中,Start在第二次循环中

 

关于调用时的帧数

第0帧是不做渲染的,第一帧才做渲染,并且Start延后一帧

 

 

 

 

2.测试动态创建时的顺序

 

2.1 - Component和GameObject都为打开状态

public TMP template;

void Start()
{
    var go = Instantiate(template.gameObject);
    print("--Creater Modify--");
    go.SetActive(true);
}
Dynamic Create

Awake和OnEnable优先被调用,连在此之前调用初始化的机会都没有。

 

 

如果将Prefab保存为非激活状态,并在初始化后激活。即可调用初始化代码:

 

 

 

 

 

2.2 - 测试GameObject为打开状态,Component非打开状态(后手动打开)

 

 

Awake是针对GameObject,而OnEnable是针对组件Component。所以组件不打开依然会调用Awake

当手动打开组件之后,测试结果与之前一致。

 

 

动态创建测试:

 

也和上面的测试结果吻合,不能在设置enable之后调用初始化代码。因为OnEnable是立即调用的

 

Tips:虽然Start延后一帧,但Awake/OnEnable和Start之间并不会穿插进Update/FixedUpdate的调用,

但IEnumerator Start()造成的异步执行,是会有Update/FixedUpdate调用的。

 

 

最后归纳一下:

1.Awake和OnEnable在第一次循环中,Start在第二次循环中。并且Start延后一帧。

2.如果是静置物体,Awake/OnEnable在第0帧调用,Start在第1帧调用。

3.OnEnable,Start消息属于组件本身,Awake属于GameObject。所以即使组件不激活,Awake也会被调用

4.在Awake/OnEnable和Start之间虽然延后一帧,但并不会穿插进Update/FixedUpdate的调用

转载于:https://www.cnblogs.com/hont/p/5034419.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值