先看图:
每个cube都吸附了一个一样的脚本。
Awake:
(1) 当我们一个Obj (obj已经enable)吸附了一个脚本,无论该脚本是否Enable,Awake在游戏运行开始都会调用.
(2) 如果脚本吸附的obj,没有enable,那么Awake是不会执行的。(与(1)对比)
(3) 优先于任何Start()之前执行。
(4) 只会执行一次
OnEnable:
(1)什么时候调用: 在脚本enable时(前提:吸附的obj已经enable) 或者 脚本已经enable (吸附的对象才enable)
Start:
(1)优先于任何Update之前执行
(2)只会执行一次
(3)当脚本没有enable或者吸附的obj没有enable时,是不会调用的。
update:
(1)每帧都会执行一次
(2)执行时间不固定
(3)优先于任何LateUpdate之前执行
(4)当脚本没有enable或者吸附的obj没有enable时,是不会调用的。
LateUpdate:
(1)每帧都会执行一次
(2)在所有Update调用完成之后才调用
(3)当脚本没有enable或者吸附的obj没有enable时,是不会调用的。
FixedUpdate:
(1)每隔固定的时间会执行一次(此时间可以设定,Project Setting/Time/Fixed Timestep)
(2)当脚本没有enable或者吸附的obj没有enable时,是不会调用的。
特殊例子(转:http://blog.csdn.net/candycat1992/article/details/22927713):
但是!!!在实际编程中,有一个特例。举一个例子,我们在脚本A里定义了自己的函数function0,脚本A被添加到一个prefab上。当我们在脚本B中使用Instantiate函数实例化了该prefab,并且立刻调用了function0,那么是Awake、Start、Update、function0调用顺序是什么?按我最初的想法,从先到后分别是Awake、Start、Update、function0。
脚本A如下:
结果如下:
从上图可以看出,我们自定义的函数是先于Start和Update函数的。这有什么影响呢?如果你在function0中修改了某些变量,在Start函数里对它们进行了赋值,那么function0所做的更改就会消失;又或者某些变量在Start函数里初始化,那么调用funciton0的时候就会错空指针错误!因此,由于Unity的脚本仅自动生成了Start函数,而没有Awake函数,有些人就喜欢在Start函数里对GameObject等类型的对象初始化,这往往会造成错误。因此,建议就是,请尽量在Awake函数里进行对象初始化!当然,也建议Unity可以自动生成Awake函数,这样也许偷懒的人就会更少啦~