Unity遊戲框架設計之單例Mono

珂霖發表於2024-04-29

Unity遊戲框架設計之單例Mono

簡單介紹

在編寫 Unity 指令碼的過程中,我們通常需要編寫一些依賴於 MonBehaviour 生命週期且全域性始終唯一的類,比如 EventManager、MessageManager、ResourceManager 和 UIManager 等等。

我們可以基於單例模式,設計出名為 SingletonMono 的單例類,然後讓擁有上述特性的類繼承於 SingletonMono 單例類,來保證這些類在遊戲執行過程中始終唯一。

一般的指令碼必須依賴於某個場景中的某個遊戲物件。而在遊戲執行的過程中,我們可能頻繁的切換 Scene,而這可能導致我們在切換場景的過程中,不小心將 SingletonMono 單例類銷燬,從而造成錯誤。因此我們需要將指令碼依賴的遊戲物件放到 DontDestroyOnLoad() 中,來保證場景切換不會導致 SingletonMono 單例類的銷燬。

程式碼設計

public abstract class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<T>();
                if (_instance == null)
                {
                    GameObject gameObject = new GameObject();
                    DontDestroyOnLoad(gameObject);
                    gameObject.name = typeof(T).Name;
                    _instance = gameObject.AddComponent<T>();
                }
            }
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        if (_instance == null)
        {
            DontDestroyOnLoad(gameObject);
            _instance = this as T;
            return;
        }
        Destroy(gameObject);
    }
}

程式碼說明

(一)保證所有繼承 SingletonMono 類的指令碼在遊戲中全域性唯一。

(二)保證所有繼承 SingletonMono 類的指令碼不會隨著場景的解除安裝而銷燬。

(三)遊戲中所有需要使用 Unity 生命週期的單例類必須繼承 SingletonMono,特別是 XXXMananger 類。

後記

由於個人能力有限,文中不免存在疏漏之處,懇求大家斧正,一起交流,共同進步。

相關文章