Unity基础 之 生命周期函数(一)

561 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

一,初始化

1.1 函数描述

运行状态初始化:(也是执行顺序)

  1. Awake:初始化时调用,在Start函数之前调用
  2. OnEnable:在对象启用时调用
  3. Start:仅当启用脚本实例时,才会在第一帧调用

编辑器状态初始化

  1. Reset:编辑器下调用,当脚本第一次附加到物体上或者点击Reset时执行,来初始化脚本属性。

实际应用

  1. Awake:通常使用为需要提前初始化的逻辑。比如单例赋值 private void Awake(){Instance = this;}
  2. OnEnable:处理每次显示时都需要进行初始化的逻辑,通常和OnDisable配合使用。 比如: 游戏逻辑使用并修改了变量Number,而下次显示时使用是又需要Number = 1,此时就可以写private void Awake(){Number = 1;}
  3. Start:通常使用为一些变量初始化逻辑。 比如:获取指定物体:private void Start(){child1 = transform.GetChild(0);}
  4. Reset:通常在游戏测试调试时,使用编辑器下的初始化。通过点击Reset执行一个逻辑。

1.2 示例解析

运行状态初始化示例:   搭建场景新建两个UI -> Image,一个作为背景,一个作为弹窗。新建脚本并挂载到弹窗Image上。

脚本内容如下:

using UnityEngine;

public class LifeCycleFunction : MonoBehaviour
{
    #region Initialization 初始化
    public int Number = 1;
     
    private void Awake()
    {
        Debug.Log("Awake 初始化时调用,在Start函数之前调用,...");
    }
    private void OnEnable()
    {
        Debug.Log("OnEnable 每次对象启用都会被调用...");
    }
    private void Reset()
    {
        Number = 0;
        Debug.Log("Reset 编辑器模式下才可被调用...Number: " + Number);
    }
    private void Start()
    {
        Debug.Log("Start 仅当启用脚本实例时,才会在第一帧调用...");
    }
    
    #endregion
}

此次运行结果展示了Awake,OnEnable,Start 的执行顺序,运行结果:

编辑器下的初始化: 1.脚本拖拽附加时自动执行

2.点击Reset调用: 可以看到我手动Number设置为2,Reset后被重置为代码中写的0;


二,更新

2.1 函数描述

三个函数

  1. FixedUpdate:固定时间调用,FixedUpdate通常比Update更频繁地调用
  2. Update:每帧调用一次
  3. LateUpdate:在Update完成后,每帧调用一次

实际应用

  1. FixedUpdate:所有物理计算和更新都在FixedUpdate中处理。它是固定时间调用,不会受到帧率影响。比如:一些物理属性的更新操作Force,Collider,Rigidbody等。
  2. Update:每帧调用一次,根据帧率的快慢影响执行速度。通常的游戏逻辑都写在这里,比如:和玩家交换,当用户按下空格时进行执行什么操作。
  3. LateUpdate:每次Update完成后调用移除。常见用处是相机跟随主角,比如:主角在Update中移动,则可以在LateUpdate执行相机的移动,这将可以保证摄像机跟着的时候之前的逻辑一起完全执行完成。

2.2 示例解析

将如下脚本添加到上面新建的脚本中:(为了方便查看,将上面初始化的函数先注释掉)

#region 更新

// 固定时间调用,FixedUpdate通常比Update更频繁地调用
private void FixedUpdate()
{
    Debug.Log("FixedUpdate 固定时间调用...");
}
// 每帧调用一次
private void Update()
{
    Debug.Log("Update 每帧调用一次...");
}
// 在Update后,每帧调用一次 
private void LateUpdate()
{
    Debug.Log("LateUpdate 在Update后,每帧调用一次...");
}
#endregion

运行后,可以看到结果如下:


三,禁用销毁

3.1 函数描述

三个函数

  1. OnDisable: 当对象被禁用时调用此函数(其父物体被禁用也会触发)。
  2. OnDestroy: 在对象存在的最后一帧的所有帧更新之后调用此函数。

实际应用

  1. OnDisable: 通常和OnEnable配合使用。比如:在OnEnable添加监听,在OnDisable移除监听
  2. OnDestroy: 当物体销毁或者场景关闭时触发。比如:子弹打到墙壁时,需要销毁子弹并触发一个打击音效。

3.2 示例解析

1.游戏物体禁用触发OnDisable

2.游戏物体销毁时触发OnDisableOnDestroy


Unity 官方图解: 图解