[Unity 3D] 多个C#脚本中Awake、OnEnable和Start等函数的执行顺序

问题:

 在Unity的官方文档中关于Awake 和Start函数的解释里有提到:

原文:Each GameObject's Awake is called in a random order between objects.

翻译:多个GameObject的Awake之间是以随机的顺序调用的。

如果按照官方文档里的说法,那我们是不是就没办法控制多个脚本间Awake的顺序了?

No! No! No!

------------------------------------------------------------------------------------------------------------------------------------------------------

先说结论:

经过测试以后发现,各个GameObject的脚本之间的Awake、OnEable和Start等函数的执行是有规律的:

  1. 最先被添加到GameObject上的脚本中的Awake、OnEable是最后被调用的,反之最后被添加的则会最先被调用。
  2. 当每个脚本的Awake、OnEable都被调用完了之后,才会调用各个脚本的Start函数。
  3. 每个脚本的Start都被调用完了之后,才会调用各个脚本的FixedUpdate函数。

我们再总结一下:

  • 最先被添加的脚本最后被执行,反之则反。
  • Awake和OnEable成对出现,一个脚本的Awake和OnEable都调用完了才调用下一个脚本的Awake和OnEable。
  • 所有同类函数都调用完了才会调用下一类函数,比如所有脚本的Awake和OnEable都被调用完了才会调用它们的Start,所有脚本的Start都被调用完了才会调用它们的FixedUpdate。

------------------------------------------------------------------------------------------------------------------------------------------------------

测试过程:

1、创建3个GameObject

2、创建3个脚本(包含Awake、OnEable和Start)

脚本内容:

using UnityEngine;
// 3个脚本分别序号1、2、3
public class Script1 : MonoBehaviour {

    private void Awake()
    {
        Debug.Log("Awake 1");    
    }

    private void OnEnable()
    {
        Debug.Log("OnEnable 1");
    }

    private void Start()
    {
        Debug.Log("Start 1");
    }
}

3、将脚本1、2、3按顺序分别添加到GameObject 1、2、3

运行:

猜你喜欢

转载自blog.csdn.net/iFasWind/article/details/81094938