Unity3D单例类模板类

C#代码  

  1. using UnityEngine;
  2. /// <summary>
  3. /// Be aware this will not prevent a non singleton constructor
  4. ///   such as `T myT = new T();`
  5. /// To prevent that, add `protected T () {}` to your singleton class.
  6. ///
  7. /// As a note, this is made as MonoBehaviour because we need Coroutines.
  8. /// </summary>
  9. public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
  10. {
  11. private static T _instance;
  12. private static object _lock = new object();
  13. public static T Instance
  14. {
  15. get
  16. {
  17. if (applicationIsQuitting) {
  18. Debug.LogWarning("[Singleton] Instance ‘"+ typeof(T) +
  19. "‘ already destroyed on application quit." +
  20. " Won‘t create again - returning null.");
  21. return null;
  22. }
  23. lock(_lock)
  24. {
  25. if (_instance == null)
  26. {
  27. _instance = (T) FindObjectOfType(typeof(T));
  28. if ( FindObjectsOfType(typeof(T)).Length > 1 )
  29. {
  30. Debug.LogError("[Singleton] Something went really wrong " +
  31. " - there should never be more than 1 singleton!" +
  32. " Reopenning the scene might fix it.");
  33. return _instance;
  34. }
  35. if (_instance == null)
  36. {
  37. GameObject singleton = new GameObject();
  38. _instance = singleton.AddComponent<T>();
  39. singleton.name = "(singleton) "+ typeof(T).ToString();
  40. DontDestroyOnLoad(singleton);
  41. Debug.Log("[Singleton] An instance of " + typeof(T) +
  42. " is needed in the scene, so ‘" + singleton +
  43. "‘ was created with DontDestroyOnLoad.");
  44. } else {
  45. Debug.Log("[Singleton] Using instance already created: " +
  46. _instance.gameObject.name);
  47. }
  48. }
  49. return _instance;
  50. }
  51. }
  52. }
  53. private static bool applicationIsQuitting = false;
  54. /// <summary>
  55. /// When Unity quits, it destroys objects in a random order.
  56. /// In principle, a Singleton is only destroyed when application quits.
  57. /// If any script calls Instance after it have been destroyed,
  58. ///   it will create a buggy ghost object that will stay on the Editor scene
  59. ///   even after stopping playing the Application. Really bad!
  60. /// So, this was made to be sure we‘re not creating that buggy ghost object.
  61. /// </summary>
  62. public void OnDestroy () {
  63. applicationIsQuitting = true;
  64. }
  65. }

小结:

时间: 2024-08-07 00:06:27

Unity3D单例类模板类的相关文章

Unity3D 单例(singleton)管理类

在Unity3D中,有什么好的方法去创建一个单例游戏管理类,可以像一个全局类的静态变量一样到处访问? 在Unity中有什么接口吗?我是否要把这个脚本添加到一个物体上呢?这个类可以仅仅放在文件夹里不用添加到场景里吗? 通常来说视情况而定,常用的两种单例类. (1)组件式的添加在物体上. (2)不从MonoBehaviour继承的独立类. public class MainComponentManger { private static MainComponentManger instance; p

JAVA单例MongoDB工具类

经常对MongoDB进行一些常用操作,为了方便起见将这些常用操作合并到一个工具类中,方便自己开发使用. 没用Spring Data.Morphia等框架是为了减少学习.维护成本,另外自己直接JDBC方式的话可以更方便的控制操作.为自己以后的积累留一个脚印. 代码如下: package utils; import java.util.ArrayList; import java.util.List; import org.apache.commons.configuration.Composite

可清除的单例对象获取类

public abstract class EnableCleanSingle<T>{ private volatile T object; private int updateCount; public T getObject() { if(object == null) { synchronized (this){ if(object == null) { createObject(); updateCount++; } } } //这里在并发的时候,可能会返回null //解决方法:将整

C++单例类设计模式的思考

本次博文假设有一个Manager管理类,并以此为探究单例类的设计模式. 一般作法 类声明: class Manager{ public: ~Manager(); //提供单例对象访问 static Manager* getInstance(); //删除单例对象 void deleteInstance(); void dosometing(); private: //构造函数声明为 保护方法 Manager(); //单例对象指针 static Manager* s_Manager; }; 类方

Egret场景切换管理类切换和单例使用方法

场景切换是很多开发者在开发过程中必不可少的一个环节,当项目中有两个或两个以上的游戏场景时,怎样管理这些场景,能够使它们之间的切换更加方便呢?今天就为大家介绍场景切换管理类的切换方法和单例的使用方法. 案例源码:https://github.com/hkjlx/qhcj 首先创建一个所有场景的父类Scene Scene类主要是为了方便管理场景,此类是一个抽象类,子类必须继承此类并实现onComplete()抽象方法才能进行场景的切换. abstract class Scene extends eu

如何用boost::serialization去序列化派生模板类(续)

在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. 先看看变异错误的代码(...看不出有错,但是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_da

C++中的类模板详细讲述

一.类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }: 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数.类型参数由关键字class或typename及其后面的标识符构成.非类型参数由一个普通参数构成,代表模板定义中的一个常量. 例: 1 template<class type,int widt

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

C++程序设计方法4:类模板

类模板 在定义类时也可以将一些类型抽象出来,用模板参数来替换,从而使类更具有通用性.这种类被称为模板类,例如: template <typename T> class A { T data; public: //类模板成员函数的定义方式一:在类模板中定义 void print() {cout << data << endl;} } //类模板成员函数的定义方式二:在类模板外定义 template<typename T> void A::print(){cou