【unity基础框架】公共Mono模块控制器

文章介绍了如何通过MonoMgr和MonoController两个类来实现非继承自MonoBehaviour的类也能在Update中调用方法和启动协程。MonoController作为MonoBehaviour的代理,存储和执行Update事件,而MonoMgr则提供了添加、移除Update监听和启动、停止协程的接口。
摘要由CSDN通过智能技术生成

mono模块就是让不继承MonoBehaviour的类的方法能在update里调用,或者调用协程等。

废话不多说,上代码!

monoMgr:

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

public class MonoMgr : BaseManager<MonoMgr>
{


    //公共Mono模块控制器
    private MonoController controller;

    public MonoMgr()
    {

        //通过单例模式构造函数在场景中创建唯一的公共Mono模块控制器
        GameObject obj = new GameObject("MonoController"); 
        controller = obj.AddComponent<MonoController>();
      //  Debug.Log("创建完成");
    }

    /// <summary>
    /// 使用公共Mono模块添加帧更新函数
    /// </summary>
    /// <param name="fun">对应的每帧所需执行的方法</param>
    public void AddUpdateListener(UnityAction fun)
    {
        //向公共Mono模块控制器中添加更新函数
        controller.AddUpdateListener(fun);
    }

    /// <summary>
    /// 使用公共Mono模块移除帧更新函数
    /// </summary>
    /// <param name="fun">对应的每帧所需执行的方法</param>
    public void RemoveUpdateListener(UnityAction fun)
    {
        //向公共Mono模块控制器中移除更新函数
        controller.RemoveUpdateListener(fun);
    }

    /// <summary>
    /// 通过公共Mono模块开启协程
    /// </summary>
    /// <param name="fun">所需开启协程的迭代器</param>

    #region  协程相关接口封装
    public Coroutine StartCoroutine(string methodName)
    {
        return controller.StartCoroutine(methodName);
    }
    public Coroutine StartCoroutine(IEnumerator routine)
    {
        Debug.Log("异步加载");
        return controller.StartCoroutine(routine);
    }
    public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value)
    {
        return controller.StartCoroutine(methodName, value);
    }
    public void StopAllCoroutines()
    {
        controller.StopAllCoroutines();
    }
    public void StopCoroutine(IEnumerator routine)
    {
        controller.StopCoroutine(routine);
    }
    public void StopCoroutine(string methodName)
    {
        controller.StopCoroutine(methodName);
    }
    #endregion


}

 monoController:

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

public class MonoController :MonoBehaviour
{
    //无参委托,存储需要每帧更新的方法们
    private  event UnityAction updateEvent;

    void Start()
    {
        
        //过场景不销毁
        DontDestroyOnLoad(this.gameObject);
    }

    void Update()
    {
        if (updateEvent != null)
        {
            //不为空则执行
            updateEvent();
        }
    }

    //添加更新函数
    public  void AddUpdateListener(UnityAction fun)
    {
        updateEvent += fun;
    }

    //移除更新函数,注意适时调用以防止内存泄漏
    public  void RemoveUpdateListener(UnityAction fun)
    {
        updateEvent -= fun;
    }

}

monoController:核心为unity事件,用来包装核心方法,并继承MonoBehaviour

AddUpdateListener添加事件
RemoveUpdateListener移除事件

monoMgr:包装monoController

AddUpdateListener添加update事件
RemoveUpdateListener移除update事件
StartCoroutine启动协程
StopAllCoroutines停止全部协程
StopCoroutine停止协程

 测试:

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

public class MonoTest : MonoBehaviour
{
    // Start is called before the first frame update

    void Start()
    {
        MonoTest2 monoTest2 = new MonoTest2();
        MonoMgr.GetInstance().AddUpdateListener(monoTest2.UpdateFun);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
public class MonoTest2 
{
    private bool isGo = false;
    public void UpdateFun()
    {
        if (!isGo)
        {
            isGo = true;
            Debug.Log("monotest通过");
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值