Unity中Awake和Start的区别(小记)

之前对这两者之间的区别没有多大感受, 直到最近在生成敌人的GameObject时才留意到这区别. 在生成敌人的GameObject时, 由于敌人身上挂载了Animator和Enemy(自定义脚本) 两个组件, 因此需要为Animator组件的RuntimeAnimatorController赋值, 同时Enemy脚本的Awake方法也使用了Animator组件的RuntimeAnimatorController.

参考材料
1. Unity中Awake和Start的区别

这就导致一个问题出现了: 尽管在生成敌人的GameObject后已经立即为Animator组件的RuntimeAnimatorController赋值了, 但Enemy脚本的Awake方法先于赋值执行, 导致程序出错. 解决方法是将Awake方法里的代码放到Start方法即可.

最后总结一下Awake和Start的异同点:

相同点
1) 两者都是对象初始化时调用的, 都在Update之前, 场景中的对象都生成后才会调用Awake, Awake调用完才会调用Start, 所有Start调用完才会开始Update.
2)两者在对象生命周期内都只会被调用一次, 即初始化时被调用, 之后即使是在被重新激活之后也不会再次被调用.

不同点
1) Awake函数在对象初始化之后立刻就会调用, 换句话说, 对象初始化之后第一调用的函数就是Awake: 而Start是在对象初始化后, 第一次Update之前调用的, 在Start中进行初始化不是很安全, 因为它可能被其他自定义的函数抢先.
2) Awake不管脚本是否enabled都会被调用; 而Start如果对象被SetAcive(false) 或者enabled=false了是不会被调用的.
3) 如果对象(GameObject) 本身没激活, 那么Awake, Start都不会调用.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注