美文网首页
[Unity3D]Instantiate后的函数调用顺序测试

[Unity3D]Instantiate后的函数调用顺序测试

作者: 煎蛋的少年 | 来源:发表于2019-07-09 11:31 被阅读0次

今天突然好奇一个问题,如果我 var go = GameObject.Instantiate(item)创建一个物体后,下一行马上调用go.xxx函数,那么到底和start/awake相比,函数调用顺序是怎样的呢。于是就开始测试。

/// <summary>
/// 被创建物体挂载的脚本
/// </summary>
public class ItemID : MonoBehaviour
{

    private void Awake() {
        Debug.LogError("awake = " + this.gameObject.GetInstanceID());
        Debug.LogError("tick = " + DateTime.Now.Ticks);
    }

    // Use this for initialization
    void Start() {
        Debug.LogError("start = " + this.gameObject.GetInstanceID());
        Debug.LogError("tick = " + DateTime.Now.Ticks);
    }
}

分隔

/// <summary>
/// 创建物体的脚本
/// </summary>
public class TestStart : MonoBehaviour {

    public GameObject ob;

    // Use this for initialization
    void Start () {
        
    }


    void Update() {
        if (Input.GetKeyDown(KeyCode.A)) {
            GameObject go = GameObject.Instantiate(ob);
            Debug.LogError("nextline = " + go.GetInstanceID());
            Debug.LogError("tick = " + DateTime.Now.Ticks);
        }
    }

    //private void LateUpdate() {
    //    if (Input.GetKeyDown(KeyCode.A)) {
    //        GameObject go = GameObject.Instantiate(ob);
    //        Debug.LogError("nextline = " + go.GetInstanceID());
    //        Debug.LogError("tick = " + DateTime.Now.Ticks);
    //    }
    //}

    //private void FixedUpdate() {
    //    if (Input.GetKeyDown(KeyCode.A)) {
    //        GameObject go = GameObject.Instantiate(ob);
    //        Debug.LogError("nextline = " + go.GetInstanceID());
    //        Debug.LogError("tick = " + DateTime.Now.Ticks);
    //    }
    //}
}

为了避免一些遗漏的,我在三个update函数里分别作了测试,结果如下。

测试结果:

Update的结果


update.png

LateUpdate的结果


lateupdate.png

FixUpdate的结果


fixupdate.png

可以看得出,基本的顺序是 awake --- nextline --- start , 值得一提的是,在不同的update函数中,nextline 和 start 的时间差是不一样的,lateupdate和update的时间差相差不大,fixupdate的时间差就基本相等了,为此我又做了几次测试,fixupdate上nextline和start的时间差是不稳定的。猜测start函数是在每次update之前调用,而fixupdate有单独的计时器,得到这个结果也算合理。

相关文章

  • [Unity3D]Instantiate后的函数调用顺序测试

    今天突然好奇一个问题,如果我 var go = GameObject.Instantiate(item)创建一个...

  • Unity3D中自带事件函数的执行顺序

    在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行。其执行顺序如下: 编辑器...

  • go defer

    函数体执行结束后,按照调用顺序的反向,逐个执行 即时函数发生严重错误也会执行 支持匿名函数的调用 常用于自愿清理、...

  • 组合挂起函数

    挂起函数调用顺序 在协程中顺序调用多个挂起函数 这多个挂起函数执行的顺序和常规代码中一样 默认都是顺序执行的常规代...

  • 为什么fragment不能用构造函数传参数

    fragment的构造函数是空的 instantiate方法中创建了fragment对象 instantiate ...

  • Unity中Instantiate一个prefab时需要注意的

    在调用Instantiate()方法使用prefab创建对象时,接收Instantiate()方法返回值的变量类型...

  • 提一嘴defer

    1.defer的执行方式类似其它语言中的析构函数,在函数执行体结束后按照调用顺序的相反顺序逐个执行 2.即使函数发...

  • Unity3D中自带事件函数的执行顺序

    在Unity3D继承自MonoBehavior的脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚...

  • C++中对象构造顺序

    单个对象的构造与析构 单个对象创建时构造函数的调用顺序1、调用父类的构造过程2、调用成员变量的构造函数(调用顺序与...

  • promise async/await

    箭头函数 普通函数 简写 就是 箭头函数 正文 当有多个接口需要顺序调用时顺序调用是指 :接口1返回的数据 ,作为...

网友评论

      本文标题:[Unity3D]Instantiate后的函数调用顺序测试

      本文链接:https://www.haomeiwen.com/subject/tsztkctx.html