作用:让没有继承MONO的类可以开启协程,可以update更新,可以统一管理update
MonoController
脚本继承MonoBehaviour
使得脚本过场不移除,并通过UnityAction可以添加多个函数(多播委托),实现Update更新以及统一管理。
/// <summary>
/// Mono的管理者
/// 1.声明周期函数
/// 2.事件
/// 3.协程
/// </summary>
public class MonoController : MonoBehaviour {
private event UnityAction updateEvent;
// Use this for initialization
void Start () {
DontDestroyOnLoad(this.gameObject);
}
// Update is called once per frame
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;
}
}
MonoMgr
通过单例模式给外部提供添加帧更新事件、添加协程的管理。
/// <summary>
/// 1.可以提供给外部添加帧更新事件的方法
/// 2.可以提供给外部添加 协程的方法
/// </summary>
public class MonoMgr : Singleton<MonoMgr>
{
private 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);
}
public Coroutine StartCoroutine(string methodName)
{
return controller.StartCoroutine(methodName);
}
}
- 编写测试脚本,将脚本挂载到游戏物体上。
public class myTest
{
public myTest(){
MonoMgr.GetInstance().StartCoroutine(Start());
}
public void Update()
{
Debug.Log("更新了!");
}
IEnumerator Start()
{
yield return new WaitForSeconds(1f);
Debug.Log("协程执行了!");
}
}
public class MonoTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
myTest test = new myTest();
MonoMgr.GetInstance().AddUpdateListener(test.Update);
}
}