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单例设计模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • Unity实现简单手势识别

    本文实例为大家分享了Unity实现手势识别的具体代码,供大家参考,具体内容如下 代码很简单没有难度,都有注解,随便 看一看 就会了. CallEvent () 方法需要自己搭载使用. Unity代码 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 手势识别 /// </summary> public class PlayerAnimato

  • UnityWebRequest前后端交互实现过程解析

    一.技术概述 1.描述这个技术是做什么? 是Unity一套网络工具库,用于进行Http请求 2.学习该技术的原因? 项目需要,防止使用C#原生的网络库,加快开发速度 3.技术的难点在哪里 Unity仅提供了基础的功能,如何把这些功能构造成一个能够稳定业务开发的流程是一个比较难处理的问题 二.技术详情 描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述. HttpCenter类:封装Get.Post.Put.Delete,维护一个请求队列 ///Get方法例举 private IEnum

  • Unity实现喷漆效果

    本文实例为大家分享了Unity实现喷漆效果展示的具体代码,供大家参考,具体内容如下 喷漆功能 **应用场景:**如墙上的标语贴花,汽车上的喷漆等. 选择方案: 1.当然实现方法各式各异,最最最简单,也是最"不堪入目"的方法是直接给一个面片,然后获取喷漆位置,加上一个要喷漆表面法线方向的偏移,作为最终面片放置位置,当然,不要忘了设置面片的方向.这种方法虽然说简单,但是效果并不理想,会出经常现与其他物体穿插的情况,如果游戏中曲面太多,那么这个方案基本没法看. 2.对于个别特殊的需求来讲,比

  • Unity切割图集转换为多张图片

    本文实例为大家分享了Unity切割图集转换为多张图片的具体代码,供大家参考,具体内容如下 这是网上看来的一个工具,用于Unity中将图集切割为多张的格式后将这些sprite改为一张张图片,就是切割速度太慢,图集中的图片较多的时候还会丢失一部分图片,有时间本人会进一步改善再修改这篇博客. 1.首先选中要切割的图集,texture type 选为default,并勾选Advanced下的read/Write Enabled. 2.texture type改为sprite(2D and UI),Spr

  • Unity3D实现自动寻路

    Unity3D自动寻路,供大家参考,具体内容如下 1.首先在Unity3D创造中一个正方体,一个圆柱体和一个平面. 2.将正方体和平面设为静态(Static前的方格打勾) 3.在Window中打开AI进行导航网格烘培 4.在add component中添加Nav Mesh Agent(导航网格代理) 这里将Stopping Distance的值修改为0.5.如果使用默认值0,则最后圆柱体会与正方体重合在一起. 5.附加AI脚本给圆柱体 6.最终效果 Unity3D小白一枚,如有错误希望大佬们指正

  • Unity使用EzySlice实现模型多边形顺序切割

    Unity使用EzySlice实现模型切割,供大家参考,具体内容如下 老规矩,直接上代码: 注意:脚本搭载和需要的材质球以及切割数组填充 EzySlice 多边形顺序切割 using System.Collections; using System.Collections.Generic; using UnityEngine; using EzySlice; public class SplitterModel_ZH : MonoBehaviour { //切割预制体材质 public Mate

  • Unity实现本地文本多语言化

    本文实例为大家分享了Unity实现本地文本多语言化的具体代码,供大家参考,具体内容如下 在unity项目过程中大多都会遇到多语言化,下面讲一下自己的一些实现思路. 1. 创建一个要实现多语言化的基类 public abstract class BaseString { public abstract string text_test{get;} } 2. 对应的语言要继承BaseString类,这里实现中文和英文的两个类 public class ChineseString: BaseStrin

  • 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)

  • 完美解决单例设计模式中懒汉式线程安全的问题

    首先写个单例: public class SingleDemo { private static SingleDemo s = null; private SingleDemo(){} public static SingleDemo getInstance(){ if(s == null){ s = new SingleDemo(); } return s; } } 写个测试类: public class ThreadDemo3 { public static void main(String

  • 浅谈JAVASE单例设计模式

    简单的说设计模式,其实就是对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性.(单个实例) 使用单例设计模式需求:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证对象唯一性?                                                      解决步骤: 1.不允许其他程序用new创建该对象.                                    

  • Python 单例设计模式用法实例分析

    本文实例讲述了Python 单例设计模式用法.分享给大家供大家参考,具体如下: demo.py(单例): class MusicPlayer(object): # 类属性 记录对象引用 instance = None def __new__(cls, *args, **kwargs): # 1. 判断类属性是否是空对象 if cls.instance is None: # 2. 调用父类的方法,为第一个对象分配空间 cls.instance = super().__new__(cls) # 3.

  • python单例设计模式实现解析

    这篇文章主要介绍了python单例设计模式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 所谓单例,就是让类创建对象的时候,在系统中只有唯一的一个实例. (1)定义一个类属性,初始值是None,用于记录单例的引用. (2)重写__new__方法. (3)如果类属性是None,调用父类方法分配空间,并在属性中记录结果. (4)返回属性中记录的对象引用. class MusicPlayer(object): instance = None

  • Java之单例设计模式示例详解

    单例设计模式 保证一个类在内存中只能有一个对象. 思路: 1)如果其他程序能够随意用 new 创建该类对象,那么就无法控制个数.因此,不让其他程序用 new 创建该类的对象. 2)既然不让其他程序 new 该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了. 3)该类将创建的对象对外(整个系统)提供,让其他程序获取并使用. 饿汉式: 一上来我就把对象给你 new 好了,你来了直接就可以拿去"吃"了 懒汉式 (要是有人问单例的延迟加载方式指的就是这种方式) 一开始

  • 浅析Java单例设计模式(自写demo)

    目录 单例模式特点 单例模式优点 实现方式 饿汉式(线程安全) 懒汉式 单例模式特点 1.构造器私有 2.在一个Java应用程序中,可保证只有一个实例对象 3.只提供一个供外界调用的getInstance()方法 单例模式优点 1.减少某些对象的频繁创建,降低系统开销和内存占用 2.外部调用不使用new关键字,降低系统内存的使用频率 3.对于特殊的类,在系统中只能存在一个实例,否则系统无法正常运行,比如Controller 实现方式 这里简单介绍两种实现方式 饿汉式(线程安全) /** * @a

  • C++简明图解分析静态成员与单例设计模式

    目录 静态成员概述 静态成员数据 static修饰静态成员函数 const修饰静态成员 const修饰成员函数 静态成员案例 单例模式 静态成员概述 1.静态成员包括静态成员数据.静态成员函数 2.成员数据.成员函数被 static修饰 就叫静态成员数据.静态成员函数 3.不管这个类创建了多少个对象,静态成员只有一份,这一份被所有属于这个类的对象共享. 4.静态成员 是属于类 而不是具体的某个对象. 5.静态成员 是在定义完类的时候 就存在了. 静态成员数据 静态变量,是在编译阶段就分配空间,对

  • C++单例设计模式详细讲解

    目录 特殊类设计 只能在堆上创建对象的类 请设计一个类只能在栈上创建对象 请设计一个类不能被拷贝 请设计一个类不能被继承 请设计一个类只能创建一个对象(单例模式) 懒汉模式和饿汉模式的对比 特殊类设计 只能在堆上创建对象的类 请设计一个类,只能在堆上创建对象 实现方式: 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 class test { public: static test* GetObj() { re

  • 浅谈Java编程中的单例设计模式

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像findbugs等代码检查工具还会认为使用System.out.println()是一个bug. 为什么作为Java新手神器的System.out.println(),到了真正项目开发当中会被唾弃呢?其实只要细细分析,你就会发现它的很多弊端.比如不可控制,所有的日志都会在项目上线后照常打印,从而降低运

随机推荐