生命周期中常用方法
特性
序列化字段:在编辑器中显示私有变量
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()
三、销毁相关的方法
OnDisable()
1
| private void OnDisable() {......}
|
- 当对象或脚本处于不可用(或不可激活)时执行
- 执行几次不确定
- 一般会与OnEnable()配合使用
OnDestory()
- 整个生命周期中只执行一次
- 当对象(脚本文件)被销毁时只执行该方法
- 一般会先执行OnDisable(),将对象变为不可用状态,然后再销毁
渲染用到的周期函数
OnPreCull
- 在相机剔除场景之前调用此函数。
- 相机可见的对象取决于剔除。
- OnPreCull 函数调用发生在剔除之前。
OnBecameVisible / OnBecameInvisible
OnWillRenderObject
OnPreRender
OnRenderObject
- 在完成所有常规场景渲染后调用此函数。
- 可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
OnPostRender
OnRenderImage
- 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理(仅限专业版)。
OnDrawGizmos
- 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。
OnGUI
- 在每帧上多次调用此函数,以响应 GUI 事件。
- 程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard 鼠标事件。
脚本生命周期(完整)
Unity 脚本有一套完整的生命周期,脚本需要挂在任意游戏对象上,并且同一个游戏对象可以挂不同的脚本,各个脚本执行自己的生命周期,它们可以相互组合并且互不干扰。完整的脚本生命周期(官方文档)