作用
让没有继承Mono的类也可以开启协程,可以进行Update更新,统一管理Update
单例模式基类
MonoController.CS
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// Mono的管理者
/// 1.声明周期函数
/// 2.事件
/// 3.协程
/// </summary>
public class MonoController : MonoBehaviour
{
public event UnityAction updateEvent;
void Start()
{
DontDestroyOnLoad(this.gameObject);
}
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.cs
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;
public class MonoMgr : BaseMgr<MonoMgr>
{
private MonoController controller;
public MonoMgr()
{
//保证了MonoController对象的唯一性(单例模式只有在为空时才会new一次 MonoMgr()构造函数也只会new一次)
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);
}
#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(Coroutine routine)
{
controller.StopCoroutine(routine);
}
public void StopCoroutine(string methodName)
{
controller.StopCoroutine(methodName);
}
#endregion
}
测试
测试脚本:Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test1
{
public void Update()
{
Debug.Log("testtesttest");
}
public Test1()
{
//开启协程
MonoMgr.instance.StartCoroutine(Test123());
}
IEnumerator Test123()
{
yield return new WaitForSeconds(1f);
Debug.Log("Test123");
}
}
public class Test : MonoBehaviour
{
void Start()
{
Test1 t = new Test1();
MonoMgr.instance.AddUpdateListener(t.Update);
}
}
在没有继承MonoBehaviour的Test1类中一样可以实现update帧更新和开启协程。