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

几乎都继承了MonoBehaviour这个父类,那么MonoBehaviour这个类是干什么的

  首先我们看一关于MonoBehavior这个类的继承关系:

  

  从上图可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的角色,当我们需要将一个自定义脚本已组件的形式添加到对应的GameObject时,该脚

是必须要继承MonoBehaviour。所以综上MonoBehaviour的作用就是开发者可以自定义自己的组件类。

  当我们拥有拥有自己的组件类时,我们会对类的生命周期,和一些重要的接口感兴趣,以便在使用过程中,不那么疑惑。

  我们可以先看一下 Unity3D官网上的一张图 可以先熟悉一下整体的流程(在网页的中间):

  首先我们可以将这张图分成两种状态:

  • 编辑器下的状态:可以点击设置,Reset函数,将脚本恢复默认状态
  • 运行状态(真正的生命周期):,除Reset函数外,其余函数都在运行状态执行(加特殊字段,该脚本也可已在编辑器运行)

  我们主要关心的是在运行状态,因为此时脚本的生命周期真正开始,先看如下图:

  

  当我们点击Unity3D的Play按钮时,脚本会从编辑器模式进入运行模式,会先走Initialization步骤,从名字可以看出,该步骤做的是初始化操作,且确定了三个函数的调用时序

  那三个函数有啥区别:

  • Awake:

    • 调用条件: gameObj is Active(场景开始时 当前obj的Active 是 true) 或者 在 Instantiate 一个 Prefab之后
    • 注意事项:
      • 总是在所有脚本调用Start之前调用如下图:

      • Awake函数只调用一次
  • OnEnable:
    • 调用条件: 当执行完Active时
    • 注意事项 : 将enable = false, 会在执行完OnEnable后,直接执行OnDisable,在OnDisable设置enable = true就会跳到OnEnable(切记不要出现死循环:)
  • Start:          
    • 调用条件 : OnEnable执行完
    • 注意事项:Start只会执行一次,无论下次第几次调用到OnEnable,均不会在执行(适合初始化)

  上述是生命周期的开始,我们先不讲生命周期运行,直接将生命周期的结束,如下图:

  • OnApplicationQuit:当你的应用程序退出时,会先调用OnApplicationQuit(你可以在此时来save你的数据)
  • OnDisable:除在OnApplicationQuit调用时会调用,还会再设置enable = false 或 active = false 调用
  • OnDestory:除在OnApplicationQuit调用时会调用,还有在手动的Destory gameObject时  

  讲完了生命周期的开始和结束,现在聊聊比较重要的部分:

  

  

  上述有很多Update 和 很多yield , 关于yield知识点可以看这里 , 我们可以从上述看到三个Update调用的顺序,FixedUpdate --> Update --> LateUpdate:

  

  我们可以看到,Unity是调用完所有脚本的FixedUpdate,在调用所有脚本的Update,在调用所有脚本的LateUpdate。

  关于协程中的yield其实很好理解 ,如下图:

  

  比如 yield null ,表示当函数运行到此处时,会挂起(中断),等下一帧,所有的脚本Update运行完后,会继续执行此函数。

  (上图的意思是回去检测所有因yield null 挂起的协程 并恢复)

  

Unity3d学习 基础-关于MonoBehaviour的生命周期的更多相关文章

  1. Unity3D MonoBehaviour的生命周期(lifecycle)

    官方的事件函数的执行顺序中有详解(Link:Execution Order of Event Functions) (图片来源:http://whatiseeinit.blogspot.com/201 ...

  2. 零基础Android学习笔记-02 安卓程序生命周期

    一个安卓程序生命周期会经历7中状态,并不一定是每次都全部经历.Create,Start,ReStart,Pause,Resume,Stop,Destory. 重载方法,用helloWorld程序去体验 ...

  3. MonoBehaviour Lifecycle(生命周期/脚本执行顺序)

    脚本执行顺序 前言 搭建一个示例来验证Unity脚本的执行顺序,大概测试以下部分: 物理方面(Physics) 渲染(Scene rendering) 输入事件(InputEvent) 流程图 Uni ...

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

    Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...

  5. 2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等>

    端午长假在家陪着女朋友, 幸福感满满,生活对于一只饱经忧患的程序猿来说也是非常重要的,也就暂时没有更新博客.休假结束,回归奋斗的日子了,开始继续更新WPF系列. 在正文开始之前需要介绍一个人:Sean ...

  6. Unity学习疑问记录之脚本生命周期

    总的来说unity的脚本生命周期分几个部分:编辑→初始化→游戏逻辑→渲染→GUI→Teardown首先是Reset,顾名思义:重置.在什么情况下调用呢?1.用户第一次添加组件时.2用户点击见组件面板上 ...

  7. android学习四(Activity的生命周期)

    要学好活动(Activity).就必需要了解android中Activity的声明周期.灵活的使用生命周期.能够开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的 ...

  8. servlet基础(组成与生命周期)

    servlet基础作用:servlet是运行在Web服务器或应用服务器上的程序:担当web浏览器或其他HTTP客户程序发出的请求与HTTP服务器上的数据库或应用程序之间的中间层.1.读取客户程序发送的 ...

  9. spring源码学习(四)-spring生命周期用到的后置处理器

    生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...

随机推荐

  1. 转: JMeter技巧集锦

    from:http://java.chinaitlab.com/tools/355421.html JMeter 是一个流行的用于负载测试的开源工具, 具有许多有用的功能元件,如线程组(thread ...

  2. magento模板中XML与phtml关系 [四]

    layout\catalogserch.xml 中声明的 as="topSearch" 被templ\page\html\header.phtml调用输出 echo $this-& ...

  3. listview设置条目点击的时候不变色(让状态选择器不起作用)

    未设置前的效果如下图: 很明显,“酷狗音乐”那个条目被点击的时候,条目背景变为蓝色,怎么去掉这个颜色呢? java代码可以这么写: listView.setSelector(new ColorDraw ...

  4. json中文乱码问题

    首先在 tomcat的 D:\apache-tomcat-7.0.57\conf\server.xml里添加中文编码 <Connector port="8080" proto ...

  5. .NET中公共变量与属性的区别

    在我们的程序中经常会出现以下的代码:  如:     成员变量     public   string   Name;     或者用属性     private   string   name    ...

  6. (转) 通过input分片的大小来设置map的个数

    摘要 通过input分片的大小来设置map的个数 map inputsplit hadoop 前言:在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数.除了设置固定的每个节点上可 ...

  7. hadoop Yarn运行机制

  8. hihoCoder 1252 Kejin Game

    2015 ACM / ICPC 北京站 D题 网络最大流 和同学讨论了一会儿,还是Xiang578机智... ... /* ************************************** ...

  9. 线段树扫描线 HDU 1542

    n个矩形 问他们覆盖的面积重复的就算一次 x数组存线段  然后根据横坐标排一下 z 线段树 l - r   就是1 ~ 2*n #include<stdio.h> #include< ...

  10. js中原生对象、内置对象和宿主对象(转)

    本帖最后由 无解. 于 2012-9-9 12:13 编辑 <ignore_js_op> 这个图来自于<JavaScript语言精髓与编程实践>第三章P184页.最近在改第二版 ...