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


      其实在刚接触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 挂起的协程 并恢复)

      

  • 相关阅读:
    Spring 框架学习:BeanFactory 和 FactoryBean
    Spring框架学习二:通过简单的HelloWorld程序理解IoC
    Spring框架学习一:环境准备
    Java多线程:Condition条件
    Java多线程:公平锁和非公平锁
    Java多线程:AQS源码分析
    Java多线程:可重入锁RentrantLock
    Java多线程:Unsafe 类以及 CAS 函数
    Java多线程:AtomicIntegerFieldUpdater 原子更新字段类
    Java多线程:AtomicReference AtomicStampedReference AtomicMarkableReference 原子更新引用类型
  • 原文地址:https://www.cnblogs.com/yuyaonorthroad/p/6287825.html
Copyright © 2020-2023  润新知