unity中的单例模式是非常常见的,我们通常会可能使用一下几种单例模式,在使用单例模式时我们可能会遇到的一些问题下面我给大家来梳理一下。
1、不继承Monobehaviour类的单例模式
class SingletonNoMono
{
private SingletonNoMono() { }
private static SingletonNoMono instance;
public static SingletonNoMono Instance
{
get
{
if(instance==null)
{
instance=Activator.CreateInstance<SingletonNoMono>();
}
return instance;
}
}
}
这是一个常见的不继承Monobehaviour的单例模式,在这个单例模式中我们给外界提供了一个属性让这个属性可以被外界访问到,如果检测到instance不存在,则自动创建一个单例模式。
2、不继承Monobehaviour的泛型单例模式
class SingletonNoMono<T>
{
protected SingletonNoMono() { }
private static T instance;
public static T Instance
{
get
{
if(instance==null)
{
instance=Activator.CreateInstance<T>();
}
return instance;
}
}
}
这是一个泛型的单例模式,和前面不同的是,泛型单例模式的构造函数的修饰符是perotected,这是因为我们需要继承这个泛型类,所以不能设置为private应该设置为能够被子类访问的protected
4、继承monobehaviour的泛型单例模式
class SingletonParrentMonoBaseT<T> : MonoBehaviour where T : MonoBehaviour
{
private T instance;
public T Instance
{
get
{
if (instance == null)
{
instance = FindObjectOfType<T>();
}
if (instance == null)
{
GameObject go = new GameObject();
instance = go.AddComponent<T>();
//在场景切换的时候不销毁
DontDestroyOnLoad(go);
}
return instance;
}
}
}
这个是继承Monobehaviour的泛型单例模式,这里面我们需要注意在场景中如果没有这个单例模式需要我们自己手动添加。在切换场景时我们可以选择不让这个单例模式取消。