unity生命周期
1、静态构造函数
当程序集被加载的时候就被调用了,如果你的unity处于编辑状态时,此时你保存一个脚本(从而迫使重新编译),静态构造函数会立即被调用,因为unity加载了DLL。并且它将不会再次运行,永远只会执行一次,unity运行时,是不会再次执行了!在一个已部署的游戏上,这个构造器将会在unity加载过程的早期被调用!
静态构造函数文章:http://www.cnblogs.com/MrZivChu/p/BaseKnowledge_staticConstructor.html
2、非静态构造器
Unity将会在一个貌似随机的时间调用一个对象的默认构造器。当你编辑一个游戏时,在你保存一个脚本(从而迫使重新编译)后,这构造器将会被立马调用!
程序运行时被随机调用多次,程序结束时也被调用了(自己测试发现)
所以不要使用构造器去初始化字段的值,unity的Awake就是专门为这个目的设计的。
3、Awake
只会被调用一次,在Start方法之前被调用! 主要用于字段值的初始化工作,禁用脚本,创建游戏对象,或者Resources.Load(Prefab) 对象
4、Start
只执行一次,在Awake方法执行结束后执行,但在Update方法执行前执行, 主要用于程序UI的初始化操作,比如获取游戏对象或者组件
5、Update
每一帧执行的,监听用户输入,播放动画,当机器忙或者性能差的时候,他会停止执行,会产生停顿的感觉,例如一个人本来在1米的位置,突然到了5米的位置上,产生了跳帧,而下面的FixedUpdate方法则相反!会一米一米的去执行!(自己调试发现,Update是先于OnGUI执行的,且执行一次Update之后,会执行两次OnGUI)
6、FixedUpdate
不管当前机器忙不忙,都会保证每一帧执行一次!避免跳帧!固定更新。固定更新常用于移动模型等操作。
7、LateUpdate
先执行Update,然后才去执行lateUpdate(Update方法执行完,必定接着执行LateUpdate,而Update和FixedUpdate方法的执行顺序不确定,而且有时候FIxedUpdate执行了多帧,而Update却只执行了一帧,这就是因为跳帧的缘故造成的(取决于你的机器性能)!),如果现在有100个脚本,分别有100个 Update()函数,其中只有一个LateUpdate,那么在同一帧中,等待100个Update()执行完后,才执行这一个LateUpdate()。
8、OnGUI
在这里面进行GUI的绘制,且GUI是每帧擦除重绘的!仅仅只是绘制!没有生命周期的概念!所有关于绘制GUI的代码,都要直接或者间接地写到OnGUI方法中!
9、OnDestroy
当前脚本销毁时调用
10、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
如果在脚本s2的Start方法中设置脚本s3不可用(s3.enabled=false),那么脚本的执行结果为:
awake1,OnEnable1,awake2,OnEnable2,awake3,OnEnable3,Start1,OnDisable3,Start2,Update1,Update2
总结:关键是看设置脚本不可用的位置:
A(1)如果在父级的Awake方法里面设置子级的脚本不可用
那么仅仅只会执行子级里面的Awake方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行
(2)如果在父级的Start方法里面设置子级的脚本不可用
那么会执行子集里面的Awake,OnEnable和OnDisable方法,当子级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法也都会开始执行
B(1)如果在子级的Awake方法里面设置父级的脚本不可用
那么会执行父级里面的Awake,OnEnable和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,然后执行Start方法,Update等帧序列方法都会开始执行
(2)如果在子级的Start方法里面设置父级的脚本不可用
那么会执行父集里面的Awake,OnEnable,Start和OnDisable方法,当父级被激活后(enabled=true),会先执行OnEnable,Update等帧序列方法也都会开始执行
如果被激活的脚本之前没有调用Start方法,那么当此脚本被激活后,会调用一次Start方法!具体,看生命周期第一幅图,在文章后面!
11、OnDisable
如果脚本被设置为不可用将会被执行,程序结束时也会执行一次!
OnEnable 和 OnDisable 只受脚本的可用状态的影响(enabled)
而OnBecameVisible 和 OnBecameInvisible 是受对象是否可见的影响(如下)!即使脚本设置为不可用,OnBecameVisible和OnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!
OnBecameVisible 和 OnBecameInvisible :
(1)当一开始加载一个对象时:
Game 显示 Scene 显示 OnBecameInvisible 不执行 OnBecameVisible 执行
Game 不显示 Scene 不显示 OnBecameInvisible 不执行 OnBecameVisible 不执行
Game 不显示 Scene 显示 OnBecameInvisible 不执行 OnBecameVisible 执行
Game 显示 Scene 不显示 OnBecameInvisible 不执行 OnBecameVisible 执行
小结:只要Game和Scene中有一个显示了,OnBecameVisible 就会执行!而OnBecameInvisible 一直都不会执行
(2)当移动对象时:
game 和 scene 对象必须在两个场景中同时消失 OnBecameInVisible 才执行
scene 和 game 只要有一方进入了场景 OnBecameVisible 就执行了
脚本执行顺序总结:
假如现在有三个GameObject对象:a1 > a2 > a3 (a1为a2的父节点,a2为a1的父节点,unity执行脚本的顺序是从上往下执行,也就是说先执行父节点上的脚本,再去执行子节点的脚本,子节点上如果有多个脚本,那么也是自上而下的顺序执行),这三个对象对应各有一个脚本:s1,s2,s3,且这三个脚本代码都一样,都有Awake,Start,Update,LateUpdate,FixUpdate,那么当运行程序时,程序会进行分组,即把s1,s2,s3中的Awake方法组成一组,把Start方法组成一组,把Update方法组成一组,把LateUpdate方法组成一组,把FixUpdate方法组成一组,最后按照Awake,Start,FixUpdate,Update,LateUpdate(FixUpdate和Update顺序不确定)的顺序依次执行!即把Awake组里面的Awake方法全执行完,再去依次执行Start,FixUpdate,Update,LateUpdate组里面的代码:执行顺序如下:
Awak1 Awak2 Awak3 Start1 Start2 Start3 FixUpdate1 FixUpdate2 FixUpdate3 Update1 Update2 Update3 LateUpdate1 LateUpdate2 LateUpdate3
参考:http://wiki.unity3d.com/index.php?title=Life_cycle#0_:_Start
unity生命周期的更多相关文章
- Unity 生命周期
原文翻译: Execution Order of Event Functions 事件函数的执行顺序 Edit ...
- Unity3D笔记八 Unity生命周期及动画学习
Unity脚本从唤醒到销毁有着一套比较完善的生命周期,添加任何脚本都必须遵守自身生命周期法则.下面介绍一下生命周期中由系统自身调用的几个比较重要的方法. Update(){}.正常更新,用于更新逻 ...
- Unity学习疑问记录之脚本生命周期
总的来说unity的脚本生命周期分几个部分:编辑→初始化→游戏逻辑→渲染→GUI→Teardown首先是Reset,顾名思义:重置.在什么情况下调用呢?1.用户第一次添加组件时.2用户点击见组件面板上 ...
- Unity(二)生命周期LifetimeManager
描述:Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理. //创建一个Unit ...
- Unity脚本生命周期
前言 说到生命周期,影响最深刻的是,在接触Java的JSF组件时,JSF组件的五大生命周期,全要默写出来,嘿嘿…… 总结这两天在写小怪和掉落的糖葫芦时,老是遇到GameObject未销毁,一直存在场景 ...
- Unity 3D Framework Designing(3)——构建View和ViewModel的生命周期
> 对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者 ...
- [IoC容器Unity]第二回:Lifetime Managers生命周期
1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...
- Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题
主要用到协程(Coroutines)和游戏对象的生命周期(GameObject Lifecycle)基础知识,巧妙解决了游戏重启的问题. 关于协程,这里有篇文章我觉得写的非常好,理解起来也很容易.推荐 ...
- [转载][IoC容器Unity]第二回:Lifetime Managers生命周期
1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...
随机推荐
- vuejs生命周期函数
生命周期函数就是vue实例在某一个时间点会自动执行的函数 当我们创建一个实例的时候,也就是我们调用 new Vue() 这句话的时候,vue会帮助我们去创建一个实例,创建过程其实并不像我们想的那么简单 ...
- Network in Network 笔记
传统CNN里的卷积核是一个generalized linear model(GLM)之后经过一个sigmoid(现在通常是ReLu)的非线性激励函数,假设卷积有K个filter,那么这K个filter ...
- centos 6.5 配置nginx环境
1.卸载系统中默认的php和httpd [root@x ~]# yum remove httpd* php* Loaded plugins: fastestmirror Setting up Remo ...
- Ipad连接电脑超时问题
同时按 HOME+POWER 硬件重启 就会在ipad上弹出信任or不信任选项了 选择信任即可
- 一篇SSM框架整合友好的文章(三)
###一.SpringMVC理论 它始终是围绕 handler. 数据模型 model. 页面view进行开发的. 运行流程图: 通过mvc配置文件,配置"中央处理器"dispat ...
- GNU 汇编 协处理器指令
1. CP15 协处理器 16组寄存器 mcr 写 mrc (rgeister CP15) 读 CP15 到 Register mrc p15,0,c0,c0,0
- python学习之路1(基本语法元素)
1.变量与简单数据类型 1.1变量 变量就是给你所写代码的信息起一个名字,用来存储此信息,使信息变得更加的简洁易读, 例如:message = "Hello World!",其中m ...
- 小明的存钱计划 南阳acm54
小明的存钱计划 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 小明的零花钱一直都是自己管理.每个月的月初妈妈给小明300元钱,小明会预算这个月的花销,并且总能做到实际花 ...
- [Codeforces958E2]Guard Duty (medium)(区间DP)
Description 题目链接 Solution 可以把题目转化一下模型,将间隔取出来,转化为N-1个数,限制不能取相邻两个数,求取K个数的最小价值 设DP[i][j]表示前i个数取j个最大价值(第 ...
- tar命令,vi编辑器
一.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖): [root@localhost /]# cat /etc/passwd /etc/group > 1.txt ...