程序设计基础
登录
< 返回教程列表

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秒一次)");
        }
    }
}

练习题

  1. 写一个脚本:Awake 中输出 "我出生了",Start 中输出 "我准备好啦",OnDestroy 中输出 "我被销毁了",挂在 Cube 上测试 Play 模式。

  2. 写一个脚本挂在 Cube 上:在 Update 中让 Cube 每秒沿 Y 轴上升 2 个单位(必须用 Time.deltaTime 保证不同帧率速度一致)。

  3. 写一个倒计时脚本:public int totalSeconds = 60;,在 Update 中每秒减1,到 0 时输出 "时间到",并通过 enabled = false 停止。

  4. 写一个脚本:对象创建后 5 秒自动调用 Destroy(gameObject) 销毁自己。