Unity 游戏框架搭建 2019 (四十九) 关于发送事件的简单封装

2024-05-06 12:58

本文主要是介绍Unity 游戏框架搭建 2019 (四十九) 关于发送事件的简单封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇,我们在 MonoBehaviourSimplify 中集成了消息功能。而在做消息功能的过程中,又接触了对象池实现了一个非常简单版本。

今天呢我们在接着学习。

我们先回顾下 MonoBehaviourSimplify 中关于消息功能的使用方法。

注册消息,直接用 RegisterMsg,而注销则在 OnDestroy 的时候统一进行注销。
那么单独注销时候怎么办呢?这是第一个问题。

第二个问题是,发送消息,我们使用的是 MsgDispatcher.Send 这个方法。
和我们的注册消息的方法不是统一的。这是第二个问题。

第一个问题

第一个问题解决很简单,只要增加针对一个消息注销的方法就好了。
代码如下:

public partial class MonoBehaviourSimplify
{protected void UnRegisterMsg(string msgName){var selectedRecords = mMsgRecorder.FindAll(recorder => recorder.Name == msgName);selectedRecords.ForEach(selectRecord =>{MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);mMsgRecorder.Remove(selectRecord);selectRecord.Recycle();});selectedRecords.Clear();}protected void UnRegisterMsg(string msgName, Action<object> onMsgReceived){var selectedRecords = mMsgRecorder.FindAll(recorder => recorder.Name == msgName && recorder.OnMsgReceived == onMsgReceived);selectedRecords.ForEach(selectRecord =>{MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);mMsgRecorder.Remove(selectRecord);selectRecord.Recycle();});selectedRecords.Clear();}
}

FindAll 是一个查询方法,在 mMsgRecorder 内查询出所有符合条件的项。代码没有太大的难度。

不过在使用上要注意一下,如果是要重复注册并且需要注销的消息,最好是用成员方法来接收,而不是用委托接收,原因是如果是单独注销这类消息的时候,最好是用上边代码的第二种注销方法,用第一种的话,可能把当前脚本之前注册的同名消息都会注销掉。不过这是极少数的情况,一般笔者些项目根本用不到单独注销,而是全部交给了 OnDestroy 处理。

这样第一个问题算是解决了

接下来是我们第二个问题。

第二个问题:

第二个问题是 API 不统一的问题。这个问题要解决起来很简单。只要实现一个 Send 方法就好了,而 Send 中主要逻辑有 MsgDispatcher.Send 完成。

代码如下:

protected void SendMsg(string msgName, object data)
{MsgDispatcher.Send(msgName, data);
}

到此呢,我们的 API 就统一了。而第十四个示例也就算 OK 了。

全部代码如下:

using System;
using UnityEngine;namespace QFramework
{public partial class MonoBehaviourSimplify{protected void UnRegisterMsg(string msgName){var selectedRecords = mMsgRecorder.FindAll(recorder => recorder.Name == msgName);selectedRecords.ForEach(selectRecord =>{MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);mMsgRecorder.Remove(selectRecord);});selectedRecords.Clear();}protected void UnRegisterMsg(string msgName, Action<object> onMsgReceived){var selectedRecords = mMsgRecorder.FindAll(recorder =>recorder.Name == msgName && recorder.OnMsgReceived == onMsgReceived);selectedRecords.ForEach(selectRecord =>{MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);mMsgRecorder.Remove(selectRecord);});selectedRecords.Clear();}protected void SendMsg(string msgName, object data){MsgDispatcher.Send(msgName, data);}}public class UnifyAPIStyle : MonoBehaviourSimplify{
#if UNITY_EDITOR[UnityEditor.MenuItem("QFramework/14.统一 API 风格", false, 14)]private static void MenuClicked(){UnityEditor.EditorApplication.isPlaying = true;new GameObject("MsgReceiverObj").AddComponent<UnifyAPIStyle>();}
#endifprivate void Awake(){RegisterMsg("OK", data =>{Debug.Log(data);UnRegisterMsg("OK");});    }private void Start(){SendMsg("OK","hello");SendMsg("OK","hello");   }protected override void OnBeforeDestroy(){}}
}

示例代码很简单,执行的结果如下图所示:
006tNc79gy1fzft6bnqe4j30wa0a8759.jpg

菜单栏如下图:
006tNc79gy1fzft6ektrqj30ke0hiwtf.jpg

目录如下图:
006tNc79gy1fzft6ir1uej30ie0ekmzc.jpg

这样我们的第十四个示例就完成了,可以进行一次导出了。

今天的内容就这些,我们下一篇再见,拜拜~

转载请注明地址:凉鞋的笔记:liangxiegame.com

更多内容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 进阶小班

    • 主要训练内容:
      • 框架搭建训练(第一年)
      • 跟着案例学 Shader(第一年)
      • 副业的孵化(第二年、第三年)
    • 权益、授课形式等具体详情请查看《小班产品手册》:https://liangxiegame.com/master/intro
  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

这篇关于Unity 游戏框架搭建 2019 (四十九) 关于发送事件的简单封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964418

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构