当我们写单例脚本的时候每次都需要写单例模式,是一件极其麻烦的事,所以这里写一个单例模板出来,需要用要单例类的脚本只需要继承这个单例模板就可以了。
1.不继承至MonoBehaviour的普通C#单例类
using System.Collections.Generic;
using UnityEngine;
public class NormalSingleton<T> where T : class,new()
{
private static T instance;
public static T Instance
{
get
{
if(instance == null)
{
T t = new T();
if (t is MonoBehaviour)
{
Debug.LogError("该类不是普通类,需要继承MonoSingleton");
return null;
}
instance = t;
}
return instance;
}
}
}
2.继承至MonoBehaviour的单例类,继承至MonoBehaviour的单例往往会比较麻烦,因为当我们在切换场景的时候这个单例就被销毁了,那么这个时候可以写上DontDestoryLoad方法,但是如果从其他场景切换为原本挂载了单例脚本的场景就会出现两个单例,所以在Awake中对这种情况进行了解决。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if(instance == null)
{
instance = FindObjectOfType<T>();
if (instance == null)
{
Debug.LogError("没有在场景中找到该类,该类的类名为:" + typeof(T).Name);
return null;
}
}
return instance;
}
}
private void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(instance);
}
}
}