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"项。

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

  1. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  2. Unity3d脚本的生命周期

    接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到On ...

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

    其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解.而且在刚开始就接触Unity3D时,看到所有脚本中编 ...

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

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  5. Unity脚本的生命周期中几个重要的方法

    1.function Update () {} 正常更新,用于更新逻辑.此方法每帧都会由系统自动调用一次.2.function LateUpdate () {} 推迟更新,此方法在Update() 方 ...

  6. Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方

    首先看看MonoBehaviour的生命周期 先上个图(来源 http://blog.csdn.net/qitian67/article/details/18516503): 1.Awake 和 St ...

  7. Unity3D脚本的生命周期(执行顺序)

    Unity脚本中有许多固定的函数 例如Start();Update(); 而这些函数都有固定的执行顺序 搞清楚这些函数的执行顺序 对于我们理清代码的逻辑就显得尤为重要 举个简单的例子 //脚本A pu ...

  8. Unity3D脚本(MonoBehaviour)生命周期

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

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

    在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...

随机推荐

  1. python3之SQLAlchemy

    1.SQLAlchemy介绍 SQLAlchemy是Python SQL工具包和对象关系映射器,为应用程序开发人员提供了SQL的全部功能和灵活性. 它提供了一整套众所周知的企业级持久性模式,专为高效和 ...

  2. Kth Smallest Number in Sorted Matrix

    Find the kth smallest number in at row and column sorted matrix. Example Given k = 4 and a matrix: [ ...

  3. Linux中断(interrupt)子系统之三:中断流控处理层【转】

    转自:http://blog.csdn.net/droidphone/article/details/7489756 1.  中断流控层简介 早期的内核版本中,几乎所有的中断都是由__do_IRQ函数 ...

  4. easyui表格,单元格合并

    easyui的合并单元格比较麻烦,官网提供一下方法 $('#tt').datagrid({ onLoadSuccess:function(){ var merges = [{ index:2, row ...

  5. Promise初探

    在JavaScript的世界中,所有代码都是单线程执行的. 由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以用回调函数实现: function ru ...

  6. day16作业

    一.填空题 1.Integer Character 2.String s = "123";Integer i = new Integer(s);System.out.println ...

  7. MySQL一问一答

    一.问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8,9,10的数据,再把mysql重启,之后再插入一条数据,那么这条数据的id值应该是多少,是8,还 ...

  8. vue-cli的工程模板与构建工具

    vue-cli的工程模板与构建工具 https://www.cnblogs.com/yinn/p/9712480.html 脚手架vue-cli系列二:vue-cli的工程模板与构建工具 上篇文章我们 ...

  9. AngularJS过滤器filter入门

    在开发中,经常会遇到这样的场景 如用户的性别分为“男”和“女”,在数据库中保存的值为1和0,用户在查看自己的性别时后端返回的值自然是1或0,前端要转换为“男”或“女”再显示出来: 如我要换个羽毛球拍, ...

  10. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...