程序框架-公共MONO模块
作用:让没有继承MONO的类可以开启协程,可以update更新,可以统一管理update
MonoController
脚本继承MonoBehaviour
使得脚本过场不移除,并通过UnityAction可以添加多个函数(多播委托),实现Update更新以及统一管理。
/// <summary>
/// Mono的管理者
/// 1.声明周期函数
/// 2.事件
/// 3.协程
/// </summary>
public class MonoController : MonoBehaviour {private event UnityAction updateEvent;// Use this for initializationvoid Start () {DontDestroyOnLoad(this.gameObject);}// Update is called once per framevoid 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 updatevoid Start(){myTest test = new myTest();MonoMgr.GetInstance().AddUpdateListener(test.Update);}
}