公共Mono模块

作用

        让一个没有继承Mono的类可以进行Update更新,和开启协程 

MonoController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// Mono的管理者
/// 1.声明周期函数
/// 2.事件
/// 3.协程
/// </summary>
public class MonoController : MonoBehaviour
{

    private event UnityAction UpdateEvent;
    // Start is called before the first frame update
    void Start()
    {
        DontDestroyOnLoad(gameObject);
    }

    // Update is called once per frame
    void Update()
    {
        if (UpdateEvent != null)
        {
            UpdateEvent.Invoke();
        }
    }

    /// <summary>
    /// 给外部提供一个添加帧更新监听函数的接口
    /// </summary>
    /// <param name="fun"></param>
    public void AddUpdateListener(UnityAction fun)
    {
        UpdateEvent += fun;
    }

    /// <summary>
    /// 给外部提供一个移除帧更新监听函数的接口
    /// </summary>
    public void RemoveUpdateListener(UnityAction fun)
    {
        if(UpdateEvent != null)
        {
            UpdateEvent -= fun;
        }
    }


}

MonoManager

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 1.可以提供给外部添加帧更新的方法
/// 2.可以提供给外部添加协程的方法
/// </summary>
public class MonoManager : BaseManager<MonoManager>
{
    private MonoController monoController;

    public MonoManager()
    {
        GameObject obj = new GameObject("MonoController");
        monoController =  obj.AddComponent<MonoController>();
    }

    /// <summary>
    /// 对MonoController中添加帧更新事件监听函数的方法进行封装
    /// </summary>
    /// <param name="fun"></param>
    public void AddUpdateListener(UnityAction fun)
    {
        monoController.AddUpdateListener(fun);
    }

    /// <summary>
    ///  对MonoController中移除帧更新事件监听函数的方法进行封装
    /// </summary>
    public void RemoveUpdateListener(UnityAction fun)
    {
        monoController.RemoveUpdateListener(fun);
    }


    //开启协程以及开启协程的两个重载
    public Coroutine StartCoroutine(IEnumerator enumerator)
    {
        return monoController.StartCoroutine(enumerator);
    }

    public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
    {
        return monoController.StartCoroutine(methodName, value);
    }
    public Coroutine StartCoroutine(string methodName)
    {
        return monoController.StartCoroutine(methodName);
    }

    //关闭协程以及关闭协程的两个重载
    public void StopCoroutine(IEnumerator routine)
    {
        monoController.StopCoroutine(routine);
    }

    public void StopCoroutine(Coroutine routine)
    {
        monoController.StopCoroutine(routine);
    }
}

总结

       我们可以将这个公共的MonoManager造就一个唯一的Update,这样,很多的对象需要Update中执行的逻辑就可以放到这一个Update里面跑而不用每个对象都创建一个Update方法,可以节省一定的性能。 并且除了可以封装Update方法和协程之外,我们还可以添加更多的功能进去,例如计时器等等 

猜你喜欢

转载自blog.csdn.net/lqd201314/article/details/134595656