unity UIForm框架的消息系統

消息中心

 

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

namespace UIFrame
{
    /// <summary>
    /// 消息(傳遞)中心
    /// 負責UI框架中,所有UI窗體間的數據傳值
    /// </summary>
    public class MessageCenter
    {
        // 定義一個委託. 觀察者模式
        public delegate void DelegateMessageDelivery(KeyValueUpdate kv);

        // 聲明委託實例. 消息中心緩存集合: 
        // string: 監聽的類型( 數據大的分類),
        // DelegateMessageDelivery: 監聽到以後要執行的委託
        public static Dictionary<string, DelegateMessageDelivery>  _dicMessages 
            = new Dictionary<string, DelegateMessageDelivery>();

        /// <summary>
        /// 增加委託指向的方法:監聽消息
        /// </summary>
        /// <param name="messageType">消息分類</param>
        /// <param name="handler">消息委託</param>
        public static void AddMsgListener(string messageType, DelegateMessageDelivery handler)
        {
            if (!_dicMessages.ContainsKey(messageType))
            {
                _dicMessages.Add(messageType, null);
            }
            _dicMessages[messageType] += handler;
        }

        /// <summary>
        /// 委託指向的方法:取消消息的監聽
        /// </summary>
        /// <param name="messageType"></param>
        /// <param name="handler"></param>
        public static void RemoveMsgListener(string messageType, DelegateMessageDelivery handler)
        {
            if (_dicMessages.ContainsKey(messageType))
            {
                _dicMessages[messageType] -= handler;
            }
        }


        /// <summary>
        /// 委託指向的方法:取消所有消息的監聽
        /// </summary>
        public static void RemoverAllMsgListener()
        {
            if (_dicMessages != null)
            {
                _dicMessages.Clear();
            }
        }


        /// <summary>
        /// 調用(執行)委託 (發送消息)
        /// </summary>
        /// <param name="messageType">消息的分類</param>
        /// <param name="kv">鍵值對(對象)</param>
        public static void SendMessage(string messageType, KeyValueUpdate kv)
        {
            DelegateMessageDelivery del;   // 實例化一個委託
            if (_dicMessages.TryGetValue(messageType, out del))
            {
                if (del != null)
                {
                    // 調用執行委託
                    del(kv);
                }
            }
        }

    }


    /// <summary>
    /// 鍵值對更新類
    /// 功能:配合委託,實現委託數據傳遞
    /// </summary>
    public class KeyValueUpdate
    {
        private string _Key;
        private object _Values;
        public string Key { get { return _Key; } }
        public object Values { get { return _Values; } }

        // 構造函數初始化字段
        public KeyValueUpdate(string key, object valueObj)
        {
            _Key = key;
            _Values = valueObj;
        }
    }


}

 

    /// 鍵值對更新類
    /// 功能:配合委託,實現委託數據傳遞

 

窗體基類封裝消息系統方法

  private void Awake()
        {

            if(MsgTypeName != "")
            {
                ReceiveMessage(MsgTypeName, ReceiveMsg);  //委託方法
                Debug.Log("註冊接收消息,消息類型“);
            }
        }

 

如何使用:

SendMessage("TimerScriber", "StartCountTimer");

”TimerScriber"是參數 messageType 即消息類型,

“StartCountTimer” 是參數 msgName 即消息名稱,

第三個參數消息內容 msgContent 這裏爲空Null。

 

 

    protected override void Initialization()
    {
        MsgTypeName = NAME;
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章