生命周期中常用方法

生命周期中常用方法

特性

序列化字段:在编辑器中显示私有变量

1
2
[SerializeField]
private int a = 1;

在编译器中隐藏字段

1
2
[HideInInspector]
public int b = 2;

只能在范围内设置值

1
2
[Range(0,15)]
public int c = 3;

一、初始化相关的方法

Awake()

1
private  void  Awake()  {......} 
  • 脚本被加载到场景中时自动调用
  • 是整个生命周期中最先执行的方法
  • 当脚本实例被加载时会自动调用这个方法
  • 整个生命周期中只执行一次

该方法主要用于在游戏开始之前初始化对象或游戏状态,如:使用 GameObject.FindWithTag()查询游戏对象。

OnEnable()

1
private  void  OnEnable()  {......} 
  • 当对象变为可用或激活状态时调用,判断对象或脚本是否可用
  • 执行完Awake()方法后,如果当前脚本可用或可激活,按正常执行顺序则会执行OnEnable()方法。
  • 配合OnDisable()方法一起使用
  • 执行次数不确定

通常在这个地方将当前脚本禁用:this.enable=false,若执行此操作则会直接跳到OnDisable()方法执行一次,其它生命周期方法都不会再执行。

Start()

1
private  void  Start() {......} 
  • 第一次Update之前调用
  • 执行完OnEnable()方法之后,在第一次执行Update()方法之前,Start()会进行一次判断:若之前没有执行过该方法,则会执行;若之前已执行过,则不会再执行。
  • 整个生命周期中只执行一次,用于进行初始化

该方法主要用于对变量等进行初始化或赋值的相关操作。可将一些需要依赖Awake的变量放在Start()里面初始化

二、更新相关的方法

第二阶段:更新模块,与生命周期对应的三个方法:FixedUpdate()、Update()、LateUpdate()
这三个方法是何时被调用的呢?
游戏画面更新时,这三个方法会被调用,并且会被循环被调用。
需要特别强调的是:FixedUpdate()方法经常会比Update()方法更频繁的被调用。

FixedUpdate()

  • 固定更新
  • 以帧为单位进行场景的刷新,以固定的时间隔来进行刷新
  • 与物理相关的更新操作,放在FixedUpdate()完成

Update()

  • 更新
  • 每一帧与每一帧的执行时间可能是不一致的
  • Update()执行速率与硬件设备和被渲染物体有关系,有时快有时慢
  • 主要完成场景中数据的更新和数据的逻辑处理操作

LateUpdate()

  • 晚于更新
  • 当一帧执行结束,在准备下一帧执行之前,会调用该方法

OnGUI()

  • 渲染和处理GUI事件

三、销毁相关的方法

OnDisable()

1
private  void OnDisable() {......} 
  • 当对象或脚本处于不可用(或不可激活)时执行
  • 执行几次不确定
  • 一般会与OnEnable()配合使用

OnDestory()

1

  • 整个生命周期中只执行一次
  • 当对象(脚本文件)被销毁时只执行该方法
  • 一般会先执行OnDisable(),将对象变为不可用状态,然后再销毁

渲染用到的周期函数

OnPreCull

  • 在相机剔除场景之前调用此函数。
  • 相机可见的对象取决于剔除。
  • OnPreCull 函数调用发生在剔除之前。

OnBecameVisible / OnBecameInvisible

  • 在对象对于相机可见/不可见时调用此函数。

OnWillRenderObject

  • 如果对象可见,则为每个相机调用一次此函数。

OnPreRender

  • 在相机开始渲染场景之前调用此函数。

OnRenderObject

  • 在完成所有常规场景渲染后调用此函数。
  • 可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。

OnPostRender

  • 在相机完成场景渲染后调用此函数。

OnRenderImage

  • 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理(仅限专业版)。

OnDrawGizmos

  • 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。

OnGUI

  • 在每帧上多次调用此函数,以响应 GUI 事件。
  • 程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard 鼠标事件。

脚本生命周期(完整)

Unity 脚本有一套完整的生命周期,脚本需要挂在任意游戏对象上,并且同一个游戏对象可以挂不同的脚本,各个脚本执行自己的生命周期,它们可以相互组合并且互不干扰。完整的脚本生命周期(官方文档)

完整的脚本生命周期