1. 继承于MonoBehaviour(不随着场景切换而销毁)
基类代码:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 /// <summary> 6 /// 单例模式基类,继承于 MonoBehaviour,不随场景切换而销毁 7 /// 在场景中新建空物体 DDOL,挂载 T 类继承 DDOLSingleton<T> 即可 8 /// </summary> 9 /// <typeparam name="T"></typeparam> 10 public abstract class DDOLSingleton<T> : MonoBehaviour where T : DDOLSingleton<T> 11 { 12 protected static T _instance = null; 13 14 public static T Instance 15 { 16 get 17 { 18 if (null == _instance) 19 { 20 GameObject go = GameObject.Find("DDOL"); 21 if (null == go) 22 { 23 go = new GameObject("DDOL"); 24 DontDestroyOnLoad(go); 25 } 26 _instance = go.GetComponent<T>(); 27 if (null == _instance) 28 { 29 _instance = go.AddComponent<T>(); 30 } 31 } 32 return _instance; 33 } 34 } 35 }
测试:
新建空实体 DDOL,挂载脚本 GameManage。
新建一个按钮,实现加载下一场景功能,测试是否随场景销毁而销毁。
Hierarchy :
GameManage 代码:
1 using System.Collections.Generic; 2 using UnityEngine; 3 4 /// <summary> 5 /// 单例 6 /// </summary> 7 public class GameManage : DDOLSingleton<GameManage> { 8 public void TestMethod() 9 { 10 Debug.Log("GameManage"); 11 } 12 }
测试代码:
1 /// <summary> 2 /// 测试单例 3 /// </summary> 4 public class Test : MonoBehaviour { 5 6 // Use this for initialization 7 void Start () { 8 GameManage.Instance.TestMethod(); 9 } 10 11 // Update is called once per frame 12 void Update () { 13 14 } 15 16 public void OnBtnClick() 17 { 18 SceneManager.LoadScene(1); 19 } 20 }
效果图:
2. 不继承于MonoBehaviour(随着场景切换而销毁)
基类代码:
1 /// <summary> 2 /// 单例模式基类,不继承于 MonoBehaviour,随场景切换而销毁 3 /// 挂载 T 类继承 DDOLSingleton<T>,重载 Init 函数即可 4 /// </summary> 5 /// <typeparam name="T"></typeparam> 6 public abstract class Singleton<T> where T : class, new() 7 { 8 protected static T _instance = null; 9 10 public static T Instance 11 { 12 get 13 { 14 if (null == _instance) 15 { 16 _instance = new T(); 17 } 18 return _instance; 19 } 20 } 21 22 protected Singleton() 23 { 24 if (null != _instance) 25 { 26 Debug.LogError("This " + typeof(T).ToString() + " Singleton Instance is not null !!!"); 27 } 28 Init(); 29 } 30 31 public virtual void Init() 32 { 33 34 } 35 }
此时 GameManage 代码修改为:
1 /// <summary> 2 /// 测试 Singleton 3 /// </summary> 4 public class GameManage : Singleton<GameManage> { 5 public override void Init() 6 { 7 base.Init(); 8 } 9 10 public void TestMethod() 11 { 12 Debug.Log("GameManage"); 13 } 14 }