zoukankan      html  css  js  c++  java
  • 事件中心(可用于不同模块间的通信,用于解耦)

    单例模式

    using UnityEngine;
    using System.Collections;

    namespace SingleTonBase
    {
    public class SingleTonBase<T> where T : new()
    {

    private static T _instance;
    public static T GetInstance()
    {
    if (_instance == null)
    _instance = new T();
    return _instance;
    }


    }
    public class SingleTonBehaviorBase<T> : MonoBehaviour where T : MonoBehaviour
    {
    private static T _instance;
    public static T GetInstance()
    {
    _instance = GameObject.FindObjectOfType<T>();
    if (_instance == null)
    {
    GameObject goObj = new GameObject(typeof(T).ToString());
    _instance = goObj.AddComponent<T>();
    }
    return _instance;
    }
    }
    }

    消息中心 用于注册消息

    using UnityEngine;
    using System.Collections;

    namespace Message
    {
    public class MessageConst
    {
    public static readonly string MESSAGE_TEST = "TEST";

    }
    }

    事件中心,用于注册分发事件,传递消息

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

    public class NotificationCentre : SingleTonBehaviorBase<NotificationCentre>
    {

    public delegate void MessageDelegate(params object[] obj);
    private Dictionary<string, MessageDelegate> _messageCache = new Dictionary<string, MessageDelegate>();

    /// <summary>
    /// 订阅消息
    /// </summary>
    /// <param name="messageKey">消息的关键字</param>
    /// <param name="md">消息的委托函数</param>
    public void RegisterMessage(string messageKey,MessageDelegate md)
    {
    if (_messageCache.ContainsKey(messageKey))
    {
    Debug.LogError("Don`t register again!!!");
    return;
    }
    _messageCache.Add(messageKey,md);
    }
    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="messageKey">消息关键字</param>
    public void SendMessage(string messageKey)
    {
    SendMessage(messageKey,null);
    }
    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="messageKey">消息关键字</param>
    /// <param name="messageContent">消息内容</param>
    public void SendMessage(string messageKey, params object[] messageContent)
    {
    if (!_messageCache.ContainsKey(messageKey))
    {
    Debug.LogError("The " + messageKey + "not be registered");
    return;
    }
    _messageCache[messageKey](messageContent);
    }

    public void RemoveMessage(string messageKey)
    {
    if (_messageCache.ContainsKey(messageKey))
    _messageCache.Remove(messageKey);
    }

    //public void RemoveMessage(MessageDelegate md)
    //{
    // if (_messageCache.ContainsValue(md))
    // // _messageCache.Remove();
    //}
    }

    测试脚本

    using UnityEngine;
    using System.Collections;
    using Message;
    public class TestNotification : MonoBehaviour {

    void Awake()
    {
    //订阅
    NotificationCentre.GetInstance().RegisterMessage(MessageConst.MESSAGE_TEST, AcceptMessage);
    }

    void AcceptMessage(params object[] message)
    {
    Debug.Log(message[0]);
    Debug.Log(message[1]);
    }

    void Start () {
    NotificationCentre.GetInstance().SendMessage(MessageConst.MESSAGE_TEST,"Hello Message",this.gameObject);
    }
    void OnDestroy()
    {
    NotificationCentre.GetInstance().RemoveMessage(MessageConst.MESSAGE_TEST);
    }

    }

  • 相关阅读:
    黑马程序员-block代码块和protocol协议
    黑马程序员-内存管理之autorelease和ARC机制
    黑马程序员-内存管理之set方法内存管理, property参数,循环引用。
    黑马程序员-内存管理之引用计数器
    黑马程序员-构造方法
    黑马程序员-@property,@synthesize使用细节和id
    黑马程序员—OC点语法和成员变量作用域
    黑马程序员-c语言指针的学习
    黑马程序员-OC基本语法
    NSSearchPathForDirectoriesInDomains用法 (转)
  • 原文地址:https://www.cnblogs.com/FingerCaster/p/7591305.html
Copyright © 2011-2022 走看看