Unity单例

1、非Mono单例:

 1 using System;
 2 using System.Reflection;
 3 using System.Collections.Generic;
 4
 5 public static class Singleton<T> where T : class
 6 {
 7     static volatile T _instance;
 8     static object _lock = new object();
 9
10     static Singleton()
11     {
12     }
13
14     public static T Get()
15     {
16         if (_instance == null)
17         {
18             lock (_lock)
19             {
20                 if (_instance == null)
21                 {
22                     ConstructorInfo constructor = null;
23                     try
24                     {
25                         constructor = typeof(T).GetConstructor(BindingFlags.Instance |
26                                                                BindingFlags.NonPublic, null, new Type[0], null);
27                     }
28                     catch (Exception e)
29                     {
30                         throw e;
31                     }
32
33                     if (constructor == null || constructor.IsAssembly)
34                     {
35                         throw new Exception(string.Format("A private or protected constructor is missing for ‘{0}‘.", typeof(T).Name));
36                     }
37
38                     _instance = (T)constructor.Invoke(null);
39                 }
40             }
41         }
42         return _instance;
43     }
44 }

  调用方法:Singleton<XXX>.Get(),XXX表示非继承MonoBehavior的类的类名。

2、Mono单例:

 1 using System;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4
 5 public static class MonoSingleton<T> where T : MonoBehaviour
 6 {
 7     private static T _instance;
 8
 9     public static T Get()
10     {
11         if (_instance == null)
12         {
13             _instance = UnityEngine.Object.FindObjectOfType<T>();
14         }
15
16         return _instance;
17     }
18 }

  调用方法:MonoSingleton<XXX>.Get(),XXX表示继承MonoBehavior的类的类名。

时间: 2024-11-13 09:33:27

Unity单例的相关文章

Unity 单例写法

https://www.cnblogs.com/SHOR/p/5192046.html 借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类.单例类的实现又分为两种: 继承自MonoBehaviour的单例类 纯C#的单例类 前者的优点是: 可以在Inspector中显示,便于赋值和查看变量等: 可以利用MonoBehaviour的接口: 可以使用C

Unity Singleton 单例类(Unity3D开发之二十)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 今天看到群里有朋友问unity单例的最佳实现方式,下面我我经常用的.贴出来供大家参考. 一.添加单例模板类 using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private

unity泛型单例

参考自:http://wiki.unity3d.com/index.php/Singleton 我们要使用Unity3d在Object类中提供了一个静态函数 :Object.DontDestroyOnLoad (Object target) . 加载新场景的时候使单例对象不被自动销毁 作为 MonoBehaviour 因为我们可能需要协同程序,所以使用 Lock同步 用法示例 MyClass.cs public class MyClass : MonoBehaviour { void Awake

馨予带你飞之unity中使用单例(二)

Unity中使用单例类 单例模式 Unity中单例类的创建 Unity中单例类的使用 单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. Unity中单例类的创建 using UnityEngine; using System.Collections; /// <summary>

【Unity】游戏中的单例

游戏中需要一些 GameObject(例如网络管理器) 在游戏的整个生命周期都存在,而且是以单例的形式存在. XGame 中实现这种单例的方式是,单例脚本都从 MonoSingle 类继承,MonoSingleton 的实现方法是在 Awake() 中调用DontDestroyOnLoad(gameObject);来保证单例. MonoSingleton类的实现代码: 1 /// <summary> 2 /// Generic Mono singleton. 3 /// </summar

基于unity的单例设计模式写法

设计模式有23中,都是为了解藕设计的.就先拿单例设计模式说说把.因为平常最起码你也得用到单例设计先弄一个泛型的单例模板代码如下: 1 //泛型的单例设计模式.项目中用的多 2 public class GameController<T> : MonoBehaviour where T :GameController<T> { 3 private static T _instance; 4 public static T Instance 5 { 6 get 7 { 8 if (_i

unity, 什么时候用静态类,什么时候用单例

如果没有成员变量,或者成员变量都是常量,则用静态类. 如果有成员变量,则用单例.(以便让成员变量有初始化机会). //静态类 public class CmyFuncs{ public float m_pi=3.1415926; static float calculateCircleArea(float r){ return r*r*m_pi; } ... } //单例 public class CmyUtil {    static private CmyUtil m_instance=nu

unity3d - new 不出的单例

可能习惯了写单例的朋友,或者常规的单例模式 会这样做 private static Single instance; public static Single Instance(){ if (instance == null) { instance = new Single(); } return instance; } 但是当你继承了MonoBehaviour 你就要小心了如果你这样写 1 public class Single : MonoBehaviour { 2 private stat

单例实现方式

游戏中很多地方,都需要用到单例模式,虽然单例实现代码不多,但是每一个脚本都重复写的话,也相当的麻烦. 我们可以这样,写一个泛型的父类,来实现这个单例模式,然后其余的只要继承这个父类,自然就有 1 public class HNSingleton<T> where T :class 2 { 3 4 #region 私有变量 5 6 private static T g_instance; // 静态实例句柄 7 private static readonly object g_instanceL