Unity公用Mono模块封装
1、使用场景:
对一些没有继承MonoBehavior的类也能使用帧更新方法update和协程
2、实现原理:
a、创建Mono公共基类继承MonoBehavior类
b、创建不销毁的空物体挂载Mono公共基类,用以持久保存
c、创建使用的Mono单例类,获取Mono公共基类的方法,重写添加/删除update事件和协程管理
3、代码实现:
Mono公共基类:继承MonoBehaviour
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class MonoController : MonoBehaviour { private event UnityAction updateEvent; void Start () { //设置MonoController不销毁 DontDestroyOnLoad(this.gameObject); } void Update () { if (updateEvent != null) updateEvent(); } /// <summary> /// 给外部添加update事件 /// </summary> public void addUpdateListener(UnityAction updateAction) { updateEvent += updateAction; } /// <summary> /// 外部移除update事件 /// </summary> public void removeUpdateListener(UnityAction updateAction) { updateEvent -= updateAction; } }
Mono使用的单例类:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class MonoMgr : SingletonBase<MonoMgr> { private MonoController controller; public MonoMgr() { //添加一个空物体,用来存放MonoController对象 GameObject obj = new GameObject("Mono"); controller=obj.AddComponent<MonoController>(); } #region 添加/删除 update 外部需要更新的事件 /// <summary> /// 添加update事件 /// </summary> public void addUpdateListener(UnityAction updateAction) { controller.addUpdateListener(updateAction); } /// <summary> /// 移除update事件 /// </summary> public void removeUpdateListener(UnityAction updateAction) { controller.removeUpdateListener(updateAction); } #endregion #region 协程管理 public Coroutine StartCoroutine(IEnumerator routine) { return controller.StartCoroutine(routine); } public Coroutine StartCoroutine(string methodName) { return controller.StartCoroutine(methodName); } public Coroutine StartCoroutine(string methodName, object value) { return controller.StartCoroutine(methodName,value); } public void StopCoroutine(Coroutine routine) { controller.StopCoroutine(routine); } public void StopCoroutine(IEnumerator routine) { controller.StopCoroutine(routine); } public void StopCoroutine(string methodName) { controller.StopCoroutine(methodName); } #endregion }
测试:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test { public Test() { MonoMgr.GetInstance().StartCoroutine(ts()); } public void Update() { Debug.Log("Test里的Update"); } IEnumerator ts() { yield return new WaitForSeconds(1f); Debug.Log("Test里的ts方法啊啊啊啊啊"); } }
public class GameStart : MonoBehaviour { void Start() { Test t = new Test(); MonoMgr.GetInstance().addUpdateListener(t.Update); } }
效果:
评论