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
关键是看设置脚本不可用的位置:
父级操作子级
-
如果在父级的Awake方法里面设置子级的脚本不可用
那么仅仅只会执行子级里面的Awake方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行
-
如果在父级的Start方法里面设置子级的脚本不可用
那么会执行子集里面的Awake,OnEnable和OnDisable方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法也都会开始执行
子级操作父级
-
如果在子级的Awake方法里面设置父级的脚本不可用
那么会执行父级里面的Awake,OnEnable和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行 -
如果在子级的Start方法里面设置父级的脚本不可用
那么会执行父集里面的Awake,OnEnable,Start和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,Update等帧序列方法也都会开始执行
如果被激活的脚本之前没有调用Start方法,那么当此脚本被激活后,会调用一次Start方法!
4,OnDisable
如果脚本被设置为不可用将会被执行,程序结束时也会执行一次!
OnEnable 和 OnDisable 只受脚本的可用状态的影响(enabled),而 OnBecameVisible 和 OnBecameInvisible 是受对象是否可见的影响!即使脚本设置为不可用,OnBecameVisible 和 OnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!
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
如果脚本被设置为不可用将会被执行,程序结束时也会执行一次!
OnEnable 和 OnDisable 只受脚本的可用状态的影响(enabled),而 OnBecameVisible 和 OnBecameInvisible 是受对象是否可见的影响!即使脚本设置为不可用,OnBecameVisible 和 OnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!
OnBecameVisible 和 OnBecameInvisible
-
当一开始加载一个对象时:
Game Scene OnBecameInvisible OnBecameInvisible Game 显示 Scene 显示 OnBecameInvisible 不执行 OnBecameInvisible 执行 Game 不显示 Scene 不显示 OnBecameInvisible 不执行 OnBecameVisible 不执行 Game 不显示 Scene 显示 OnBecameInvisible 不执行 OnBecameVisible 执行 Game 显示 Scene 不显示 OnBecameInvisible 不执行 OnBecameVisible 执行 小结:只要Game和Scene中有一个显示了,OnBecameVisible 就会执行!而OnBecameInvisible 一直都不会执行
-
当移动对象时:
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