Unity 应用消息中心-MessageCenter

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

1.MessageCenter主脚本

2.DelegateEvent消息类型脚本

3.MC_Default_Data具体接收类脚本

cs 复制代码
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

}
cs 复制代码
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
}
cs 复制代码
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_;
    }
}
相关推荐
X_StarX7 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
霸王•吕布11 小时前
游戏引擎中顶点着色&像素着色
游戏引擎·顶点着色器·像素着色器·顶点颜色·顶点uv·顶点法向
Thomas_YXQ14 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
徐子竣21 小时前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤1 天前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
与火星的孩子对话1 天前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
幻世界1 天前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
漫游者Nova2 天前
虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕
ue5·游戏引擎·虚幻·游戏开发完整教程·恐怖游戏开发
死也不注释2 天前
【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】
unity·编辑器·游戏引擎
小赖同学啊2 天前
物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
物联网·unity·游戏引擎