Unity3D实践系列04, 脚本的生命周期

Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程。生命周期的各个方法被封装到了MonoBehaviour类中。具体来说如下:

1、In Editor Mode 编辑模式

当在编辑器中把脚本绑定到某个GameObject的时候,调用了MonoBehaviour类的Reset方法。

2、Startup 开始运行阶段

如果脚本所绑定的GameObject是存在的,MonoBehaviour类的的Awake方法首先被调用。

随之执行MonoBehaviour类的OnEnable方法。

如果GameObject还未被运行,就调用MonoBehaviour类的Start方法。

3、Updates 经历每个帧阶段

即经过每个帧时的阶段。这里依次执行MonoBehaviour类的FixedUpdate方法、Update方法、LateUpdate方法,Update方法和LateUpdate方法在经历每帧的时候都会被执行,只不过LateUpdate方法的调用是在调用Update方法之后。FixedUpdate方法是每隔一段时间调用的方法,比如一个帧是60ms,如果FixedUpdate方法的fixed time step被设置成20ms,那么FixedUpdate方法会在这一帧被执行3次。

4、Rendering 渲染阶段

如果Scene中的GameObject被渲染了,且渲染对Camera是可见的,会调用MonoBehaviour类的OnWillRenderObject方法。

5、GUI 界面元素阶段

形成GUI元素时调用,执行MonoBehaviour类的OnGUI方法。通常至少被调用两次,一次有关layout的事件,一次有关repaint的事件。

6、Teardown 销毁阶段

在这个阶段,依次执行MonoBehaviour类的OnDisable方法和OnDestroy方法。OnDisable方法对GameObject禁用,OnDestroy方法用来真正销毁Scene中的GameObject。

在以上生命周期的6个阶段,通常会用到如上的6个方法:Awake, Start, FixedUpdate, Update, LateUpdate。

接着上一篇"Unity3D实践系列03,使用Visual Studio编写脚本与调试"的Unity项目。

点击"Hierarchy"窗口中的Camera。

在Camera的"Insepctor"窗口,鼠标移动至"Hello World(Script)"之上,右键,点击"Remove Component"。

在"Project"窗口下的"Assert"中的"_MyScripts"文件夹中,创建一个名称为"MyLifetime"的脚本。

双击"MyLifetime"在Visual Studio中打开,编辑如下:

using UnityEngine;
using System.Collections;

public class MyLifetime : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Debug.Log("游戏开始~~");
    }

    void Awake()
    {
        Debug.Log("唤醒~~");
    }

    void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
    }

    // Update is called once per frame
    void Update () {
        Debug.Log("Update");
    }

    void LateUpdate()
    {
        Debug.Log("LateUpdate");
    }
}


保存,把脚本绑定到"Hierarchy"窗口的Camera上,通过把"MyLifetime"脚本拖动到"Hierarchy"窗口的Camera上或Camera相关的"Inspector"窗口上。

运行,看到如下效果:

Awake方法和Start方法

可以看到,Awake方法总是在游戏开始之前被调用,无论脚本组件是否被激活都会被调用,一般用Awake方法来创建变量。而Start方法在所有Awake方法被执行之后、Update方法被调用之前被调用,而且只有脚本组件激活时才能被调用,一般用来给变量赋值。

也就是说,

如果Scene中的GameObject被禁用,Awake方法和Update方法都不会被调用。

如果脚本组件被禁用,AWake方法会被调用,Start方法不会被调用。

FixedUpdate方法和Update方法

Update方法在每一帧被调用一次,一般用于非物理运动;FixedUpdate方法每隔固定时间被调用一次,一般用于物理运动。一旦涉及到物理运算,比如Collide等,一般把方法写到FixedUpdate中。

修改如下MyLifetime类:

using UnityEngine;
using System.Collections;

public class MyLifetime : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Debug.Log("游戏开始~~");
    }

    void Awake()
    {
        Debug.Log("唤醒~~");
    }

    void FixedUpdate()
    {
        Debug.Log("FixedUpdate time is" + Time.deltaTime);
    }

    // Update is called once per frame
    void Update () {
        Debug.Log("Update time is" + Time.deltaTime);
    }

    void LateUpdate()
    {
        Debug.Log("LateUpdate");
    }
}


可以看到,每次调用FixedUpdate方法所耗去的时间是相同的;而每次调用Update方法所耗去的时间是不同的。

另外,可以在"Edit"菜单,"Project Settings"下的"Time"中,修改"Fixed Timestep"项。

时间: 2024-08-01 09:21:05

Unity3D实践系列04, 脚本的生命周期的相关文章

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

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

【微信小程序开发?系列文章六】生命周期和路由

这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程序开发•系列文章四]模块化 [微信小程序开发•系列文章五]主界面 [微信小程序开发•系列文章六]生命周期和路由 整个微信小程序从打开到关闭,整个过程可以分为很多阶段或者说状态,这一整段的过程,我们称之为小程序的生命周期.而周期中的每种不同的状态,到另一个状态的过度和转化,是需要一个触发机制的,这种机

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

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

把脚本的生命周期用虚拟方法可以重写调用

/* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ########## #### #### ########### #### #### ########### ##### ##### ### ######## ##### ##### ### ######## ###### ###### ### ########### ###### ###### #### ###

[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:固定更新函数,以默

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

Unity3D脚本(MonoBehaviour)生命周期

场景中有2个物体:A,B 每一个物体上绑定2个脚本:A,B 初始化log: Object : A , Script : B , Message : Awake Object : A , Script : B , Message : OnEnable Object : A , Script : A , Message : Awake Object : A , Script : A , Message : OnEnable Object : B , Script : B , Message : Aw

Unity3D实践系列08, MonoBehaviour类的各种触发事件

在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehaviour类的事件响应方法的一个子集. 在MonoBehaviour类中,也可以分为"启动与刷新函数"和"交互函数". 我们可以把Reset,Awake, Start这3个启动方法,以及FixedUpdate, Update, LateUpdate这3个刷新方法划分到&quo