Unity指令碼生命週期

yuny0u1o24發表於2024-08-11

生命週期函式的概念

所有繼承MonoBehavior的指令碼,最終都會掛在到GameObject遊戲物件上

生命週期函式,就是該指令碼物件依附的GameObject物件從出生到消亡整個生命週期中

會透過反射自動呼叫一些特殊函式

Unity幫助我們記錄了一個GameObject物件依附了哪些指令碼

會自動的得到這些物件,透過反射去執行一些固定名字的函式

生命週期函式

生命週期函式的訪問修飾符一般為private和protected,因為不需要外部再呼叫生命週期的函式 都是Unity自己幫助我們呼叫的

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson01 : MonoBehaviour
{
    // 當物件(自己這個類的物件)被建立時才會呼叫該生命週期函式
    private void Awake()
    {
        // 在Unity中列印資訊的兩種方式
        // 1.沒有繼承MonoBehavior類的時候 (假設沒有繼承的話,為了掛載這裡只能繼承)
        Debug.Log("123");
        //Debug.LogError("出錯了");
        //Debug.LogWarning("警告!!");

        // 2.繼承了MonoBehavior的時候 有一個現成的方法可以使用
        print("1234567");
    }

    // 對於我們來說 想要當一個物件被啟用時 進行一些邏輯處理,就可以使用這個函式
    private void OnEnable()
    {
        print("已啟用!");
    }

    private void Start()
    {
        print("start");
    }

    // 該函式主要是用於 進行物理更新
    // 它是每一幀 執行的 但是這裡的幀 和遊戲幀有些不同
    // 它的時間間隔 是可以在project setting中的Time中設定的
    private void FixedUpdate()
    {
        print("FixedUpdate");
    }

    // 主要用於處理遊戲核心邏輯更新的一個函式
    private void Update()
    {
        print("Update");
    }

    // 一般這個函式適用於處理攝像機更新相關內容的
    // Update和LateUpdate之間 Unity進了一些處理 處理我們動畫相關的更新
    private void LateUpdate()
    {
        print("LateUpdate");
    }

    // 如果我們希望在一個物件被禁用時做一些處理,就可以在該函式中寫邏輯
    private void OnDisable()
    {
        print("OnDisable"); 
    }

    private void OnDestroy()
    {
        print("OnDestroy");
    }
}

生命週期函式支援繼承多型

下面程式碼雖然沒有繼承MonoBehaviour,依然能夠掛載到物體上面,因為他的父類是MonoBehaviour的子類,這也體現了多型。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson01Son : Lesson01
{
    protected override void Awake()
    {
        base.Awake();
        print("子類的Awake");
    }
}

注:@唐老獅

相關文章