作用
让一个没有继承Mono的类可以进行Update更新,和开启协程
MonoController
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;
// Start is called before the first frame update
void Start()
{
DontDestroyOnLoad(gameObject);
}
// Update is called once per frame
void Update()
{
if (UpdateEvent != null)
{
UpdateEvent.Invoke();
}
}
/// <summary>
/// 给外部提供一个添加帧更新监听函数的接口
/// </summary>
/// <param name="fun"></param>
public void AddUpdateListener(UnityAction fun)
{
UpdateEvent += fun;
}
/// <summary>
/// 给外部提供一个移除帧更新监听函数的接口
/// </summary>
public void RemoveUpdateListener(UnityAction fun)
{
if(UpdateEvent != null)
{
UpdateEvent -= fun;
}
}
}
MonoManager
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 1.可以提供给外部添加帧更新的方法
/// 2.可以提供给外部添加协程的方法
/// </summary>
public class MonoManager : BaseManager<MonoManager>
{
private MonoController monoController;
public MonoManager()
{
GameObject obj = new GameObject("MonoController");
monoController = obj.AddComponent<MonoController>();
}
/// <summary>
/// 对MonoController中添加帧更新事件监听函数的方法进行封装
/// </summary>
/// <param name="fun"></param>
public void AddUpdateListener(UnityAction fun)
{
monoController.AddUpdateListener(fun);
}
/// <summary>
/// 对MonoController中移除帧更新事件监听函数的方法进行封装
/// </summary>
public void RemoveUpdateListener(UnityAction fun)
{
monoController.RemoveUpdateListener(fun);
}
//开启协程以及开启协程的两个重载
public Coroutine StartCoroutine(IEnumerator enumerator)
{
return monoController.StartCoroutine(enumerator);
}
public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
{
return monoController.StartCoroutine(methodName, value);
}
public Coroutine StartCoroutine(string methodName)
{
return monoController.StartCoroutine(methodName);
}
//关闭协程以及关闭协程的两个重载
public void StopCoroutine(IEnumerator routine)
{
monoController.StopCoroutine(routine);
}
public void StopCoroutine(Coroutine routine)
{
monoController.StopCoroutine(routine);
}
}
总结
我们可以将这个公共的MonoManager造就一个唯一的Update,这样,很多的对象需要Update中执行的逻辑就可以放到这一个Update里面跑而不用每个对象都创建一个Update方法,可以节省一定的性能。 并且除了可以封装Update方法和协程之外,我们还可以添加更多的功能进去,例如计时器等等