• 知识点: 过场景不移除
    • 作用: 让没有继承Mono的类可以开启协程, 可以Update更新, 统一管理Update

    :::tips 不同脚本都有Update()会影响性能
    可以使用MonoMgr造就一个唯一的Update(),节约性能 :::

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.Events;
    5. /// <summary>
    6. /// Mono的管理者
    7. /// 1. 生命周期函数
    8. /// 2. 事件
    9. /// 3. 协程
    10. /// </summary>
    11. public class MonoController : MonoBehaviour
    12. {
    13. private event UnityAction updateEvent;
    14. void Start()
    15. {
    16. DontDestroyOnLoad(this.gameObject);
    17. }
    18. void Update()
    19. {
    20. if (updateEvent != null)
    21. updateEvent();
    22. }
    23. /// <summary>
    24. /// 给外部提供的 添加帧更新事件的函数
    25. /// </summary>
    26. /// <param name="fun"></param>
    27. public void AddUpdateListener(UnityAction fun)
    28. {
    29. updateEvent += fun;
    30. }
    31. /// <summary>
    32. /// 提供给外部 移除帧更新事件函数
    33. /// </summary>
    34. /// <param name="fun"></param>
    35. public void RemoveUpdateListener(UnityAction fun)
    36. {
    37. updateEvent -= fun;
    38. }
    39. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.Events;
    5. using UnityEngine.Internal;
    6. /// <summary>
    7. /// 可以提供给外部添加帧更新事件的方法
    8. /// 可以提供给外部添加协程的方法
    9. /// </summary>
    10. public class MonoMgr : BaseManager<MonoMgr>
    11. {
    12. public MonoController controller;
    13. public MonoMgr()
    14. {
    15. // 保证了MonoController对象的唯一性
    16. GameObject obj = new GameObject("MonoController");
    17. controller = obj.AddComponent<MonoController>();
    18. }
    19. /// <summary>
    20. /// 给外部提供的 添加帧更新事件的函数
    21. /// </summary>
    22. /// <param name="fun"></param>
    23. public void AddUpdateListener(UnityAction fun)
    24. {
    25. controller.AddUpdateListener(fun);
    26. }
    27. /// <summary>
    28. /// 提供给外部 移除帧更新事件函数
    29. /// </summary>
    30. /// <param name="fun"></param>
    31. public void RemoveUpdateListener(UnityAction fun)
    32. {
    33. controller.RemoveUpdateListener(fun);
    34. }
    35. public Coroutine StartCoroutine(IEnumerator routine)
    36. {
    37. return controller.StartCoroutine(routine);
    38. }
    39. public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
    40. {
    41. return controller.StartCoroutine(methodName, value);
    42. }
    43. // 通过函数名字符串开启协程的方法 只适用于开启Controller中的方法
    44. public Coroutine StartCoroutine(string methodName)
    45. {
    46. return controller.StartCoroutine(methodName);
    47. }
    48. // 同理可以封装停止协程的方法
    49. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class TestTest
    5. {
    6. public TestTest()
    7. {
    8. MonoMgr.GetInstance().StartCoroutine(Test123()); // 通过MonoMgr开启协程
    9. }
    10. IEnumerator Test123()
    11. {
    12. yield return new WaitForSeconds(1f);
    13. Debug.Log("123123123");
    14. }
    15. public void Update()
    16. {
    17. Debug.Log("TestTest");
    18. }
    19. }
    20. public class Test : MonoBehaviour
    21. {
    22. void Start()
    23. {
    24. TestTest t = new TestTest();
    25. MonoMgr.GetInstance().AddUpdateListener(t.Update);
    26. }
    27. }