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

时间: 2024-09-29 23:05:23

unity生命周期的相关文章

Unity脚本中各函数成员的生命周期

在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能.但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解. 我们知道Unity中的脚本大多派生于MonoBehaviour类,所以可以重写MonoBehaviour类里面的方法来实现我们想要的功能.那么自定义脚本中的各函数执行顺序和MonoBehaviour里面的函数执行顺序大致是一样的. 首先介绍一下MonoBehaviour类里面的成员变量和成员函数. 1 public

小抄:选择 Unity 的对象生命周期管理员

Unity 框架提供了数种生命周期管理员,各有相同和相异之处.刚开始接触时,难免头昏. 制作这张小抄,只是为了要帮助自己理解和记忆.如果你也用 Untiy,或可参考看看. 文字說明: TransientLifetimeManager:每次解析时一律建立新的对象,且 Unity 容器不会保存该对象的参考(即容器不负责释放该对象).此控制模式一般称为 Transient. ContainerControlledLifetimeManager:每次解析时都固定返回同一个既有对象,并且在容器本身摧毁时一

[Unity-10] Unity脚本的生命周期

做过Android开发的朋友应该都知道,Android每一个Activity都有一套完整的生命周期,Unity的脚本也有着类似的生命周期,下面就一起来看一下. 1.Awake():脚本唤醒.这个方法是脚本生成时执行的第一个方法,用来初始化脚本.脚本的整个生命周期中只执行一次. 2.Start():脚本开始.这个方法是在Awake()之后执行,也只执行一次. 3.Update():脚本更新.这个方法在Start()之后执行,每一帧都会执行一次,帧率越高执行的越频繁. 4.LateUpdate():

Unity脚本的生命周期

Unity脚本的生命周期 前言:Unity中定义了10个重要的事件函数,按照执行的先后顺序依次为以下的内容: (1):Reset:重置函数,编辑期当脚本赋值给游戏对象时触发,仅执行一次. (2):Awake:唤醒函数,最先执行的事件函数,用于优先级最高的事件处理,仅执行一次. (3):OnEnable:启用函数,当脚本启动的时候触发,随着脚本的不断启用与禁用可以执行多次. (4):Start:开始函数,一般用于给脚本字段赋初值使用,仅执行一次. (5):FixedUpdate:固定更新函数,以默

Unity脚本生命周期与执行顺序

文章目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象上才能开始它的生命周期.游戏对象可以理解为能容纳各种组件的容器,游戏对象的所有组件一起决定了这个对象的行为和游戏中的表现. 脚本生命周期 Unity脚本中的常见必然事件如下表所示 名称 触发时机 用途 Awake 脚本实例被创建时调用 用于游戏对象的初始化,注意Awake的执行早于所有脚本的Start函数 On

Unity StateMachineBehaviour 生命周期

今天研究了下动画状态机遇到一个问题. 有一个动画我只想然跟他播放一次,但是在某一些环境下我需要让他重复播放. 大概有两种方法 : 1. 使用Animatior Parameters 通常情况都是这样 2. 为动画节点创建一个StateMachineBehaviour, 它具有一个当动画播放完毕的生命周期,在这个动画可以判断是否跳转 或者继续重复播放 我们来看看StateMachineBehaviour的生命周期: using UnityEngine; using System.Collectio

Unity学习笔记(2) --- Unity脚本的生命周期

相关文档:Execution Order of Event Functions 1.function Update () {} 正常更新,用于更新逻辑.此方法每帧都会由系统自动调用一次. 2.function LateUpdate () {} 推迟更新,此方法在Update() 方法执行完后调用,同样每一帧都调用. 3.function Awake () {} 脚本唤醒,此方法为系统执行的第一个方法,用于脚本的初始化,在脚本的生命周期中只执行一次. 4.function FixedUpdate

Unity3d学习 基础-关于MonoBehaviour的生命周期

其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解.而且在刚开始就接触Unity3D时,看到所有脚本中编写的类 几乎都继承了MonoBehaviour这个父类,那么MonoBehaviour这个类是干什么的? 首先我们看一关于MonoBehavior这个类的继承关系: 从上图可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的

Unity3D脚本(MonoBehaviour)生命周期分析

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 场景中有2个物体:A,B 每个物体上绑定2个脚本:A,B 初始化log: Object : A , Script : B , Message : Awake Object : A , Script : B , Message : OnEnable Object : A , Script : A