MonoSingleton.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using UnityEngine;
  3. /// <summary>
  4. /// 单键类
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
  8. {
  9. /// <summary>
  10. /// 单键
  11. /// </summary>
  12. private static T m_Instance;
  13. /// <summary>
  14. /// 单键
  15. /// </summary>
  16. public static T Instance
  17. {
  18. get
  19. {
  20. if (object.ReferenceEquals(MonoSingleton<T>.m_Instance, null))
  21. {
  22. GameObject obj = new GameObject(typeof(T).ToString());
  23. obj.transform.parent = Container.transform;
  24. MonoSingleton<T>.m_Instance = obj.AddComponent<T>();
  25. }
  26. return MonoSingleton<T>.m_Instance;
  27. }
  28. }
  29. static GameObject _mC;
  30. static GameObject Container
  31. {
  32. get
  33. {
  34. if (null == _mC)
  35. {
  36. _mC = GameObject.Find("MonoSingleton");
  37. }
  38. if (null == _mC)
  39. {
  40. _mC = new GameObject("MonoSingleton");
  41. DontDestroyOnLoad(_mC);
  42. }
  43. return _mC;
  44. }
  45. }
  46. /// <summary>
  47. /// 单键是否有效
  48. /// </summary>
  49. public static bool IsInstanceValid
  50. {
  51. get
  52. {
  53. return !object.ReferenceEquals(MonoSingleton<T>.m_Instance, null);
  54. }
  55. }
  56. /// <summary>
  57. /// 初始化
  58. /// </summary>
  59. private void Awake()
  60. {
  61. if (object.ReferenceEquals(MonoSingleton<T>.m_Instance, null))
  62. {
  63. MonoSingleton<T>.m_Instance = (this as T);
  64. MonoSingleton<T>.m_Instance.OnAwake();
  65. }
  66. }
  67. /// <summary>
  68. /// 初始化
  69. /// </summary>
  70. protected virtual void OnAwake()
  71. {
  72. }
  73. /// <summary>
  74. /// 销毁
  75. /// </summary>
  76. protected virtual void DoOnDestroy()
  77. {
  78. }
  79. /// <summary>
  80. /// 销毁
  81. /// </summary>
  82. private void OnDestroy()
  83. {
  84. this.DoOnDestroy();
  85. if (object.ReferenceEquals(MonoSingleton<T>.m_Instance, this))
  86. {
  87. MonoSingleton<T>.m_Instance = (T)((object)null);
  88. }
  89. }
  90. }