Awake OnEnable Start Update LateUpdate FixedUpdate

先看图:

每个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。

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. GameObject obj = Instantiate(prefab) as GameObject;  
  2. obj.GetComponent<A>().function0();  

脚本A如下:

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public int a = 0;  
  2.   
  3. void Awake() {  
  4.     Debug.Log("Awake " + a);  
  5.     a = 1;  
  6. }  
  7.   
  8. void Start() {  
  9.     Debug.Log("Start " + a);  
  10.     a = 2;  
  11. }  
  12.   
  13. void Update() {  
  14.     Debug.Log("Update " + a);  
  15. }  
  16.   
  17. public void function0() {  
  18.     Debug.Log("function0 " + a);  
  19.     a = 3;  
  20. }  

结果如下:



从上图可以看出,我们自定义的函数是先于Start和Update函数的。这有什么影响呢?如果你在function0中修改了某些变量,在Start函数里对它们进行了赋值,那么function0所做的更改就会消失;又或者某些变量在Start函数里初始化,那么调用funciton0的时候就会错空指针错误!因此,由于Unity的脚本仅自动生成了Start函数,而没有Awake函数,有些人就喜欢在Start函数里对GameObject等类型的对象初始化,这往往会造成错误。因此,建议就是,请尽量在Awake函数里进行对象初始化!当然,也建议Unity可以自动生成Awake函数,这样也许偷懒的人就会更少啦~


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值