生命周期方法
概述
在 Unity 中,每个继承自 MonoBehaviour
的脚本都有其特定的生命周期,包含一系列按特定顺序调用的方法。这些方法在不同的时间点被触发,用于执行不同类型的操作,如初始化、更新、清理等。
生命周期方法及调用顺序
1. Awake()
- 调用时机:最早被调用,且每个脚本实例仅调用一次。
- 用途:常用于单例模式的初始化,或进行一些无论组件是否激活都需要执行的基础设置。
- 示例代码:
private void Awake()
{Debug.Log("Awake");
}
2. OnEnable()
- 调用时机:在
Awake()
之后调用,当组件被激活时触发,且每个激活周期仅调用一次。 - 用途:可用于在组件激活时执行一些初始化操作,如订阅事件等。
- 示例代码:
private void OnEnable()
{Debug.Log("OnEnable");
}
3. Start()
- 调用时机:在
OnEnable()
之后,Update()
之前调用,每个脚本实例仅调用一次。 - 用途:适合用于设置一些初始值,因为此时所有对象都已初始化完成。
- 示例代码:
void Start()
{Debug.Log("Start");
}
4. FixedUpdate()
- 调用时机:以固定频率调用,在
Update()
之前执行,默认每隔 0.02 秒调用一次。 - 用途:常用于处理物理相关的操作,因为物理模拟是以固定时间步长进行的。
- 示例代码:
private void FixedUpdate()
{Debug.Log("FixedUpdate");
}
5. Update()
- 调用时机:每帧调用一次,在
Start()
之后执行,每次调用与上次的时间间隔可能不同。 - 用途:用于处理游戏中的大多数逻辑更新,如玩家输入处理、物体移动等。
- 示例代码:
void Update()
{Debug.Log("Update");
}
6. LateUpdate()
- 调用时机:在每次
Update()
之后紧接着调用一次。 - 用途:常用于处理需要在所有
Update()
操作完成后执行的任务,如相机跟随等。 - 示例代码:
private void LateUpdate()
{Debug.Log("LateUpdate");
}
7. OnDisable()
- 调用时机:与
OnEnable()
相反,当组件失活时调用。 - 用途:可用于在组件停用前执行一些清理操作,如取消事件订阅等。
- 示例代码:
private void OnDisable()
{Debug.Log("OnDisable");
}
8. OnDestroy()
- 调用时机:当脚本所附着的对象被销毁后调用一次。
- 用途:用于进行最后的清理工作,如释放资源等。
- 示例代码:
private void OnDestroy()
{Debug.Log("OnDestroy");
}
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace TimeGhost
{public class test : MonoBehaviour{private void Awake() // 最早调用,只调用一次,单例模式{Debug.Log("Awake");}private void OnEnable() // 组件激活时调用,在awake之后调用,只调用一次{Debug.Log("OnEnable");}// Start is called before the first frame updatevoid Start() // 在update之前调用,只调用一次,在onenable之后调用,可以在此设置一些初始值{Debug.Log("Start");}// Update is called once per framevoid Update() // 每帧调用一次,在start之后调用,每次调用与上次时间间隔不相同{Debug.Log("Update");}private void LateUpdate() // 在每次update之后紧接着调用一次{Debug.Log("LateUpdate");}private void FixedUpdate() // 固定频率调用,在update之前调用,每隔固定时间调用一次默认0.02s{Debug.Log("FixedUpdate");}private void OnDisable() // 与onenable相反,组件失活时调用{Debug.Log("OnDisable");}private void OnDestroy() // 被销毁后调用一次{Debug.Log("OnDestroy");}}
}