unity脚本MonoBehaviour默认方法执行顺序测试

基础的MonoBehaviour默认方法执行顺序参考上篇文章Unity脚本执行顺序

测试结果:

  • 1.通过Instantiate加载Prefab时Awake和OnEnable会先后执行,并且在Instantiate执行过程中执行的;
  • 2.通过SceneManager.LoadScene加载场景时是在当前代码块执行完成后并且执行Ondestroy后开始执行所加载场景test1内的代码的,所以在当前代码块调用完LoadScene后用GameObject.Find去获取场景内的物体时是获取不到的
  • 3.在Awake中执行SceneManager.LoadScene,当前的Start方法是不会执行的
  • 4.在执行gameObject.AddComponent().Init();时会先执行TestPrefab中的Awake和OnEnable后才执行Init

这里先上工程截图

unity脚本MonoBehaviour默认方法执行顺序测试_第1张图片
场景test2.png

unity脚本MonoBehaviour默认方法执行顺序测试_第2张图片
场景test1.png

unity脚本MonoBehaviour默认方法执行顺序测试_第3张图片
TestPrefab.png

这里在TestPrefab上只挂TestPrefab一个脚本
unity脚本MonoBehaviour默认方法执行顺序测试_第4张图片
TestPrefab2.png

这里在TestPrefab2上只挂TestPrefab2一个脚本
测试是在test2场景中运行,脚本加载切换到test1场景

这里放上所有的脚本

//=====================================================
// - FileName:      Test.cs
// - Created:       wangguoqing
// - UserName:      2018/03/02 14:04:52
// - Email:         [email protected]
// - Description:   
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestLoading : MonoBehaviour
{
    #region Method Call Order
    void Awake()
    {
        Debug.LogWarning("TestLoading:::Awake^^^Begin^^^^^^^^^^");
        //LoadPrefab();
        //LoadScene();
        Debug.LogWarning("TestLoading:::Awake^^^End^^^^^^^^^^");
    }

    void OnEnable()
    {
        Debug.LogWarning("TestLoading:::OnEnable^^^^^^^^^^^^^");
    }
    // Use this for initialization
    void Start()
    {
        Debug.LogWarning("TestLoading:::Start^^^^^^^^Begin^^^^^");
        LoadPrefab();
        LoadScene();
        Debug.LogWarning("TestLoading:::Start^^^^^^^^End^^^^^");
    }


    void LoadPrefab()
    {
        GameObject asset = Resources.Load("TestPrefab");
        GameObject obj = GameObject.Instantiate(asset);
    }
    void LoadScene()
    {
        UnityEngine.SceneManagement.SceneManager.LoadScene("test1");
    }

    void FixedUpdate()
    {
        //Debug.LogWarning("TestLoading:::FixedUpdate^^^^^^^^^^^^^");

    }
    // Update is called once per frame
    void Update()
    {
        //Debug.LogWarning("TestLoading:::Update^^^^^^^^^^^^^");

    }

    void LateUpdate()
    {
        //Debug.LogWarning("TestLoading:::LateUpdate^^^^^^^^^^^^^");

    }

    void OnGUI()
    {
        //Debug.LogWarning("TestLoading:::OnGUI^^^^^^^^^^^^^");
    }

    void Reset()
    {
        Debug.LogWarning("TestLoading:::Reset^^^^^^^^^^^^^");
    }

    void OnDisable()
    {
        Debug.LogWarning("TestLoading:::OnDisable^^^^^^^^^^^^^");
    }

    void OnDestroy()
    {
        Debug.LogWarning("TestLoading:::OnDestroy^^^^^^^^^^^^^");
    }
    #endregion
}

//=====================================================
// - FileName:      TestScene.cs
// - Created:       wangguoqing
// - UserName:      2018/03/02 14:08:53
// - Email:         [email protected]
// - Description:   
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScene : MonoBehaviour {

    #region Method Call Order
    void Awake()
    {
        Debug.Log("TestScene:::Awake^^^Begin^^^^^^^^^^");
        LoadPrefab();
        Debug.Log("TestScene:::Awake^^^End^^^^^^^^^^");
    }

    void OnEnable()
    {
        Debug.Log("TestScene:::OnEnable^^^^^^^^^^^^^");
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("TestScene:::Start^^^^^^^^^^^^^");
    }
    void LoadPrefab()
    {
        GameObject asset = Resources.Load("TestPrefab2");
        GameObject obj = GameObject.Instantiate(asset);
    }

    void FixedUpdate()
    {
        //Debug.Log("TestScene:::FixedUpdate^^^^^^^^^^^^^");

    }
    // Update is called once per frame
    void Update()
    {
        //Debug.Log("TestScene:::Update^^^^^^^^^^^^^");

    }

    void LateUpdate()
    {
        //Debug.Log("TestScene:::LateUpdate^^^^^^^^^^^^^");

    }

    void OnGUI()
    {
        //Debug.Log("TestScene:::OnGUI^^^^^^^^^^^^^");
    }

    void Reset()
    {
        Debug.Log("TestScene:::Reset^^^^^^^^^^^^^");
    }

    void OnDisable()
    {
        Debug.Log("TestScene:::OnDisable^^^^^^^^^^^^^");
    }

    void OnDestroy()
    {
        Debug.Log("TestScene:::OnDestroy^^^^^^^^^^^^^");
    }
    #endregion
}

