程序员人生 网站导航

[Unity-20] Unity不同脚本之间的执行顺序

栏目:互联网时间:2014-12-12 08:51:28

我们都知道,Unity中某个脚本的履行顺序是Awake、Start、Update、LateUpdate等,但是不同的脚本之间的履行顺序是怎样的呢?

例如我有两个脚本Script1和Script2,那末这两个脚本的Awake履行顺序是怎样的呢?

要知道真相我们就必须了解Unity后台的运行原理,其实Unity后台是单线程履行的,所谓的协程都是伪多线程。不同脚本的Awake在后台的履行真相是这样的:

后台Awake() { 脚本0Awake(); 脚本1Awake(); ........ }
Start、Update等函数也是相同的道理,那末问题就来了,这么多脚本,他们的履行顺序究竟是怎样的呢?

这个关系我还真没弄明白其中的规律,不过Unity提供了1个设置不同脚本之间履行顺序的功能:

1、先在project窗口选中1个脚本文件,然后在Inspector卡中显示以下:

2、点击右上角Execution Order显示以下:

3、点击加号添加你想要排序的脚本文件。

4、拖动脚本文件进行排序。

这样脚本就会依照你排的顺序顺次进行初始化。

我们之所以要设置脚本间的履行顺序主要是为了不下面这类情况

public class Script1 : MonoBehaviour { void Awake () { GameObject.CreatePrimitive(PrimitiveType.Cube); } }

public class Script2 : MonoBehaviour { void Awake () { GameObject go = GameObject.Find("Cube"); Debug.Log(go.name); } }
这样如果Script2在Scirpt1之前履行的话,就会报错。因此需要对脚本初始化顺序进行设置。

但是还有另外1种方法来解决上述问题:

那就是在Script1的Awake创建cube,在Script2的Start访问cube,这样就不会出错啦。

由于后台的也是严格依照Awake早于Start的顺序履行的,也就是先把所有脚本的Awake履行完,然后再履行所有脚本的Start。




------分隔线----------------------------
------分隔线----------------------------

最新技术推荐