Unity中的MonoBehaviour及生命周期

一:前言

从第一次在unity创建C#脚本开始就会发现每个脚本都继承了一个叫MonoBehviour的类,那么MonoBehaviour是做什么的呢?

一层层进入MonoBehaviour父类,可以看出MonoBehaviour间接继承了Component,所以继承自MonoBehaviour脚本的作用其中之一就是充当组件的角色,注意当我们需要将一个自定义脚本以组件的形式添加到对应的GameObject时(Unity中Inspector面板中的每一项都称为组件,包括创建的脚本),该脚本是必须要继承MonoBehaviour,否则无法添加为组件


二:生命周期函数

生命周期函数可以分为两种状态:
——编辑器下的状态:只有Reset函数一个
——运行状态(真正的生命周期):除Reset函数外,其余函数都在运行状态执行(加特殊字段,也可以在编辑器运行)

——Reset
Reset:只能在编辑器模式下运行,点击Reset按钮和第一次将脚本挂载到游戏物体上时执行


——Awake,OnEnable,Start

Awake:脚本第一次加载或所挂载的游戏物体第一次激活时(只依赖于所挂载的游戏物体是否激活),一个生命周期内只执行一次
OnEnable:在脚本组件或脚本组件所挂载的游戏物体每次被激活时都会被调用,一个生命周期内执行多次
Start:当游戏物体处于激活状态并且脚本也处于激活状态才可以执行,一个生命周期内只执行一次

在Inspector面板中的组件上有一个复选框,这是在脚本中有生命周期函数时才会显示的,但是测试后发现只有Awake和Reset并不会出现复选框,因为这两个函数与脚本是否激活无关

 ——FixedUpdate,Update,LateUpdate
FixedUpdate:每帧调用而且每帧的时间间隔是固定的,不受帧率影响。每一帧的时间是在Edit->Project Settings->Time面板中的Fixed Timestep设置,默认为0.02s,每秒执行50次,对于更新频率比较稳定的物理系统来说就合适放在FixedUpdate中处理
Update:每帧调用但是每帧的时间间隔不固定,受到帧率影响,与电脑性能有关。例如FPS是30,则每秒执行30帧,如果FPS是10,则每秒执行10帧。是不稳定的
LateUpdate:与Update一样每帧之间的时间是不固定的,受到帧率影响,它是三种Update中最后一个执行的。相机的跟随一般在LateUpdate中实现,这样可以确保在人物位置改变后再进行相机位置的改变


OnApplicationQuit,OnDisable,OnDestroy

OnApplicationQuit:当你的应用程序退出时,会先调用OnApplicationQuit
OnDisable:在脚本组件或脚本组件所挂载的游戏物体每次被禁用时都会被调用,一个生命周期内执行多次
OnDestory:销毁脚本组件或脚本所挂载的游戏物体时调用


三:普通类与继承MonoBehaviour类的区别

——继承MonoBehaviour的类不需要创建它的实例,类内部也不要有构造函数或析构函数,因为MonoBehaviour类中有自己的构造函数做一些引擎内的事情,所以不提倡使用new关键字调用其构造函数
如果用new构造会出现以下警告:

警告说的很明显,就是如果继承了MonoBehaviour就不允许你用new创建,你可以用添加组件的方式替代

——不继承MonoBehaviour不能使用Invoke,Coroutine,print以及生命周期函数等
——不继承MonoBehaviour不能挂在到Inspector上,也就是说不能当组件使用


四:一些成员方法

——GetComponentInChildren:只要脚本所挂载的游戏物体是激活的就可以查找到,无论脚本本身是否激活


五:生命周期函数总结

——Editor中:Reset
——初始化阶段:Awake—OnEnable—Start
——物理计算阶段:FixedUpdate—动画机更新—内部物理更新(刚体等)—OnTriggerXXX、OnColliisionXXX—yield WaitForFixedUpdate
——输入检测阶段:OnMouseXXX
——游戏逻辑阶段:Update—yield xxx—LateUpdate
——场景渲染阶段:OnWillRenderObject—OnPreCull—OnBecameVisible—OnBecameInvisible—OnPreRender—OnPostRender—OnRenderImage
——自创工具阶段:OnGrawGizmos
——GUI阶段:OnGUI
——帧结束:yield WaitForEndOfFrame
——结束阶段:OnDisable—OnDestroy


六:Unity中是如何调用MonoBehaviour生命周期方法的

打开MonoBehaviour类,你会发现并没有Awake、Start等方法,而继承MonoBehaviour的类也没有重写这些方法,就算是私有的也可以被调用
Unity内部运用了反射去调用这些生命周期函数,运行时通过反射将所有继承MonoBehaviour的类中的生命周期函数找出来,维护一套列表

  • 99
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值