代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 公共Mono模块管理器
/// </summary>
public class MonoMgr : SingletonAutoMono<MonoMgr>
{
private event UnityAction updateEvent;
private event UnityAction fixedUpdateEvent;
private event UnityAction lateUpdateEvent;
/// <summary>
/// 添加update帧更新监听函数
/// </summary>
/// <param name="updateFun"></param>
public void AddUpdateListener(UnityAction updateFun)
{
updateEvent += updateFun;
}
/// <summary>
/// 移除update帧更新监听函数
/// </summary>
/// <param name="updateFun"></param>
public void RemoveUpdateListener(UnityAction updateFun)
{
updateEvent -= updateFun;
}
public void AddFixedUpdateListener(UnityAction updateFun)
{
fixedUpdateEvent += updateFun;
}
public void RemoveFixedUpdateListener(UnityAction updateFun)
{
fixedUpdateEvent -= updateFun;
}
public void AddLateUpdateListener(UnityAction updateFun)
{
lateUpdateEvent += updateFun;
}
public void RemoveLateUpdateListener(UnityAction updateFun)
{
lateUpdateEvent -= updateFun;
}
private void Update()
{
updateEvent?.Invoke();
}
private void FixedUpdate()
{
fixedUpdateEvent?.Invoke();
}
private void LateUpdate()
{
lateUpdateEvent?.Invoke();
}
}
用法1
通常我们在unity编写C#代码的时候,并不想让所有程序都继承MonoBehaviour,而这时候又想使用unity的帧更新,这样就可以通过这个Mono管理器去将自己想要实现功能在Unity的生命周期中实现。
这样避免了若是在游戏开发中,随着内容的变大,交互变多,大量使用Update等等造成的卡顿,性能消耗等问题。可以将游戏中所有的生命周期函数,只放在一个类似Main的脚本中即可。
用法2
当我们在不继承MonoBehaviour的脚本中想实现协同程序时,可以通过MonoMgr.Instance.StartCoroutine(协同程序)开启和MonoMgr.Instance.StopCoroutine(协同程序)关闭协程。