首页 学习日记正文

Unity公用Mono模块封装

阿沐 学习日记 2020-04-06 661 0 unity

Unity公用Mono模块封装

image.png

1、使用场景:

对一些没有继承MonoBehavior的类也能使用帧更新方法update和协程

2、实现原理:

    a、创建Mono公共基类继承MonoBehavior类

    b、创建不销毁的空物体挂载Mono公共基类,用以持久保存

    c、创建使用的Mono单例类,获取Mono公共基类的方法,重写添加/删除update事件和协程管理

3、代码实现:

Mono公共基类:继承MonoBehaviour

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使用的单例类:

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
}

测试:

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方法啊啊啊啊啊");
    }
}
public class GameStart : MonoBehaviour 
{

    void Start()
    {
        Test t = new Test();
        MonoMgr.GetInstance().addUpdateListener(t.Update);
    }
}

效果:

image.png

打赏

评论

Music