美文网首页
Eevee框架7——Mono工具

Eevee框架7——Mono工具

作者: ShawnWeasley | 来源:发表于2020-08-21 09:14 被阅读0次

目前为止,我们已经有了单例、基于Mono的单例、对象池、事件系统四个轮子(工具),还需要继续造一些常用的工具。

一直以来主流的观点是能不继承MonoBehaviour就不要继承,有关这件事的讨论在这里比较详尽。

因此这里唐老师也是做了一个Mono类,来满足普通类的Update需求工具,本人稍作修改。

这里说个题外话,有很多人会在架构阶段就设计成除了一个Mono类,其他全都不继承Mono的极端想法,主要是为了考虑性能问题。个人觉得性能98%都是受美术的影响,而非程序,程序内部主要管控好:加载、实例化、不要在各种Update中调用太消耗性能的东西,循环中的操作不要太复杂,数学运算尽可能提高效率,避免运行时使用反射等,代码的效率优化就足够了。而非要为了不继承Mono,用一个类的Update来调用全局的类刷新,个人感觉就是在脱裤子放屁,毫无意义。



因此我们这里仅把Mono作为一个工具类,来弥补普通类无法Update的问题。
还是先看用法,很简单,添加一个监听,即可实现Update调用Log:

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

public class Main : MonoBehaviour
{
    private void Start()
    {
        //直接增加监听,参数也可以是个Action
        MonoUtil.Instance.AddUpdateListener(Log);
        //调用协程的案例
        MonoUtil.Instance.StartCoroutine(RemoveLogListener());
        //另外此处将常用的延迟执行功能,做成了一个简单函数调用方式
        MonoUtil.Instance.Delay(1, () => Debug.Log("Delay结束1"));
        MonoUtil.Instance.Delay(2, () => Debug.Log("Delay结束2"));
        MonoUtil.Instance.Delay(3, () => Debug.Log("Delay结束3"));
    }

    void Log()
    {
        Debug.Log("测试输出");
    }

    IEnumerator RemoveLogListener()
    {
        yield return new WaitForSeconds(1);
        MonoUtil.Instance.RemoveUpdateListener(Log);
        Debug.Log("测试结束");
    }
}

可以看到正确地调用到了Log函数和协程:


image.png

Mono工具类脚本如下(基于MonoSingleton):

using System;
using System.Collections;
using UnityEngine;

/// <summary>
/// Mono工具类
/// </summary>
public class MonoUtil : MonoSingleton<MonoUtil>
{
    /// <summary>
    /// 创建委托事件
    /// </summary>
    private event Action m_UpdateAction;

    void Start()
    {
        //不让该对象移除
        DontDestroyOnLoad(this.gameObject);
    }

    void Update()
    {
        if (m_UpdateAction != null)
            m_UpdateAction();
    }

    /// <summary>
    /// 添加帧更新监听
    /// </summary>
    /// <param name="func"></param>
    public void AddUpdateListener(Action action)
    {
        m_UpdateAction += action;
    }

    /// <summary>
    /// 移除帧更新监听
    /// </summary>
    /// <param name="func"></param>
    public void RemoveUpdateListener(Action action)
    {
        m_UpdateAction -= action;
    }

    /// <summary>
    /// 延迟几秒执行
    /// </summary>
    /// <param name="seconds">秒数</param>
    /// <param name="onFinished">回调</param>
    public void Delay(float seconds, Action action)
    {
        StartCoroutine(DelayCoroutine(seconds, action));
    }

    //延迟几秒回调协程
    private static IEnumerator DelayCoroutine(float seconds, Action action)
    {
        yield return new WaitForSeconds(seconds);
        action();
    }
}

相关文章

  • Eevee框架7——Mono工具

    目前为止,我们已经有了单例、基于Mono的单例、对象池、事件系统四个轮子(工具),还需要继续造一些常用的工具。 一...

  • Eevee框架3——Mono单例

    基于mono的单例视频里也讲过了,这里我们同样稍微改进一下:这是被调用的类 这是发起调用的类,非常简单,直接调用就...

  • Eevee框架10——UI框架

    想要一个完美的UI框架,貌似太理想了,这里参考了唐老师、siki等能百度到的很多UI框架,发现大家都只是做了界面的...

  • Eevee框架1——序

    一个多月来学了很多东西,想综合起来做一个自己的框架,那就从今天开始,构建一个自己用着趁手的框架吧。 其实凉鞋的QF...

  • 个人Three.js网页端项目展示

    Three.js网页端样例:鳄鱼:http://eevee.com.cn/Examples/7.Crocodile...

  • Eevee框架2——单例

    这里我们跟唐老师一样,先创建一个单例的基类,这样后续很多类都可以简单地实现单例。如果不了解单例的,唐老师的免费前几...

  • Eevee框架8——场景切换

    和对象池一样,本人场景切换用到的非常少(基本单场景搞定,因为个人感觉Unity自己加载第一个场景的速度,要远快于动...

  • Eevee框架11——Json处理

    本篇开始我们开始进行数据的处理,在数据处理、资源处理完成后,我们就进行框架整合。数据处理首先是我们常用的Json处...

  • Eevee框架5——命名规范

    做着做着发现命名规则有必要统一一下,至少我本人需要统一一下,不能再随意命名了。本篇会根据开发过程中发现的命名问题,...

  • Eevee框架4——对象池

    这里先简述一下对象池的目的以及什么情况下需要对象池: 将部分需要持续性复用的物体(或对象)以隐藏/修改位置等方式先...

网友评论

      本文标题:Eevee框架7——Mono工具

      本文链接:https://www.haomeiwen.com/subject/haxdjktx.html