Unity笔记-泛型单例

单例模式

一个类只有一个对象(实例)叫做单例模式。适用于管理类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*unity单例模式:
只能将单例脚本挂载到一个对象上,且一个对象只能有一个此单例脚本。
优点:单例模式的脚本只能有一个对象,使用对象方便。
一般要给外界提供一个访问变量,让外界来访问唯一的该类所生成的对象。
只希望外界访问,不希望外界修改(因为管理器一般自主控制,修改变量),所以使用private关键字。*/
private static ClassName instance;
//不提供set,只提供get访问。
public static ClassName Instance{
get{
return instance;
}
}
// 防止出现null异常,在Awake()里添加逻辑:
void Awake(){
instance = this;
}
// 对于外界访问instance,使用如下逻辑:
ClassName obj = ClassName.Instance;

对于使用多个单例的场景,可以使用泛型单例基类

泛型单例基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ClassName<T> : MonoBehaviour where T : MonoBehaviour//定义泛型 具体类型由传入的类型决定 限制T为MonoBehaviour或它的子类
{
private static T instance;
public static T Instance{
get{
return instance;
}
protected virtual void Awake(){
instance = this as T;//类型转换 把this转换为T类型的对象
}

}
protected virtual void OnDestory(){
instance = null;
}
}

基类继承

1
2
3
4
5
public class ClassName1 : ClassName<ClassName1>{
//直接继承ClassName类里的所有方法 无需多写,该类即为单例类
//ClassName1传入了ClassName1类型给T,因此,之前用T类型的变量在继承的ClassName1里都变成了ClassName1类型
//(Tip:传类型给T不影响基类)
}

访问单例类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test : MonoBehaviour
{
public ClassName c1=null;
public ClassName1 c2=null;
void Start(){
c1 = ClassName.Instance;
c2 = ClassName1.Instance;


}
void Update(){

}
}

普通csharp类实现单例

1
2
3
4
5
6
7
8
9
10
11
public class Test1{
private static Test1 instance;
public static Test1 Instance{
get{
if(instance == null){//判断是否为空
instance = new Test1();
}
return instance;
}
}
}