< 返回教程列表
3.1 Unity 脚本生命周期
知识介绍
C# 脚本在 Unity 中继承自 MonoBehaviour 才能挂到 GameObject 上。生命周期方法按固定顺序执行,常用的如下:
(初始阶段)
Awake → OnEnable → Start
↓
(物理阶段)
FixedUpdate(固定间隔,用于物理)
↓
(游戏逻辑)
Update(每帧)→ LateUpdate(Update 之后)
↓
(输入/碰撞/渲染等事件回调)
OnMouseDown / OnTriggerEnter / OnCollisionEnter ...
↓
(销毁/禁用)
OnDisable → OnDestroy
常用生命周期方法:
using UnityEngine;
public class LifecycleDemo : MonoBehaviour
{
// 1. Awake:最早,对象被创建时立即调用(就算脚本没启用也执行)
// 用途:获取自身组件、赋值
private void Awake()
{
Debug.Log("Awake 被调用");
}
// 2. OnEnable:脚本启用、对象激活时调用(可以被多次触发)
private void OnEnable()
{
Debug.Log("OnEnable 被调用");
}
// 3. Start:第一次 Update 前调用,只执行一次
// 用途:初始化,如获取其他 GameObject 的引用
private void Start()
{
Debug.Log("Start 被调用");
}
// 4. FixedUpdate:固定时间间隔(默认0.02秒,50次/秒)
// 用途:物理相关操作(Rigidbody 移动、加力等)
private void FixedUpdate()
{
// Debug.Log("FixedUpdate");
}
// 5. Update:每帧调用一次,间隔不固定
// 用途:绝大多数游戏逻辑(移动控制、计时等)
private void Update()
{
// Debug.Log($"Update - deltaTime={Time.deltaTime}");
}
// 6. LateUpdate:所有 Update 执行完后调用
// 用途:相机跟随(保证角色已经移动完)
private void LateUpdate()
{
}
// 7. OnDisable:脚本禁用或对象失活时调用
private void OnDisable()
{
Debug.Log("OnDisable 被调用");
}
// 8. OnDestroy:对象销毁时调用
private void OnDestroy()
{
Debug.Log("OnDestroy 被调用");
}
}
重要时间变量:
Time.deltaTime // 本帧与上一帧的时间差(用于平滑移动)
Time.fixedDeltaTime // FixedUpdate 的固定时间步
Time.time // 游戏已运行的总秒数
例题
例题: 一个计数器,游戏开始后每2秒输出一次"hello"。
using UnityEngine;
public class TimerDemo : MonoBehaviour
{
private float _timer;
public float interval = 2f; // 间隔
private void Update()
{
_timer += Time.deltaTime; // 累加时间
if (_timer >= interval)
{
_timer = 0; // 重置
Debug.Log("Hello(每2秒一次)");
}
}
}
练习题
写一个脚本:
Awake中输出 "我出生了",Start中输出 "我准备好啦",OnDestroy中输出 "我被销毁了",挂在 Cube 上测试 Play 模式。写一个脚本挂在 Cube 上:在
Update中让 Cube 每秒沿 Y 轴上升 2 个单位(必须用Time.deltaTime保证不同帧率速度一致)。写一个倒计时脚本:
public int totalSeconds = 60;,在Update中每秒减1,到 0 时输出 "时间到",并通过enabled = false停止。写一个脚本:对象创建后 5 秒自动调用
Destroy(gameObject)销毁自己。