當設計一個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