U3D遊戲開發框架(二)——單例模版

一:目的

當設計一個Manager時候,咱們但願整個程序只有一個該Manager的對象實例,最早想到的實現方法是這樣的設計

public class XXXManager
{
    private static XXXManager _instance = null;
    public static XXXManager Ins
    {
        get
        {
            if (_instance == null)
            {
                _instance = new XXXManager();
            }
            return _instance;
        }
    }
}

若是每個管理器類都實現一遍以上的單例代碼會形成代碼的重複,因此咱們要想辦法把重複的代碼抽離出來 code

二:解決的問題及優勢對象

——解決了實現單例代碼的重複問題
——動態建立空物體並掛載腳本,不須要手動建立物體和掛載腳本繼承

三:使用方法圖片

須要實現單例的類直接繼承單例模版便可,有繼承MonoBehaviour和不繼承MonoBehaviour兩種get

public class GameMgr : MonoSingleton<GameMgr>
{
 
}
 
public class UIMgr : Singleton<UIMgr>
{
 
}

四:代碼實現it

/// <summary>
/// 不繼承Mono的單例模版
/// </summary>
public abstract class Singleton<T>
    where T : new()
{
    private static T _instance;
    public static T Ins
    {
        get
        {
            if (_instance == null)
            {
                _instance = new T();
                (_instance as Singleton<T>).Init();
            }
            return _instance;
        }
    }
 
    /// <summary>
    /// 子類初始化的一些操做
    /// </summary>
    protected virtual void Init()
    {
 
    }
}
using UnityEngine;
 
/// <summary>
/// 繼承Mono的單例模版
/// </summary>
public abstract class MonoSingleton<T> : MonoBehaviour
    where T : MonoSingleton<T>
{
    private static T _instance;
    public static T Ins
    {
        get
        {
            if (_instance == null)
            {
                GameObject go = null;
                T t = FindObjectOfType<T>();
                if (t == null)
                {
                    go = new GameObject(typeof(T).Name);
                    _instance = go.AddComponent<T>();
                }
                else
                {
                    go = t.gameObject;
                    go.name = typeof(T).Name;
                    _instance = go.GetComponent<T>();
                }
 
                DontDestroyOnLoad(go);
            }
            return _instance;
        }
    }
}

圖片來源:手遊io

相關文章
相關標籤/搜索