单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。
普通泛型单例:
1 public abstract class Singleton<T> where T : class, new()
2 {
3 private static T instance = null;
4
5 private static readonly object locker = new object();
6
7 public static T Instance
8 {
9 get
10 {
11 lock (locker)
12 {
13 if (instance == null)
14 instance = new T();
15 return instance;
16 }
17 }
18 }
19 }
继承MonoBehaviour的泛型单例:
1 using UnityEngine;
2
3 public abstract class MonoSingleton <T>: MonoBehaviour where T:MonoBehaviour
4 {
5 private static T instance = null;
6
7 private static readonly object locker = new object();
8
9 private static bool bAppQuitting;
10
11 public static T Instance
12 {
13 get
14 {
15 if (bAppQuitting)
16 {
17 instance = null;
18 return instance;
19 }
20
21 lock (locker)
22 {
23 if (instance == null)
24 {
25 instance = FindObjectOfType<T>();
26 if (FindObjectsOfType<T>().Length > 1)
27 {
28 Debug.LogError("不应该存在多个单例!");
29 return instance;
30 }
31
32 if (instance == null)
33 {
34 var singleton = new GameObject();
35 instance = singleton.AddComponent<T>();
36 singleton.name = "(singleton)" + typeof(T);
37 singleton.hideFlags = HideFlags.None;
38 DontDestroyOnLoad(singleton);
39 }
40 else
41 DontDestroyOnLoad(instance.gameObject);
42 }
43 instance.hideFlags = HideFlags.None;
44 return instance;
45 }
46 }
47 }
48
49 private void Awake()
50 {
51 bAppQuitting = false;
52 }
53
54 private void OnDestroy()
55 {
56 bAppQuitting = true;
57 }
58 }
使用方法直接用类去继承这两个抽象单例即可,使用T.Instance就可以直接取得该类(T)的唯一实例了。