zoukankan      html  css  js  c++  java
  • 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的调用

  • 相关阅读:
    使用 ReplicationHandler 设置一个中继器(Repeater)
    SpringSource通过Spring for Android 1.0将Spring Framework引入到Android上
    Lotus Quickr 8.5.1 for Domino 中目录服务的配置详解
    Pdf文件编辑攻略
    Android 4.1最终版SDK和ADT Plugin全线发布
    JXL copySheet 的一个BUG
    Spring Mobile 1.0发布
    jQuery 1.8、1.9与2.0特性概览,2.0将移除对IE6/7/8的支持
    Regsvr32命令修复IE 重装IE
    系统性分析性能问题与调优方法
  • 原文地址:https://www.cnblogs.com/hont/p/5034419.html
Copyright © 2011-2022 走看看