UnityMono对象的生命周期

Unity生命周期

1,Awake

        只会被调用一次,在Start方法之前被调用! 主要用于字段值的初始化工作,禁用脚本,创建游戏对象,或者 Resources.Load(Prefab) 对象

2,Start

只执行一次,在Awake方法执行结束后执行,但在Update方法执行前执行, 主要用于程序UI的初始化操作,比如获取游戏对象或者组件

3,OnEnable

    脚本可用时被调用、如果脚本是不可用的,将不会被调用!

如果有三个对象,a1 > a2 > a3 (父子级的关系),挂有三个脚本s1,s2,s3,三个脚本都有这些方法

Awake,Start,OnEnable,OnDisable,Update

 那么Unity 执行顺序为

awake1
OnEnable1
awake2
OnEnable2
awake3
OnEnable3
Start1
Start2
Start3
Update1
Update2
Update3

 如果在脚本s2的Awake方法中设置脚本s1不可用(s1.enabled=false),那么脚本的执行结果为:

awake1
OnEnable1
OnDisable1
awake2
OnEnable2
awake3
OnEnable3
Start2
Start3
Update2
Update3

如果在脚本s2的Awake方法中设置脚本s3不可用(s3.enabled=false),那么脚本的执行结果为: 

awake1
OnEnable1
awake2
OnEnable2
awake3
Start1
Start2
Update1
Update2

 关键是看设置脚本不可用的位置:

父级操作子级

  1. 如果在父级的Awake方法里面设置子级的脚本不可用

    那么仅仅只会执行子级里面的Awake方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行

  2. 如果在父级的Start方法里面设置子级的脚本不可用
    那么会执行子集里面的Awake,OnEnable和OnDisable方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法也都会开始执行

子级操作父级

  1. 如果在子级的Awake方法里面设置父级的脚本不可用
    那么会执行父级里面的Awake,OnEnable和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行

  2. 如果在子级的Start方法里面设置父级的脚本不可用
    那么会执行父集里面的Awake,OnEnable,Start和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,Update等帧序列方法也都会开始执行

      如果被激活的脚本之前没有调用Start方法,那么当此脚本被激活后,会调用一次Start方法!

4,OnDisable

如果脚本被设置为不可用将会被执行,程序结束时也会执行一次!

OnEnableOnDisable 只受脚本的可用状态的影响(enabled),而 OnBecameVisibleOnBecameInvisible 是受对象是否可见的影响!即使脚本设置为不可用,OnBecameVisibleOnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!

5、Update

每一帧执行的,会受到机器性能的影响  每一帧的间隔时间并不相同(调试发现,Update是先于OnGUI执行的,且执行一次Update之后,会执行两次OnGUI)

6、FixedUpdate

  固定时间更新,每隔一定的时间固定刷新一次 ,不受机器性能影响 ,可以在snapsetting中设置工程的fixedupdate 间隔时间

7、LateUpdate

先执行Update,然后才去执行lateUpdate(Update方法执行完,必定接着执行LateUpdate,可以用来等待Update的绘制,如果现在有100个脚本,分别有100个 Update()函数,其中只有一个LateUpdate,那么在同一帧中,等待100个Update()执行完后,才执行这一个LateUpdate()。

8、OnGUI

在这里面进行GUI的绘制,且GUI是每帧擦除重绘的!仅仅只是绘制!没有生命周期的概念!所有关于绘制GUI的代码,都要直接或者间接地写到OnGUI方法中!

9、OnDestroy

当前脚本销毁时调用

10、OnDisable

如果脚本被设置为不可用将会被执行,程序结束时也会执行一次!

OnEnableOnDisable 只受脚本的可用状态的影响(enabled),而 OnBecameVisibleOnBecameInvisible 是受对象是否可见的影响!即使脚本设置为不可用,OnBecameVisibleOnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!

OnBecameVisible 和 OnBecameInvisible

  1. 当一开始加载一个对象时:

    GameSceneOnBecameInvisibleOnBecameInvisible
    Game 显示Scene 显示OnBecameInvisible 不执行OnBecameInvisible 执行
    Game 不显示Scene 不显示OnBecameInvisible 不执行OnBecameVisible 不执行
    Game 不显示Scene 显示OnBecameInvisible 不执行OnBecameVisible 执行
    Game 显示Scene 不显示OnBecameInvisible 不执行OnBecameVisible 执行

    小结:只要Game和Scene中有一个显示了,OnBecameVisible 就会执行!而OnBecameInvisible 一直都不会执行

  2. 当移动对象时:

    game 和 scene 对象必须在两个场景中同时消失 OnBecameInVisible 才执行, scene 和 game 只要有一方进入了场景 OnBecameVisible 就执行了.

Tip:

假如现在有三个父子对象:a1 > a2 > a3 ,unity执行脚本的顺序是从上往下执行,先执行父节点上的脚本,再去执行子节点的脚本,子节点上如果有多个脚本,那么也是自上而下的顺序执行,对应各有一个脚本:s1,s2,s3,且这三个脚本代码都一样,都有Awake 、Start、Update、LateUpdate、FixUpdate,运行程序时会把s1,s2,s3中的Awake方法组成一组,把Start方法组成一组,把Update方法组成一组,把LateUpdate方法组成一组,把FixUpdate方法组成一组,把Awake方法全执行完,再去执行Start,FixUpdate,Update,LateUpdate的代码:执行顺序如下:(OnEnable是个例外)

Awak1 Awak2 Awak3

Start1 Start2 Start3

FixUpdate1 FixUpdate2 FixUpdate3

Update1 Update2 Update3

LateUpdate1 LateUpdate2 LateUpdate3

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值