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_;
    }
}
相关推荐
B0URNE1 小时前
【Unity基础详解】(11)Unity核心:输入系统
unity·游戏引擎
世洋Blog3 小时前
Unity开发微信小游戏-减少WASM包体大小
unity·游戏引擎·wasm·微信小游戏
TO_ZRG4 小时前
Unity 通过 NativePlugin 接入Android SDK 指南
android·unity·游戏引擎
jtymyxmz7 小时前
《Unity Shader》10.2.1 镜子效果
unity·游戏引擎
ellis19707 小时前
Unity打开新项目Package相关报错处理记录
unity
微:xsooop8 小时前
iOS 上架4.3a 审核4.3a 被拒4.3a 【灾难来袭】
flutter·unity·ios·uniapp
微光守望者8 小时前
Unity ScriptableObject详解:优化游戏架构的强大工具
unity·游戏引擎
jtymyxmz9 小时前
《Unity Shader》10.2.2 玻璃效果
unity·游戏引擎
zxc24460393412 小时前
gpu instancer crowd 动画使用方式
unity
C MIKE13 小时前
unity资源下载
unity