关于同一个GameObject上面的多个monobehavior的Awake顺序问题

今天做一个需求,这个需求会在同一个gameobject上面挂载多个monobehavior脚本。这几个脚本在Awake时要获取彼此的实例,如下图所示:

三个类的Awake脚本大概是这样:

那么问题来了,

1. 已知Unity的脚本Awake是有顺序的,那么这三个先后顺序是固定的吗?

2. 假如三个脚本先后Awake,那么第一个Awake的类会不会得不到另外两个类的实例?

我连续运行了5次,都是下面的结果:

Awake的顺序是3->2->1。

由此结果可以推导出第二个问题的答案,那就是脚本没有awake时也是可以被获取到的。至于为什么会这样,我在Unity手册里找到了这段话:

For active GameObjects placed in a Scene, Unity calls Awake after all active GameObjects in the Scene are initialized, so you can safely use methods such as GameObject.FindWithTag to query other GameObjects.

意思是当Awake执行的时候,Unity已经把场景里所有的激活状态的物体都初始化完毕了,所以你可以获取场景里的任何物体或者物体身上的组件。

完美解释!

先别急着推断第一个问题的答案,我们多做下实验,我现在调整了脚本在gameobject上的顺序如下:

再重启Unity并重新运行:

Awake的顺序还是3->2->1,并没有改变。

这里我挺迷惑的,因为今天在公司做的实验,当我重启unity后Awake顺序就变了。所以第一个问题暂时没有结论。。。

猜你喜欢

转载自blog.csdn.net/qq_17758883/article/details/118164288