- 知识点: 过场景不移除
- 作用: 让没有继承Mono的类可以开启协程, 可以Update更新, 统一管理Update
:::tips
不同脚本都有Update()会影响性能
可以使用MonoMgr造就一个唯一的Update(),节约性能
:::
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Events;/// <summary>/// Mono的管理者/// 1. 生命周期函数/// 2. 事件/// 3. 协程/// </summary>public class MonoController : MonoBehaviour{private event UnityAction updateEvent;void Start(){DontDestroyOnLoad(this.gameObject);}void Update(){if (updateEvent != null)updateEvent();}/// <summary>/// 给外部提供的 添加帧更新事件的函数/// </summary>/// <param name="fun"></param>public void AddUpdateListener(UnityAction fun){updateEvent += fun;}/// <summary>/// 提供给外部 移除帧更新事件函数/// </summary>/// <param name="fun"></param>public void RemoveUpdateListener(UnityAction fun){updateEvent -= fun;}}
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Events;using UnityEngine.Internal;/// <summary>/// 可以提供给外部添加帧更新事件的方法/// 可以提供给外部添加协程的方法/// </summary>public class MonoMgr : BaseManager<MonoMgr>{public MonoController controller;public MonoMgr(){// 保证了MonoController对象的唯一性GameObject obj = new GameObject("MonoController");controller = obj.AddComponent<MonoController>();}/// <summary>/// 给外部提供的 添加帧更新事件的函数/// </summary>/// <param name="fun"></param>public void AddUpdateListener(UnityAction fun){controller.AddUpdateListener(fun);}/// <summary>/// 提供给外部 移除帧更新事件函数/// </summary>/// <param name="fun"></param>public void RemoveUpdateListener(UnityAction fun){controller.RemoveUpdateListener(fun);}public Coroutine StartCoroutine(IEnumerator routine){return controller.StartCoroutine(routine);}public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value){return controller.StartCoroutine(methodName, value);}// 通过函数名字符串开启协程的方法 只适用于开启Controller中的方法public Coroutine StartCoroutine(string methodName){return controller.StartCoroutine(methodName);}// 同理可以封装停止协程的方法}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class TestTest{public TestTest(){MonoMgr.GetInstance().StartCoroutine(Test123()); // 通过MonoMgr开启协程}IEnumerator Test123(){yield return new WaitForSeconds(1f);Debug.Log("123123123");}public void Update(){Debug.Log("TestTest");}}public class Test : MonoBehaviour{void Start(){TestTest t = new TestTest();MonoMgr.GetInstance().AddUpdateListener(t.Update);}}
