发这篇文章之前遇到的问题是这样的。

初期在一个空物体上挂了一个GameController的脚本,用来控制游戏的流程等,使用了单例,在Awake中初始化Instance。

然后一个一个按钮脚本的OnEnable中使用了这个对象,结果返回了空对象的错误。

 

空对象也就是说在OnEnable中使用在其他脚本Awake中初始化的对象没有实例化。我原本以为所有脚本像一个委托一样,等全部的Awake都执行完后在继续,结果是一个脚本一个脚本的执行。

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

最先被添加到GameObject上的脚本是最后被调用的,所以我这里把需要提前运行的脚本重新添加了一下

然后我复制了一下GameController移除后在粘贴回来,发现错误没有了,执行的先后也正常了。

 

除了以上方法还可以使用Edit > Project Settings > Script Execution Order对脚本进行运行的顺序调整。