Mono公共模块
在工作中开发项目时候,有些类是不继承MonoBehaviour 的,但是有些代码又需要每帧更新,在游戏运行的时候,多个update的执行,会增加性能的损耗,由此延伸出了Mono公共模块,让没有继承MonoBehaviour 的类也可以开启协程,可以进行Update更新,统一管理Update,能使用unity提供的脚本生命周期,减少性能的损耗;
泰课指路牌:https://www.taikr.com/course/1062/task/31006/show.
这个模块是用于给没有继承MonoBehavior的类可以执行帧更新函数Update(),统一管理Update,并且可以开启协程方法。 ————————————————
实现思想是在一个继承了MonoBehaviour的公共类里执行没有继承MonoBehaviour的类的事件委托对象,这样便实现了一个简单的帧更新。 知识点: 脚本的生命周期 协程 事件 单例模式基类
继承了MonoBehaviour 的公共类完整代码:
public class MonoController : MonoBehaviour
{
public event Action updateEvent;
private void Start()
{
DontDestroyOnLoad(this.gameObject);
}
private void Update()
{
if (updateEvent != null)
{
updateEvent();
}
}
public void AddUpdateListener(Action func)
{
updateEvent += func;
}
public void RemoveUpdateListener(Action func)
{
updateEvent -= func;
}
}
没继承MonoBehaviour 的类完整代码:
public class MonoMgr : SignleBaseManager<MonoMgr>
{
private MonoController mController;
public MonoMgr()
{
GameObject obj = new GameObject(typeof(MonoController).ToString());
mController = obj.AddComponent<MonoController>();
}
public void AddUpdateListener(Action func)
{
mController.AddUpdateListener(func);
}
public void RemoveUpdateListener(Action func)
{
mController.RemoveUpdateListener(func);
}
#region 协程相关接口封装
public Coroutine StartCoroutine(string methodName)
{
return mController.StartCoroutine(methodName);
}
public Coroutine StartCoroutine( IEnumerator routine)
{
return mController.StartCoroutine(routine);
}
public Coroutine StartCoroutine(string methodName,[DefaultValue("null")] object value)
{
return mController.StartCoroutine(methodName, value);
}
public void StopAllCoroutines()
{
mController.StopAllCoroutines();
}
public void StopCoroutine(IEnumerator routine)
{
mController.StopCoroutine(routine);
}
public void StopCoroutine(string methodName)
{
mController.StopCoroutine(methodName);
}
#endregion
}
测试代码:
public class TestMonoMgr : MonoBehaviour
{
void Start()
{
TestMono test = new TestMono();
MonoMgr.getInstance().AddUpdateListener(test.MonoUpdate);
}
}
public class TestMono
{
public TestMono()
{
MonoMgr.getInstance().StartCoroutine(TestCor());
}
IEnumerator TestCor()
{
yield return new WaitForSeconds(1f);
Debug.Log("协程-------------,");
}
public void MonoUpdate()
{
Debug.Log("此处用来测试不继承MonoBehaviour的帧更新");
}
}
|