• Unity中的单例方法2


      前沿:

        在最近的一次复习中,我突然发现游戏项目中的单例方法其实大概就3种情况。

          1.不继承自MonoBehaviour的单例。

          2.继承自MonoBehaviour的,并且会随着场景切换而销毁的单例。

          3.继承自MonoBehaviour的,并且不会随着场景切换而销毁的单例。

        所以,今天我将重新的归纳游戏中的单例方法的写法。

      一、不继承自MonoBehaviour的单例。

    
    
    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             Singleton.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-03-20 15:38:13
    // 修改者列表(modifier):
    // 模块描述(Module description):
    // 
    // **********************************************************************
    #endregion
    
    using UnityEngine;
    using System;
    
    public abstract class Singleton<T> : IDisposable where T : class, new()
    {
        protected static T _instance = null;
    
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new T();
                }
                return _instance;
            }
        }
    
        /// <summary>
        /// 实现的接口 --- Dispose表示将当前资源关闭
        /// </summary>
        public virtual void Dispose()
        {
            
        }
    }
    
    
    
     

      二、继承自MonoBehaviour的,并且会随着场景切换而销毁的单例。

    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             MonoSingleton.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-03-20 15:30:26
    // 修改者列表(modifier):
    // 模块描述(Module description):  继承自MonoBehaviour的泛型单例
    // 
    // **********************************************************************
    #endregion
    
    using UnityEngine;
    
    public abstract class MonoSingleton<T> : MonoBehaviour where T  : MonoSingleton<T>
    {
        private static T _instance = null;
    
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = FindObjectOfType(typeof(T)) as T;
    
                }
                return _instance;
            }
        }
    
    }

      三、继承自MonoBehaviour的,并且不会随着场景切换而销毁的单例。

    #region 模块信息
    // **********************************************************************
    // Copyright (C) 2018 The company name
    //
    // 文件名(File Name):             DontDesMonoSingleton.cs
    // 作者(Author):                  Dean1874
    // 创建时间(CreateTime):          2018-03-20 15:42:31
    // 修改者列表(modifier):
    // 模块描述(Module description):
    // 
    // **********************************************************************
    #endregion
    
    using UnityEngine;
    
    public abstract class DontDesMonoSingleton<T> : MonoBehaviour  where T : DontDesMonoSingleton<T>
    {
        protected static T _instance = null;
    
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    GameObject go = GameObject.Find("DontDesMonoSingleton");
                    if (go == null)
                    {
                        go = new GameObject("DontDesMonoSingleton");
    
                        DontDestroyOnLoad(go);
                    }
    
                    _instance = go.GetComponent<T>();
    
                    if (_instance == null)
                    {
                        _instance = go.AddComponent<T>();
                    }
                }
    
                return _instance;
            }
        }
    }

      总结:以上就是三种单例方法的泛型的写法,如何运用,在这里我就不进行实际操作了,使用起来是很简单的。

  • 相关阅读:
    eureka_feign学习_1
    九度 题目1183:守形数----------------我用的方法自创
    题目1179:阶乘-------------阶乘不用long long int 就不能AC
    题目1177:查找---------------字符串的函数问题
    题目1170:找最小数-------------------------------找最小值,中间值应该初始化为最大值
    题目1169:比较奇偶数个数-----------------------------这个世界不是奇数就是偶数l
    题目1075:斐波那契数列
    题目1070:今年的第几天?---------关键是闰年的判断
    题目1068:球的半径和体积----------------------------arccos(-1)要用c语言中的acos(-1)代替
    题目1067:n的阶乘--------long long int
  • 原文地址:https://www.cnblogs.com/Dean27/p/8609838.html
Copyright © 2020-2023  润新知