首先最基础的便是单例模式基类,在Unity开发中,有些东西我们只想让它有一个,比如单独的关卡管理器、单独的公共Mono模块,而单例模式就是为了实现这一需求。 下面的单例模式,是我结合各家所长(如唐老狮、鬼鬼鬼ii、joker老师)写的一个较为简易的版本,虽然简易,但足够够用,它考虑到多线程、继承MonoBehaviour等方面,可以直接复制粘贴使用。
不继承MonoBehaviour的单例模式基类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using UnityEngine; public class SingleTonBase<T> where T : class, new() { private static T instance; protected static readonly object _lock = new object(); public static T GetInstance() { if (instance == null) { lock (_lock) { if (instance == null) { instance = new T(); } } } return instance; } }
继承MonoBehaviour的单例模式基类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using UnityEngine; public class SingleMono<T> : MonoBehaviour where T : SingleMono<T> { private static T _instance; private static object _lock = new object(); public static T MainInstance { get { if (_instance == null) { lock (_lock) { _instance = FindFirstObjectByType<T>() as T; //先去场景中找有没有这个类 if (_instance == null)//如果没有,那么我们自己创建一个Gameobject然后给他加一个T这个类型的脚本,并赋值给instance; { GameObject go = new GameObject(typeof(T).Name); _instance = go.AddComponent<T>(); } } } return _instance; } } protected virtual void Awake() { if (_instance == null) { _instance = (T)this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void OnApplicationQuit()//程序退出时,将instance清空 { _instance = null; } }