1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class NewBehaviourScript : MonoBehaviour
  5. {
  6. private static NewBehaviourScript instance;
  7. public static NewBehaviourScript GetInstance()
  8. {
  9. // 继承了Mono的脚本不能直接new
  10. // 只能通过拖动到对象上 或者 通过 加脚本的api
  11. // U3D内部帮助我们实例化它
  12. return instance; // 一个继承Mono的脚本肯定是挂载场景上一个GameObject上的,或者用脚本用AddComponent加的
  13. }
  14. private void Awake()
  15. {
  16. // 这个脚本只要挂载到场景上,就会触发Awake
  17. instance = this;
  18. // 问题 如果这个脚本被挂了多次, 单例模式就被破坏了, 只能指向最后一次Awake的对象
  19. }
  20. }

基类实现

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. // 继承了MonoBehavior的单例模式对象 需要我们自己保证它的唯一性
  5. public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour // 里氏转换原则:父类装子类
  6. {
  7. private static T instance;
  8. public static T GetInstance()
  9. {
  10. // 继承了Mono的脚本 不能够直接new
  11. // 只能通过拖动到对象上 或者 通过加脚本的api AddComponent去加脚本
  12. // U3D内部帮助我们实例化它
  13. return instance;
  14. }
  15. // 子类能够重写Awake
  16. protected virtual void Awake()
  17. {
  18. instance = this as T;
  19. }
  20. }
  • 使用 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine;

public class NewBehaviourScript : SingletonMono { protected override void Awake() { // 一定要保留 base.Awake() base.Awake(); }

  1. private void Start()
  2. {
  3. Debug.Log(NewBehaviourScript.GetInstance().name);
  4. }

}

  1. <a name="PsNQR"></a>
  2. # 自动实现的基类
  3. :::warning
  4. 继承这种自动创建的 单例模式基类 不需要我们手动去拖 或者API去加 想用他直接GetInstance就行了
  5. :::
  6. ```csharp
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using UnityEngine;
  10. public class SingletonAutoMono<T> : MonoBehaviour where T : MonoBehaviour
  11. {
  12. private static T instance;
  13. public static T GetInstance()
  14. {
  15. if(instance == null)
  16. {
  17. GameObject obj = new GameObject();
  18. // 设置对象名为脚本名
  19. obj.name = typeof(T).ToString();
  20. instance = obj.AddComponent<T>();
  21. }
  22. return instance;
  23. }
  24. }

例子:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class TestScript : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. NewBehaviourScript.GetInstance().TestFun();
  9. }
  10. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class NewBehaviourScript : SingletonAutoMono<NewBehaviourScript>
  5. {
  6. public void TestFun()
  7. {
  8. Debug.Log(NewBehaviourScript.GetInstance().name);
  9. }
  10. }

image.png