Start()函数与Awake()函数 一个容易被忽略的差别

Start()函数与Awake()函数,想必平时大家用的都不少,一般我们都用这两个函数来做初始化工作。我们先看看脚本手册对这两个函数的的描述。
Start:   Start is called just before any of the Update methods is called the first time.
Awake:Awake is called when the script instance is being loaded.
 
据描述,我们得知:
Start函数只是在所有所有的Update() (具体指Update, LateUpdate, FixedUpdate)方法第一次被调用之前被调用,Awake函数则是当脚本的实例被载入时被调用。
 
这里其实隐含了一件事,也带来了一个问题:
隐含的事就是,Awake()函数是在Start()函数之前被调用,带来的问题则是,自定义函数的调用顺序和Awake()函数和Start()的调用顺序是什么关系呢?在Start()函数和Awake()函数之前还是之后,又或者有其他答案呢?
 
可以通过这样一个测试来获取答案:
创建两个物体Cube,Sphere和对应的脚本Cube.cs, Sphere.cs, Sphere.cs中有一个自定义的函数SphereFunction()函数,将Sphere作为预设,然后从Cube中读取Sphere预设并实例化,然后调用SphereFunction();,就可以看到执行顺序是Awake()函数, SphereFunction()函数, Start()函数。
具体脚本我已经上传了附件。

这样我们就可以得到结论:
自定义函数的调用是在Awake()函数之后, 在Start()函数之前。这个结论有什么用呢?接着讨论。 有时候我们可能需要做一个预设, 并且这个预设有一个自定义函数,这个自定义函数中使用的GameObject是在脚本中做的绑定(比如用Find函数或者在Resource.Load()绑定的),这种时候如果绑定的工作放在Start()函数中,就会发生对象为null的错误了。除了游戏对象的绑定外,如果在自定义函数中使用的变量是在Start()函数中做的初始化工作,也会发生上面的现象,因而得到错误的结果。
 
总结:
如果脚本中有自定义函数用到了脚本绑定的资源或者变量,初始化的工作应该放到Awake()函数中。虽然说物体创建以后Start()函数就开始执行,可是Start()函数可能执行得并没有我们想象的那么早。

你可能感兴趣的:(Start()函数与Awake()函数 一个容易被忽略的差别)