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 initializationvoid Start () {Debug.Log("游戏开始~~");}void Awake(){Debug.Log("唤醒~~");}void FixedUpdate(){Debug.Log("FixedUpdate");}// Update is called once per framevoid 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 initializationvoid Start () {Debug.Log("游戏开始~~");}void Awake(){Debug.Log("唤醒~~");}void FixedUpdate(){Debug.Log("FixedUpdate time is" + Time.deltaTime);}// Update is called once per framevoid Update () {Debug.Log("Update time is" + Time.deltaTime);}void LateUpdate(){Debug.Log("LateUpdate");}}
可以看到,每次调用FixedUpdate方法所耗去的时间是相同的;而每次调用Update方法所耗去的时间是不同的。

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

Unity3D实践系列04, 脚本的生命周期的更多相关文章
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- Unity3d脚本的生命周期
接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到On ...
- Unity3d学习 基础-关于MonoBehaviour的生命周期
其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解.而且在刚开始就接触Unity3D时,看到所有脚本中编 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- Unity脚本的生命周期中几个重要的方法
1.function Update () {} 正常更新,用于更新逻辑.此方法每帧都会由系统自动调用一次.2.function LateUpdate () {} 推迟更新,此方法在Update() 方 ...
- Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方
首先看看MonoBehaviour的生命周期 先上个图(来源 http://blog.csdn.net/qitian67/article/details/18516503): 1.Awake 和 St ...
- Unity3D脚本的生命周期(执行顺序)
Unity脚本中有许多固定的函数 例如Start();Update(); 而这些函数都有固定的执行顺序 搞清楚这些函数的执行顺序 对于我们理清代码的逻辑就显得尤为重要 举个简单的例子 //脚本A pu ...
- Unity3D脚本(MonoBehaviour)生命周期
场景中有2个物体:A,B 每一个物体上绑定2个脚本:A,B 初始化log: Object : A , Script : B , Message : Awake Object : A , Script ...
- Unity3D实践系列08, MonoBehaviour类的各种触发事件
在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...
随机推荐
- BGM时长
1.can u feel it 00:08-00:30 22s 2.纤夫的爱 00:43-00:54 11s 3.渡情 00:55-01:52 57s 4.nobody 01:56-02:25 29s ...
- linux网桥浅析
linux网桥浅析 原文链接:http://hi.baidu.com/_kouu/item/25787d38efec56637c034bd0 什么是桥接?简单来说,桥接就是把一台机器上的若干个网络接口 ...
- 001_软件waf
一.优秀的软件waf开源软件 <1>openwaf介绍 http://www.oschina.net/p/openwaf http://git.oschina.net/miracleqi ...
- 在阿里云申请Symantec免费SSL证书操作流程
2016年阿里云与国内证书颁发机构天威诚信推出了基于Symantec(赛门铁克)的免费SSL证书,有需要免费SSL证书产品的可以前往阿里云进行申请. 申请地址:阿里云云盾证书服务—Symantec免费 ...
- C++ code:低级编程
1 C编程 所谓低级编程,是相对于面向对象或基于对象的抽象层次更高的高级编程而言,就是: (1)不用C++STL的资源库,尽量减少内在的创建.调用.分配等的开销: (2)对程序管辖的内存进行直接操作访 ...
- Java编程的逻辑 (55) - 容器类总结
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Jenkins 发布.NetCore 项目
安装最新Jenkins及安装好相关git插件 启动jenkins服务,访问8080端口 这里就发布一个IdentityServer4程序 配置相关参数 设置Git源码管理配置 构建执行window 批 ...
- shiro中async-supported报错 cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'. One of '{"http://java.sun.com/xml/ns/ javaee":init-param}' is expected.
最近都在研究shiro这个框架,今天实施了一下,就报了如下错误: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...
- JS几种变量交换
JS几种变量交换方式以及性能分析对比 原文 原文是自己博客上发布的JS几种变量交换方式以及性能分析对比 前言 “两个变量之间的值得交换”,这是一个经典的话题,现在也有了很多的成熟解决方案,本文主要 ...
- 【LOJ】#2549. 「JSOI2018」战争
题解 仔细分析了一下,如果写个凸包+每次暴力半平面交可以得到70分,正解有点懵啊 然后用到了一个非常结论,但是大概出题人觉得江苏神仙一个个都可以手证的结论吧.. Minkowski sum 两个凸包分 ...