Unity设计模式04_公共Mono模块

整理自:Bilibili-唐老湿的Unity程序基础框架

1.使用目的
为了使不继承MonoBehaviour的类也可以使用Update、协程等

2.主要思路

Update实现: 创建一个继承自MonoBehaviour的mono类,定义一个Event,在Update里面调用这个Event,给外部提供添加委托的函数(+=),这样添加的函数就可以在mono类中的Update进行帧更新了。

封装成“单例”:但上面这样做并不能保证只能实例化一次,为了保证只能实例化一次mono,我们需要再新建一个MonoManager类继承自单例模式,在内部声明一个私有的mono成员变量,在MonoManager的构造函数中创建一个空物体,将mono类挂载(AddComponent)到该空物体上面,赋值给内部成员变量mono,这样,由于MonoManager为单例,构造函数只被调用一次,保证了mono也只被实例化一次。

协程:在MonoManager中向外部提供一个public函数,然后在函数内部调用成员变量mono的开启携程函数、关闭携程函数等方法,因为mono是继承自MonoBehaviour,所以自然携带这些方法。

3.代码

3.1.继承自MonoBehavior的mono负责提供MonoBehavior方法:

public class Mono : MonoBehaviour
{

    private void Start()
    {
        DontDestroyOnLoad(this.gameObject);
    }
    private event UnityAction UpdateEvent;
    void Update()
    {
        if(UpdateEvent != null)
        { 
           UpdateEvent();
        }
    }
    public void AddUpdateAction(UnityAction action)
    {
        UpdateEvent += action;
    }
    public void RemoveUpdateAction(UnityAction action)
    {
        UpdateEvent -= action;
    }
    
}

3.2.继承自单例的MonoManager负责封装mono使其只实例化一次,通过调用Mono的携带的方法使外部未继承MonoBehavior的方法能够使用Update、协程:

/// <summary>
/// 通过调用Mono所拥有的MonoBehavior为外部提供Update、协程等(将mono做成“单例”)
/// </summary>
public class MonoManager : SingeCaseBase<MonoManager>
{

    private Mono mono;
    /// <summary>
    /// [注意]构造MonoManager:实例化一个mono,因为此处MonoManager为单例,保证了Mono只有一次实例
    /// </summary>
    public MonoManager()
    {
        GameObject MonoHolder = new GameObject("MonoHolder");
         mono = MonoHolder.AddComponent<Mono>();
    }
    public void AddUpdateAction(UnityAction action)
    {
        if (mono)
        {
            mono.AddUpdateAction(action);
        }
    }
    public void RemoveUpdateAction(UnityAction action)
    {
        if(mono)
        { 
            mono.RemoveUpdateAction(action);
        }
    }
    public Coroutine StartCoroutine(string methodName)
    {
            return  mono.StartCoroutine(methodName);
    }
    public void StopCoroutine(IEnumerator routine)
    {
           mono.StopCoroutine(routine);
    }
    public Coroutine StartCoroutine(IEnumerator routine)
    {
        return mono.StartCoroutine(routine);
    }

}

3.测试

class TestAgain
{
    public TestAgain()
    {
        MonoManager.GetInstance().AddUpdateAction(TestMethod);
    }
    void TestMethod()
    {
        Debug.Log("Test Working!");
    }
}

public class Test : MonoBehaviour
{
    private void Start()
    {
        TestAgain test = new TestAgain();
    }
}

结果截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值