首先应该把常规类和Mono类区分开来单独处理
1.编写常规单例类
using UnityEngine;
public class NormalSingleton<T> where T : class, new()
{
protected static T _single;
public static T Single
{
get
{
if (_single == null)
{
var t = new T();
if (t is MonoBehaviour)
{
Debug.LogError("Mono类请使用MonoSingleton");
return null;
}
_single = t;
}
return _single;
}
}
}
应用示例
public class LoadMgr : NormalSingleton<LoadMgr>
{
public LoadMgr()
{
/*
todo
*/
}
}
2.编写Mono单例类
using UnityEngine;
public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _single;
public static T Single
{
get
{
if (_single == null)
{
var go = new GameObject(typeof(T).Name);
DontDestroyOnLoad(go);
_single = go.AddComponent<T>();
}
return _single;
}
}
}
应用示例
public class AudioMgr : MonoSingleton<AudioMgr>, IInit
{
/*
todo
*/
}