Unity生命周期
基础概念
游戏的本质就是一个死循环,每一次循环都会处理游戏逻辑并更新一次游戏画面之所以能看到画面在动,是因为切换画面速度达到一定速度时人眼就会认为画面是动态且流畅的一帧就是执行了一次循环,Unity底层已经封装好了这个死循环我们只需要利用Unity的生命周期函数的规则来执行游戏逻辑即可。
- Awake 始终在任何 Start 函数之前并在实例化预制件之后调用此函数。因为比Start快所以一般用于初始化一些字段(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)
- OnEnable (仅在对象处于激活状态时调用)在启用对象后立即调用此函数。这个函数可以重复调用,意思就是激活后取消激活再激活还会调用
- Start 仅当启用脚本实例后,才会在第一次帧更新之前调用 Start,这个函数只会调用一次所以可以用来注册一些自己的事件。
- FixedUpdate 调用 FixedUpdate 的频度常常超过 Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate 之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)FixedUpdate的使用可以用在2d玩家移动时碰撞的逻辑,因为RigiBody2D的内部也是使用FixedUpdate 帧率相同时碰撞时不会发生颤动,如果使用Update控制移动碰撞会发生颤动,这是之前遇到的bug需要注意一下。
- Update 每帧调用一次 Update。这是用于帧更新的主要函数。
- LateUpdate 每帧都会调用一次但在Update执行完成后,也就是比Update慢半拍。
- OnDisable (仅在对象从激活状态到非激活状态时调用)可以说是OnEnable的反义函数。
- OnDestroy OnDestroy:对象存在的最后一帧完成所有帧更新之后,调用此函数(可能应 Object.Destroy 要求或在场景关闭时销毁该对象)
这里贴一张Unity官方提供的生命周期函数的执行图
代码示例
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class GameMono : MonoBehaviour
{
private void Awake()
{
Debug.Log("Awake执行了");
}
private void OnEnable()
{
Debug.Log("OnEnable执行了");
}
private void Start()
{
Debug.Log("Start执行了");
}
private void FixedUpdate()
{
Debug.Log("FixedUpdate正在执行");
}
private void Update()
{
Debug.Log("Update正在执行");
}
private void LateUpdate()
{
Debug.Log("LateUpdate正在执行");
}
private void OnDisable()
{
Debug.Log("OnDisable执行了");
}
private void OnDestroy()
{
Debug.Log("OnDestroy执行了");
}
}