Unity 应用消息中心-MessageCenter

 Ps:主要解决耦合问题,把脚本之间的联系通过不同消息类型事件形式进行贯通

1.MessageCenter主脚本

2.DelegateEvent消息类型脚本

3.MC_Default_Data具体接收类脚本

 

 

 

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

/// <summary>
/// 事件管理
/// </summary>
public class MessageCenter : Singleton<MessageCenter>
{
    // 消息委托
    public delegate void messageDelHandle(MessagDeta message);
    // 消息字典
    public Dictionary<MessageCenterEventType, messageDelHandle> messageMap = new Dictionary<MessageCenterEventType, messageDelHandle>();

    /// <summary>
    /// 注册监听
    /// </summary>
    public void RegisterListener(MessageCenterEventType messageType, messageDelHandle handle)
    {
        if (handle == null) return;

        // 把事件添加到对应的委托中
        messageDelHandle myHandle = null;
        messageMap.TryGetValue(messageType, out myHandle);

        if (myHandle != null)
        {
            Delegate[] HandleList = myHandle.GetInvocationList();

            foreach (messageDelHandle item in HandleList)
            {
                if (item == handle)
                {
                    Debug.LogError($"MessageCenter RegisterListener Type  ---  <color=yellow>{messageType.ToString()}</color>  ---  Has Registed Function  ---  <color=yellow>{handle.Method.Name}</color>  ---");
                    return;
                }
            }
        }

        messageMap[messageType] = (messageDelHandle)Delegate.Combine(myHandle, handle);
    }
    /// <summary>
    /// 移除监听
    /// </summary>
    public void RemoveListener(MessageCenterEventType messageType, messageDelHandle handle)
    {
        if (handle == null) return;
        messageMap[messageType] = (messageDelHandle)Delegate.Remove(messageMap[messageType], handle);
    }

    /// <summary>
    /// 清空消息
    /// </summary>
    public void Clear()
    {
        messageMap.Clear();
    }

    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="messageName">消息类型 </param>
    /// <param name="body"> 发送消息主体 </param>
    public void SendMessage(MessageCenterEventType messageType, object body = null)
    {

        messageDelHandle handle;
        if (messageMap.TryGetValue(messageType, out handle))
        {
            MessagDeta evt = new MessagDeta(messageType, body);
            try
            {
                if (handle != null)
                {
                    handle(evt);
                }
            }
            catch (System.Exception e)
            {
                Debug.Log($"SendMessage:::{evt.Type.ToString()}:::{e.Message}:::{e.StackTrace}:::{e}");
            }
        }

    }

    #region 枚举类型接口

    #region MessageType
    //public void RegisterListener(MessageCenterEventType messageType, messageDelHandle handle)
    //{
    //    RegisterListener(messageType, handle);
    //}
    //public void RemoveListener(MessageCenterEventType messageType, messageDelHandle handle)
    //{
    //    RemoveListener(messageType, handle);
    //}
    //public void SendMessage(MessageCenterEventType messageType, object body = null)
    //{
    //    SendMessage(messageType, body);
    //}
    #endregion


    #region BattleEvent
    //public void RegisterListener(BattleEvent messageType, messageDelHandle handle)
    //{
    //    RegisterListener((int)messageType, handle);
    //}
    //public void RemoveListener(BattleEvent messageType, messageDelHandle handle)
    //{
    //    RemoveListener((int)messageType, handle);
    //}
    //public void SendMessage(BattleEvent messageType, object body = null)
    //{
    //    SendMessage((int)messageType, body);
    //}
    #endregion


    #region ProtocolEvent
    //public void RegisterListener(ProtocolEvent messageType, messageDelHandle handle)
    //{
    //    RegisterListener((int)messageType, handle);
    //}
    //public void RemoveListener(ProtocolEvent messageType, messageDelHandle handle)
    //{
    //    RemoveListener((int)messageType, handle);
    //}
    //public void SendMessage(ProtocolEvent messageType, object body = null)
    //{
    //    SendMessage((int)messageType, body);
    //}

    #endregion

