问题:
在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等函数的执行是有规律的:
- 最先被添加到GameObject上的脚本中的Awake、OnEable是最后被调用的,反之最后被添加的则会最先被调用。
- 当每个脚本的Awake、OnEable都被调用完了之后,才会调用各个脚本的Start函数。
- 每个脚本的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
运行: