首先最基础的便是单例模式基类,在Unity开发中,有些东西我们只想让它有一个,比如单独的关卡管理器、单独的公共Mono模块,而单例模式就是为了实现这一需求。

下面的单例模式,是我结合各家所长(如唐老狮、鬼鬼鬼ii、joker老师)写的一个较为简易的版本,虽然简易,但足够够用,它考虑到多线程、继承MonoBehaviour等方面,可以直接复制粘贴使用。

不继承MonoBehaviour的单例模式基类

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using UnityEngine;

public class SingleTonBase<T> where T : class, new()
{
private static T instance;
protected static readonly object _lock = new object();
public static T GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new T();
}
}
}
return instance;
}
}

继承MonoBehaviour的单例模式基类

plaintext
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
using UnityEngine;

public class SingleMono<T> : MonoBehaviour where T : SingleMono<T>
{
private static T _instance;
private static object _lock = new object();

public static T MainInstance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = FindFirstObjectByType<T>() as T; //先去场景中找有没有这个类

if (_instance == null)//如果没有,那么我们自己创建一个Gameobject然后给他加一个T这个类型的脚本,并赋值给instance;
{
GameObject go = new GameObject(typeof(T).Name);
_instance = go.AddComponent<T>();
}
}
}

return _instance;
}
}


protected virtual void Awake()
{
if (_instance == null)
{
_instance = (T)this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}


private void OnApplicationQuit()//程序退出时,将instance清空
{
_instance = null;
}
}