Unity中的单例模式

如何实现一个单例模式基类?
我们知道单例类需要具备这些东西:

  • 全局唯一的实例
  • 提供给外部的访问点

单例模式类一般是在整个生命周期中唯一的,用于管理的类。

在这里,我将介绍一个最简单的单例模式基类,以后可以直接继承该基类以实现单例模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BaseMng<T>  where T: new()
{
//唯一实例
private static T instance;
//提供给外部的访问点
public static T GetInstance()
{
if(instance == null)
{
instance = new T();
}
return instance;
}
}

Q1:在Unity中,只有继承了MonoBehaviour的类才能绑定在对象上,这不就意味着继承这个基类的单例模式类不能绑定在对象上吗?
A:没错!!!:)确实不能绑定在场景上的对象上,但是要绑定在对象上干啥呢?
Q2:当然是能更直观的看到场景中哪些管理器在运作,知道场景中有多少个管理器对象。
A:好吧!:)那我就实现一个可以绑定在场景对象上的单例模式基类


分析一下,

  • 可以绑定在对象上 = 继承了MonoBehaviour类
  • 要在场景中有管理器对象 = 自己创建一个对象
  • 保证唯一 = 过场景时不删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//- 更改1:这里让基类继承MonoBehaviour类,之所以约束泛型T为MonoBehaviour,是因为AddComponent<T>()约束T为Component类型,为了让T满足这个约束,让T为MonoBehaviour类型,MonoBehaviour的父类是Behaviour,Behaviour的父类是Component,根据里氏转换原则能够用父类容器装子类对象,可以这样使用
public class BaseMng<T> : MonoBehaviour where T: MonoBehaviour
{
private static T instance;
public static T GetInstance()
{
//- 更改2:这里创建了一个对象;然后把脚本上添加脚本,并将其赋予这个唯一的实例
if(instance == null)
{
GameObject manager = new GameObject();
manager.name = typeof(T).Name.ToString();
instance = manager.AddComponenet<T>();
//- 更改3:过场景时不移除
DontDestroyOnLoad(manager);
}
return instance;
}
}

这样一来,就完成了可以继承MonoBehaviour的基类。