mono模块就是让不继承MonoBehaviour的类的方法能在update里调用,或者调用协程等。
废话不多说,上代码!
monoMgr:
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;
public class MonoMgr : BaseManager<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)
{
Debug.Log("异步加载");
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
}
monoController:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
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;
}
}
monoController:核心为unity事件,用来包装核心方法,并继承MonoBehaviour
AddUpdateListener | 添加事件 |
RemoveUpdateListener | 移除事件 |
monoMgr:包装monoController
AddUpdateListener | 添加update事件 |
RemoveUpdateListener | 移除update事件 |
StartCoroutine | 启动协程 |
StopAllCoroutines | 停止全部协程 |
StopCoroutine | 停止协程 |
测试:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonoTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
MonoTest2 monoTest2 = new MonoTest2();
MonoMgr.GetInstance().AddUpdateListener(monoTest2.UpdateFun);
}
// Update is called once per frame
void Update()
{
}
}
public class MonoTest2
{
private bool isGo = false;
public void UpdateFun()
{
if (!isGo)
{
isGo = true;
Debug.Log("monotest通过");
}
}
}