-
Notifications
You must be signed in to change notification settings - Fork 69
Expand file tree
/
Copy pathMonoSingleton.cs
More file actions
151 lines (122 loc) · 3.81 KB
/
MonoSingleton.cs
File metadata and controls
151 lines (122 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using UnityEngine;
namespace UnityCommunity.UnitySingleton
{
/// <summary>
/// The basic MonoBehaviour singleton implementation, this singleton is destroyed after scene changes, use <see cref="PersistentMonoSingleton{T}"/> if you want a persistent and global singleton instance.
/// </summary>
/// <typeparam name="T"></typeparam>
[DefaultExecutionOrder(-50)]
public abstract class MonoSingleton<T> : MonoBehaviour, ISingleton where T : MonoSingleton<T>
{
#region Fields
/// <summary>
/// The instance.
/// </summary>
private static T instance;
/// <summary>
/// The initialization status of the singleton's instance.
/// </summary>
private SingletonInitializationStatus initializationStatus = SingletonInitializationStatus.None;
#endregion
#region Properties
/// <summary>
/// Gets the instance.
/// </summary>
/// <value>The instance.</value>
public static T Instance
{
get
{
if (instance == null)
{
#if UNITY_6000
instance = FindAnyObjectByType<T>();
#else
instance = FindObjectOfType<T>();
#endif
if (instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
instance = obj.AddComponent<T>();
instance.OnMonoSingletonCreated();
}
}
return instance;
}
}
/// <summary>
/// Gets whether the singleton's instance is initialized.
/// </summary>
public virtual bool IsInitialized => this.initializationStatus == SingletonInitializationStatus.Initialized;
#endregion
#region Unity Messages
/// <summary>
/// Use this for initialization.
/// </summary>
protected virtual void Awake()
{
if (instance == null)
{
instance = this as T;
// Initialize existing instance
InitializeSingleton();
}
else if (instance != this)
{
// Destory duplicates
if (Application.isPlaying)
{
Destroy(gameObject);
}
else
{
DestroyImmediate(gameObject);
}
}
}
#endregion
#region Protected Methods
/// <summary>
/// This gets called once the singleton's instance is created.
/// </summary>
protected virtual void OnMonoSingletonCreated()
{
}
protected virtual void OnInitializing()
{
}
protected virtual void OnInitialized()
{
}
#endregion
#region Public Methods
public virtual void InitializeSingleton()
{
if (this.initializationStatus != SingletonInitializationStatus.None)
{
return;
}
this.initializationStatus = SingletonInitializationStatus.Initializing;
OnInitializing();
this.initializationStatus = SingletonInitializationStatus.Initialized;
OnInitialized();
}
public virtual void ClearSingleton() { }
public static void CreateInstance()
{
DestroyInstance();
instance = Instance;
}
public static void DestroyInstance()
{
if (instance == null)
{
return;
}
instance.ClearSingleton();
instance = null;
}
#endregion
}
}