C# 单例

2022-01-26  本文已影响0人  合肥黑

Unity 单例模式

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public int Value { get; set; } = 0;

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(this);
            GameData.Instance.Init();
        }
    }
}

...
    public class JsonData
    {
        public Player PlayerData = new Player();
        public SignData SignData = new SignData();
    }

    public class GameData
    {
        private JsonData jsonData = new JsonData();
        public JsonData JsonData { get => jsonData; set => jsonData = value; }

        #region config文件
        public Translations translation = ScriptableObject.CreateInstance<Translations>();
        public ExcelQuestionsManager excelQuestions = ScriptableObject.CreateInstance<ExcelQuestionsManager>();
        public ExcelDialoguesManager dialoguesManager = ScriptableObject.CreateInstance<ExcelDialoguesManager>();
        /// <summary>
        /// 加载数据表
        /// </summary>
        public void LoadCofig()
        {
            translation = Resources.Load<Translations>("Configs/Translation");
            excelQuestions = Resources.Load<ExcelQuestionsManager>("Configs/Questions");
            dialoguesManager = Resources.Load<ExcelDialoguesManager>("Configs/Dialogues");
        }
        #endregion

        private static GameData instance;
        public static GameData Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new GameData();
                }
                return instance;
            }
        }

单例模式在开发过程中十分常见,所以我们经常会使用泛型写一个单例模式的基类,这样我们就可以通过继承该基类轻松实现单例模式,代码如下所示:

public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
    public static T Instance { get; private set; }

    protected void Awake()
    {
        if (Instance == null)
        {
            Instance = (T) this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

我们使用 Singleton 基类实现我们的 GameManager,代码如下所示:

public class GameManager : Singleton<GameManager>
{
    public int Value { get; set; } = 0;
}
上一篇下一篇

猜你喜欢

热点阅读