//=====================================================
// - FileName:      TestScene1.cs
// - Created:       wangguoqing
// - UserName:      2018/03/02 14:08:53
// - Email:         [email protected]
// - Description:   
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScene1 : MonoBehaviour {

    #region Method Call Order
    void Awake()
    {
        Debug.Log("TestScene1:::Awake^^^^^^^^^^^^^");
    }

    void OnEnable()
    {
        Debug.Log("TestScene1:::OnEnable^^^^^^^^^^^^^");
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("TestScene1:::Start^^^^^^^^^^^^^");
    }


    void FixedUpdate()
    {
        //Debug.Log("TestScene1:::FixedUpdate^^^^^^^^^^^^^");

    }
    // Update is called once per frame
    void Update()
    {
        //Debug.Log("TestScene1:::Update^^^^^^^^^^^^^");

    }

    void LateUpdate()
    {
        //Debug.Log("TestScene1:::LateUpdate^^^^^^^^^^^^^");

    }

    void OnGUI()
    {
        //Debug.Log("TestScene1:::OnGUI^^^^^^^^^^^^^");
    }

    void Reset()
    {
        Debug.Log("TestScene1:::Reset^^^^^^^^^^^^^");
    }

    void OnDisable()
    {
        Debug.Log("TestScene1:::OnDisable^^^^^^^^^^^^^");
    }

    void OnDestroy()
    {
        Debug.Log("TestScene1:::OnDestroy^^^^^^^^^^^^^");
    }
    #endregion
}

//=====================================================
// - FileName:      TestPrefab.cs
// - Created:       wangguoqing
// - UserName:      2018/03/02 14:04:52
// - Email:         [email protected]
// - Description:   
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// 
/// Unity脚本执行顺序 测试
/// 
public class TestPrefab : MonoBehaviour
{

    void Awake()
    {
        Debug.Log("TestPrefab:::Awake^^^^^^^^^^^^^");
    }

    void OnEnable()
    {
        Debug.Log("TestPrefab:::OnEnable^^^^^^^^^^^^^");
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("TestPrefab:::Start^^^^^^^^^^^^^");
    }

    public void Init()
    {
        Debug.Log("TestPrefab:::Init^^^^^^^^^^^^^");
    }
    void FixedUpdate()
    {
        //Debug.Log("TestPrefab:::FixedUpdate^^^^^^^^^^^^^");

    }
    // Update is called once per frame
    void Update()
    {
        //Debug.Log("TestPrefab:::Update^^^^^^^^^^^^^");

    }

    void LateUpdate()
    {
        //Debug.Log("TestPrefab:::LateUpdate^^^^^^^^^^^^^");

    }

    void OnGUI()
    {
        //Debug.Log("TestPrefab:::OnGUI^^^^^^^^^^^^^");
    }

    void Reset()
    {
        Debug.Log("TestPrefab:::Reset^^^^^^^^^^^^^");
    }

    void OnDisable()
    {
        Debug.Log("TestPrefab:::OnDisable^^^^^^^^^^^^^");
    }

    void OnDestroy()
    {
        Debug.Log("TestPrefab:::OnDestroy^^^^^^^^^^^^^");
    }
}

//=====================================================
// - FileName:      TestPrefab2.cs
// - Created:       wangguoqing
// - UserName:      2018/03/02 14:04:52
// - Email:         [email protected]
// - Description:   
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// 
/// Unity脚本执行顺序 测试
/// 
public class TestPrefab2 : MonoBehaviour
{

    void Awake()
    {
        Debug.Log("TestPrefab2:::Awake^^^^^^^^^^^^^");
    }

    void OnEnable()
    {
        Debug.Log("TestPrefab2:::OnEnable^^^^^^^^^^^^^");
    }
    // Use this for initialization
    void Start()
    {
        Debug.Log("TestPrefab2:::Start^^^^^^^^^^^^^");
    }


    void FixedUpdate()
    {
        //Debug.Log("TestPrefab2:::FixedUpdate^^^^^^^^^^^^^");

    }
    // Update is called once per frame
    void Update()
    {
        //Debug.Log("TestPrefab2:::Update^^^^^^^^^^^^^");

    }

    void LateUpdate()
    {
        //Debug.Log("TestPrefab2:::LateUpdate^^^^^^^^^^^^^");

    }

    void OnGUI()
    {
        //Debug.Log("TestPrefab2:::OnGUI^^^^^^^^^^^^^");
    }

    void Reset()
    {
        Debug.Log("TestPrefab2:::Reset^^^^^^^^^^^^^");
    }

    void OnDisable()
    {
        Debug.Log("TestPrefab2:::OnDisable^^^^^^^^^^^^^");
    }

    void OnDestroy()
    {
        Debug.Log("TestPrefab2:::OnDestroy^^^^^^^^^^^^^");
    }
}

在test2场景中直接运行后的结果

unity脚本MonoBehaviour默认方法执行顺序测试_第5张图片
image.png

将TestLoading在Awake方法和Start方法修改成如下

unity脚本MonoBehaviour默认方法执行顺序测试_第6张图片
修改代码.png

在test2场景中直接运行上面修改后的结果
unity脚本MonoBehaviour默认方法执行顺序测试_第7张图片
image.png

结果表明:

  • 1.通过Instantiate加载Prefab时Awake和OnEnable会先后执行,并且在Instantiate执行过程中执行的;
  • 2.通过SceneManager.LoadScene加载场景时是在当前代码块执行完成后并且执行Ondestroy后开始执行所加载场景test1内的代码的,所以在当前代码块调用完LoadScene后用GameObject.Find去获取场景内的物体时是获取不到的
  • 3.在Awake中执行SceneManager.LoadScene,当前的Start方法是不会执行的


当添加脚本组件时如下代码

unity脚本MonoBehaviour默认方法执行顺序测试_第8张图片
image.png

执行结果为
unity脚本MonoBehaviour默认方法执行顺序测试_第9张图片
image.png

  • 4.在执行gameObject.AddComponent().Init();时会先执行TestPrefab中的Awake和OnEnable后才执行Init

你可能感兴趣的:(unity脚本MonoBehaviour默认方法执行顺序测试)