- 知识点: 过场景不移除
- 作用: 让没有继承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);
}
}