Unity公用Mono模块封装
1、使用场景:
对一些没有继承MonoBehavior的类也能使用帧更新方法update和协程
2、实现原理:
a、创建Mono公共基类继承MonoBehavior类
b、创建不销毁的空物体挂载Mono公共基类,用以持久保存
c、创建使用的Mono单例类,获取Mono公共基类的方法,重写添加/删除update事件和协程管理
3、代码实现:
Mono公共基类:继承MonoBehaviour
C#
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使用的单例类:
C#
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
}
测试:
C#
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方法啊啊啊啊啊");
}
}
C#
public class GameStart : MonoBehaviour
{
void Start()
{
Test t = new Test();
MonoMgr.GetInstance().addUpdateListener(t.Update);
}
}
效果:
评论