zoukankan      html  css  js  c++  java
  • 消息分发机制,实现战场与UI通信功能

    1.首先是单例模式通用类

    using UnityEngine;

    public class Singleton<T> where T : new()
    {
    protected static T _Instance = default(T);

    public static T Instance
    {
    get
    {
    if (_Instance == null)
    {
    _Instance = new T();
    }
    return _Instance;
    }
    }
    }

    public class SingletonMonobehaviour<T> : MonoBehaviour where T : SingletonMonobehaviour<T>
    {
    private static T _Instance;

    public static T Instance
    {
    get
    {
    if (_Instance == null)
    {
    _Instance = (T)GameObject.FindObjectOfType(typeof(T));
    if (_Instance == null)
    {
    GameObject instanceObject = new GameObject(typeof(T).Name);
    _Instance = instanceObject.AddComponent<T>();
    }
    _Instance.OnInstance();
    }
    return _Instance;
    }
    }
    public virtual void OnInstance()
    { }
    }

    2// 全局消息派发机制管理器
    public class EventDispatchManager : Singleton<EventDispatchManager>
    {
    private readonly EventDispatcher m_globalDispatcher = new EventDispatcher();

    public void AddGlobalEvent(NtfMessageTypeEnum typeEnum, EventDispatcher.FuncCallback func)
    {
    m_globalDispatcher.AddEvent(typeEnum, func);
    }

    public void RemoveGlobalEvent(NtfMessageTypeEnum typeEnum, EventDispatcher.FuncCallback func)
    {
    m_globalDispatcher.RemoveEvent(typeEnum, func);
    }

    public void DispatchGlobalMessage(NtfMessageTypeEnum typeEnum, params object[] args)
    {
    m_globalDispatcher.DispatchMessage(typeEnum, args);
    }
    }

    3

    // 消息派发器,如果有需要小范围的派发,就自己new一个用就好了
    public class EventDispatcher
    {
    public delegate void FuncCallback(NtfMessageTypeEnum typeEnum, params object[] args);

    private NtfMessageTypeEnum m_typeEnum = NtfMessageTypeEnum.None;
    private Dictionary<NtfMessageTypeEnum, List<FuncCallback>> m_functionDictionary = new Dictionary<NtfMessageTypeEnum, List<FuncCallback>>();
    private Dictionary<NtfMessageTypeEnum, List<FuncCallback>> m_tempDictionary = new Dictionary<NtfMessageTypeEnum, List<FuncCallback>>();

    // 注册消息
    public void AddEvent(NtfMessageTypeEnum typeEnum, FuncCallback function)
    {
    if (!m_functionDictionary.ContainsKey(typeEnum))
    {
    m_functionDictionary.Add(typeEnum, new List<FuncCallback>());
    }
    m_functionDictionary[typeEnum].Add(function);
    }

    // 删除消息
    public void RemoveEvent(NtfMessageTypeEnum typeEnum, FuncCallback function)
    {
    if (m_functionDictionary.ContainsKey(typeEnum))
    {
    // 如果当前要删除的消息正好是正在派发的消息类型,为了避免迭代器失效,先保存至临时空间,等该条消息派发完毕再删除
    if (typeEnum == m_typeEnum)
    {
    if (!m_tempDictionary.ContainsKey(typeEnum))
    m_functionDictionary[typeEnum] = new List<FuncCallback>();
    m_tempDictionary[typeEnum].Add(function);
    }
    else
    {
    m_functionDictionary[typeEnum].Remove(function);
    if (m_functionDictionary[typeEnum].Count == 0)
    m_functionDictionary.Remove(typeEnum);
    }
    }
    }

    // 消息派发
    // 仅限unity单线程这么使用,如果是多线程的情况,该方法不支持
    public void DispatchMessage(NtfMessageTypeEnum typeEnum, params object[] args)
    {
    m_typeEnum = typeEnum;
    if (m_functionDictionary.ContainsKey(typeEnum) && m_functionDictionary[typeEnum].Count > 0)
    {
    foreach (var function in m_functionDictionary[typeEnum])
    {
    try
    {
    function(typeEnum, args);
    }
    catch (Exception e)
    {
    Debug.LogError("Error in dispatching message: " + e.Message);
    }
    }
    }

    // 本次派发结束之后,删除临时消息
    if (m_tempDictionary.ContainsKey(typeEnum))
    {
    foreach (var function in m_tempDictionary[typeEnum])
    {
    if (m_functionDictionary.ContainsKey(typeEnum))
    {
    m_functionDictionary[typeEnum].Remove(function);
    if (m_functionDictionary[typeEnum].Count == 0)
    m_functionDictionary.Remove(typeEnum);
    }
    }
    m_tempDictionary.Remove(typeEnum);
    }

    m_typeEnum = NtfMessageTypeEnum.None;
    }
    }

  • 相关阅读:
    CSS hack:区分IE6,IE7,firefox
    十句CSS学习顺口溜
    div css表单布局的五个小技巧
    最常用的10种CSS BUG解决方法与技巧浏览器兼容教程
    最全的CSS浏览器兼容问题
    10款浏览器CSS Reset的方法
    [MySQL技巧]INSERT … ON DUPLICATE KEY UPDATE(转)
    新手写css常犯的8个错误
    如何在页面中插入播放器
    NicTeX 网络数学公式可视化编辑器
  • 原文地址:https://www.cnblogs.com/xwwFrank/p/6889186.html
Copyright © 2011-2022 走看看