    #endregion

}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/// <summary>
/// 消息类
/// </summary>
public class MessagDeta
{
    public MessageCenterEventType Type  //发送的消息类型
    {
        get;
        private set;
    }
    public object Data  //消息主体
    {
        get;
        private set;
    }
    /// <summary>
    /// 方法
    /// </summary>
    public Action action;
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="type">消息类型</param>
    /// <param name="body">消息体</param>
    public MessagDeta(MessageCenterEventType type, object data,Action action_=null)
    {
        Type = type;
        Data = data;
        if (action_ != null)
        {
            action = action_;
        }
    }
}
/// <summary>
/// 用户事件类型,必须按照类型,顺序添加,合理命名规范
/// </summary>
public enum MessageCenterEventType
{
    /// <summary>
    /// UI消息号开始
    /// </summary>
    UI_Start = 100000,

    UI_Fence_ChangeCameraView = 100101, //围栏UI界面切换主相机视角
    /// <summary>
    /// 实体消息号开始
    /// </summary>
    Entity_Start = 200000,
    //可以自己添加类型,每个类型预留100000接口

    Ground_Wire=300000,//主接线图接地线
    Ground_Wire_ding_wei = 300001,//主接线图接地线定位

 
    Ti_shi_tong_yong = 400001,//通用提示
    /// <summary>
    /// 其他杂类接口
    /// </summary>
    Other_Start = 900000
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class MC_Int_Data
{
    public int _num;
}

public class MC_Uint_Data
{
    public uint _num;
}

public class MC_Long_Data
{
    public long _num;
}

public class MC_Ulong_Data
{
    public ulong _num;
}

public class MC_Shotr_Data
{
    public short _num;
}

public class MC_Ushotr_Data
{
    public ushort _num;
}

public class MC_Float_Data
{
    public float _num;
}

public class MC_Double_Data
{
    public double _num;
}

public class MC_String_Data
{
    public string _Str;
}

public class MC_Char_Data
{
    public char _char;
}

public class MC_Bool_Data
{
    public bool _flag;
}

public class MC_Object_Data
{
    public object _obj;
}
/// <summary>
/// 接地线控制
/// </summary>
public class Fan_Ground_Wire_Data
{
    public string id;//
    public bool active;//是否激活
    public Fan_Ground_Wire_Data()
    {

    }
    public Fan_Ground_Wire_Data(string ID,bool Active)
    {
        id = ID;
        active = Active;
    }
}
/// <summary>
/// 接地线定位
/// </summary>
public class Fan_Ground_Wire_go
{
    public string id;// 
    public Fan_Ground_Wire_go(string ID)
    {
        id = ID;
    }
}
/// <summary>
/// 提示通用
/// </summary>
public class Ti_shi_tong_yong_c
{
    public string content;// 
    public string text_icon;// 
    public Action action;
    public Ti_shi_tong_yong_c(string content_,string text_icon_, Action action_)
    {
        content = content_;
        text_icon = text_icon_;
        action = action_;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言的实战案例 SOCKS5 代理 | 青训营

Powered by:NEFU AB-IN 文章目录 Go 语言的实战案例 SOCKS5 代理 | 青训营 引入TCP echo serverauth 认证请求阶段relay阶段 Go 语言的实战案例 SOCKS5 代理 | 青训营 GO语言工程实践课后作业&#xff1a;实现思路、代码以及路径记录 引入 代理是指在计算机网络中&#xff…

Stable Diffusion web UI 部署详细教程

前言 本文使用 AutoDL 平台进行 Stable Diffusion web UI 云端部署 AutoDL 官网&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL Stable Diffusion web UI 官网&#xff1a;AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com) 步…

stm32之15.超声波与灯光功能一起实现(进阶)

主函数代码修改 --------------------- 源码 int main(void) {uint32_t t0;uint32_t distance;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);led_init();key_init();/* 初始化串口1波特率为115200bps&#xff0c;若发送/接收数据有乱码&#xff0c;请检查PLL */usart1_ini…

https 的ssl证书过期处理解决方案(lighthttpd)

更换证书&#xff1a;lighthttpd 配置文件位置&#xff1a;/opt/vmware/etc/lighttpd/lighttpd.conf &#xff08;配置文件的最底部 G快速来到底部&#xff09; 方案一&#xff1a;阿里云申请免费的证书 这里公司内网环境没有配置域名&#xff0c;可以创建一个临时域名&…

让大数据平台数据安全可见-行云管家

数字化经济在快速发展&#xff0c;大数据时代已经到来&#xff0c;大数据已经成为企业和政府决策的重要依据。然而大数据行业快速发展所带来的一系列安全问题也继续解决&#xff0c;例如数据安全更难保障&#xff0c;例如认证体系不完善等等。为此行云管家推出了大数据平台数据…

文心一言 VS 讯飞星火 VS chatgpt (81)-- 算法导论7.4 6题

六、如果用go语言&#xff0c;考虑对 PARTITION 过程做这样的修改:从数组 A 中随机选出三个元素&#xff0c;并用这三个元素的中位数(即这三个元素按大小排在中间的值)对数组进行划分。求以a 的函数形式表示的、最坏划分比例为 a:(1-a)的近似概率&#xff0c;其中 0<a<1。…

Qt --- 显示相关设置 窗口属性等

主界面&#xff0c;窗口 最小化 最大化 关闭按钮、显示状态自定义&#xff1a; setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::WindowCloseButtonHint); //只要关闭按钮 setWindowFlags(Qt::WindowFlags type) Qt::FrameWindowHint:没有边框的窗口 Qt::Window…

Jenkins的流水线详解

来源&#xff1a;u.kubeinfo.cn/ozoxBB 什么是流水线 声明式流水线 Jenkinsfile 的使用 什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线&#xff0c;脚本化流水线是 jenkins 旧版本使用的流水线脚本&#xff0c;新版本 Jenkins 推荐使用声明式流水线。…

如何理解原假设和备择假设?

原假设H0&#xff1a;一般是想要推翻的结论&#xff0c;如指标没有变化&#xff0c;实验组和对照组的该结果指标没有差异等。 备择假设H1&#xff1a;一般是想要证明的结论&#xff0c;如实验组的指标是显著提升的&#xff0c;指标提升10%等。 反证法的思想&#xff1a;因为假…

YOLOV1

YOU ONLY LOOK ONCE

KubeSphere 社区双周报 | Java functions framework 支持 SkyWalking | 2023.8.4-8.17

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.08.04-2023.…

已解决Gradle错误:“Unable to load class ‘org.gradle.api.plugins.MavenPlugin‘”

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

SpringBoot Cache

一、基本概念 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; • EHCache • Caffeine …

Android11.0 Launcher3单层app列表页排序功能实现

1.概述 在11.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了, 如图: 2. Launcher3 单层app列表页排序功能实现 packages\apps\Launcher3\src\…

java八股文面试[数据结构]——List和Set的区别

List和Set是用来存放集合的接口&#xff0c;并且二者都继承自接接口Collection List 中的元素存放是有序的&#xff0c;可以存放重复的元素&#xff0c;检索效率较高&#xff0c;插入删除效率较低。 Set 没有存放顺序不能存放重复元素检索效率较低&#xff0c;插入删除效率较…

Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理

一、前言 本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索&#xff0c;顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询&#xff0c;它把多个子查询组合成一个布尔表达式&#xff0c;这些…

2.文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(附matlab程序)

0.代码链接 1.简述 光热发电是大规模利用太阳能的新兴方式&#xff0c;其储热系 统能够调节光热电站的出力特性&#xff0c;进而缓解光热电站并网带来的火电机组调峰问题。合理配置光热电站储热容量&#xff0c;能够 有效降低火电机组调峰成本。该文提出一种光热电站储热容 量配…

linux安装部署gitlab全教程,包含配置中文

linux安装部署gitlab全教程&#xff0c;包含配置中文 大家好&#xff0c;我是酷酷的韩~ 1.前期准备 安装包下载地址 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 我这里选择的这个gitlab-ce-15.7.3-ce.0.el7.x86_64.rpm 还有一些相关依赖包(地址等审核过我放到…

IDEA远程开发

IDEA远程开发 前期准备 IDEA的远程开发是在本地去操昨远程服务器上的代码&#xff0c;所以我们先需要准备一台服务器,在此我使用vmware虚拟出ubuntu-20.04.6的Server版本,以便后面演示。 Ubuntu的Java环境配置 JDK8 sudo apt install openjdk-8-jdkmaven sudo apt instal…

三维模拟推演电子沙盘虚拟数字沙盘开发教程第13课

三维模拟推演电子沙盘虚拟数字沙盘开发教程第13课 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 在SDK中为了方便三方数据的接入&#xff0c;引入了一个用户层接口。主要是完成三方数据的接入&#xff0c;含动态数据&#xff08;如GPS&…