C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > unity单例设计模式

Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

作者:汐夜

这篇文章主要介绍了Unity通用泛型单例设计模式,分为普通型和继承MonoBehaviour,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。

普通泛型单例:

public abstract class Singleton<T> where T : class, new()
{
  private static T instance = null;

  private static readonly object locker = new object();

  public static T Instance
  {
    get
    {
      lock (locker)
      {
        if (instance == null)
          instance = new T();
        return instance;
      }
    }
  }
}

继承MonoBehaviour的泛型单例:

using UnityEngine;

public abstract class MonoSingleton <T>: MonoBehaviour where T:MonoBehaviour
{
  private static T instance = null;

  private static readonly object locker = new object();

  private static bool bAppQuitting;

  public static T Instance
  {
    get
    {
      if (bAppQuitting)
      {
        instance = null;
        return instance;
      }

      lock (locker)
      {
        if (instance == null)
        {
          instance = FindObjectOfType<T>();
          if (FindObjectsOfType<T>().Length > 1)
          {
            Debug.LogError("不应该存在多个单例!");
            return instance;
          }

          if (instance == null)
          {
            var singleton = new GameObject();
            instance = singleton.AddComponent<T>();
            singleton.name = "(singleton)" + typeof(T);
            singleton.hideFlags = HideFlags.None;
            DontDestroyOnLoad(singleton);
          }
          else
            DontDestroyOnLoad(instance.gameObject);
        }
        instance.hideFlags = HideFlags.None;
        return instance;
      }
    }
  }

  private void Awake()
  {
    bAppQuitting = false;
  }

  private void OnDestroy()
  {
    bAppQuitting = true;
  }
}

使用方法直接用类去继承这两个抽象单例即可,使用T.Instance就可以直接取得该类(T)的唯一实例了。

以上就是Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)的详细内容,更多关于unity单例设计模式的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文