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

相关文章

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程