首先我们先了解一下,为什么我们要引入公共Mono类。
在没有继承MonoBehaviour类的类中。我们是不能使用MonoBehaviour类中的一些功能的。比如说协程。那我们如果想在没有继承MonoBehaviour类的类中使用协程怎么办呢?这就需要我们引入公共Mono类。
公共Mono类的管理类
public class MonoMgr : SingletonBase<MonoMgr>
{
//公共Mono模块控制器
private MonoController controller;
public MonoMgr()
{
//通过单例模式构造函数在场景中创建唯一的公共Mono模块控制器
GameObject obj = new GameObject("MonoController");
controller = obj.AddComponent<MonoController>();
// Debug.Log("创建完成");
}
/// <summary>
/// 使用公共Mono模块添加帧更新函数
/// </summary>
/// <param name="fun">对应的每帧所需执行的方法</param>
public void AddUpdateListener(UnityAction fun)
{
//向公共Mono模块控制器中添加更新函数
controller.AddUpdateListener(fun);
}
/// <summary>
/// 使用公共Mono模块移除帧更新函数
/// </summary>
/// <param name="fun">对应的每帧所需执行的方法</param>
public void RemoveUpdateListener(UnityAction fun)
{
//向公共Mono模块控制器中移除更新函数
controller.RemoveUpdateListener(fun);
}
/// <summary>
/// 通过公共Mono模块开启协程
/// </summary>
/// <param name="fun">所需开启协程的迭代器</param>
#region 协程相关接口封装
public Coroutine StartCoroutine(string methodName)
{
return controller.StartCoroutine(methodName);
}
public Coroutine StartCoroutine(IEnumerator routine)
{
return controller.StartCoroutine(routine);
}
public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
{
return controller.StartCoroutine(methodName, value);
}
public void StopAllCoroutines()
{
controller.StopAllCoroutines();
}
public void StopCoroutine(IEnumerator routine)
{
controller.StopCoroutine(routine);
}
public void StopCoroutine(string methodName)
{
controller.StopCoroutine(methodName);
}
#endregion
}
公共Mono类的执行类
public class MonoController : MonoBehaviour
{
//存储需要每帧更新的方法们
private event UnityAction updateEvent;
void Start()
{
DontDestroyOnLoad(this.gameObject);
}
void Update()
{
if (updateEvent != null)
{
updateEvent();
}
}
//添加更新函数
public void AddUpdateListener(UnityAction fun)
{
updateEvent += fun;
}
//移除更新函数
public void RemoveUpdateListener(UnityAction fun)
{
updateEvent -= fun;
}
}