unity 浅谈MonoBehaviour

MonoBehaviour

学于事件函数的执行顺序-unity官方文档

概述

MonoBehaviour is the base class from which every Unity script derives.
When you use C#, you must explicitly derive from MonoBehaviour.

MonoBehaviour是所有脚本的基类,所有C#都需要显性的继承MonoBehaviour,这样才能被挂载到gameObject上。

一、MonoBehaviour的生命周期

运行 Unity 脚本会按预定顺序执行大量事件函数。

上述所讲即是一个脚本的生命周期,从初始化到运行再到销毁,unity的脚本会按照预定的顺序去执行事件函数。

生命周期图

下图概括了 Unity 如何在脚本的生命周期内对事件函数进行排序以及重复执行这些事件函数。
图片来着unity官方文档

Editor

  • Reset: 该事件函数会在被添加到gameObject中被调用一次,当你点击Inspector中的Component的reset也会被调用。

Runtime-对象初始化

游戏开始时,unity脚本会按照顺序依次去执行以下事件函数

OnLevelWasLoaded 已经被弃用,改用SceneManager.sceneLoaded委托

  • Awake: 类似于构造函数了,第一个被调用的。
  • OnEnable: 默认会被执行,但当你再Awake中禁用掉时,将不会调用,同样start也不会被调用。
  • SceneManager.sceneLoaded: 当在Awake中订阅时被调用,若不想刚刚载入地图时被调用,那么可以在start中订阅。
  • Start: 初始化过程中最后一个被调用的,它在第一次帧更新之前被调用。

以上是按照实际的执行顺序排版

Runtime-对象初始化的逻辑循环

  • fixedUpdate:

调用 FixedUpdate 的频度常常超过Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为FixedUpdate 的调用基于可靠的计时器(独立于帧率)。

这个官方已经说的很清楚了,所以就直接引用了。建议有些运动的逻辑放到这里去运算,因为FixedUpdate之后将立即进行所有物理计算和更新。例如角色的运动

  • Update:

每帧调用一次 Update。这是用于帧更新的主要函数。

  • lateUpdate:

每帧调用一次 LateUpdate__(在 Update__ 完成后)。LateUpdate 开始时,在 Update 中执行的所有计算便已完成。LateUpdate 的常见用途是跟随第三人称摄像机。如果在 Update 内让角色移动和转向,可以在 LateUpdate 中执行所有摄像机移动和旋转计算。这样可以确保角色在摄像机跟踪其位置之前已完全移动。

Runtime-对象销毁

  • OnApplicationQuit:

在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。

  • OnDisable: 对象在被销毁的时候会先调用OnDisable,在调用OnDestroy。
  • OnDestroy: 对象销毁最后一个调用的事件函数。

以上是按照实际的执行顺序排版

一个对象在编辑器模式下用户从开始播放到销毁的生命周期

在这里插入图片描述
这里有些奇怪的地方就是,update和LateUpdate的次数对应不上,少了一次,按照流程图不是应该一样的么?

一个对象在编辑器模式下用户从开始播放到停止播放的生命周期

在这里插入图片描述
其他事件函数就不说了,官方更有详细的介绍。

二、MonoBehaviour和GameObject

MonoBehaviour 是一个脚本的基类
GameObject 它的实例化对象是unity场景中对象的基本单位
脚本是要依附在对象中才可以被发挥作用的,所以他们两者是附属关系。脚本也被称之为组件(Component),在脚本中当然也可以获取该对象的其他组件。

猜你喜欢

转载自blog.csdn.net/qq448545478/article/details/106960307