using System.Collections.Generic; using UnityEngine; namespace DragonBones { /** * @inheritDoc */ public class UnityEventDispatcher : MonoBehaviour, IEventDispatcher { private readonly Dictionary> _listeners = new Dictionary>(); /** * @private */ public UnityEventDispatcher() { } /** * @inheritDoc */ public void DispatchEvent(string type, T eventObject) { if (!_listeners.ContainsKey(type)) { return; } else { _listeners[type](type, eventObject); } } /** * @inheritDoc */ public bool HasEventListener(string type) { return _listeners.ContainsKey(type); } /** * @inheritDoc */ public void AddEventListener(string type, ListenerDelegate listener) { if (_listeners.ContainsKey(type)) { var delegates = _listeners[type].GetInvocationList(); for (int i = 0, l = delegates.Length; i < l; ++i) { if (listener == delegates[i] as ListenerDelegate) { return; } } _listeners[type] += listener; } else { _listeners.Add(type, listener); } } /** * @inheritDoc */ public void RemoveEventListener(string type, ListenerDelegate listener) { if (!_listeners.ContainsKey(type)) { return; } var delegates = _listeners[type].GetInvocationList(); for (int i = 0, l = delegates.Length; i < l; ++i) { if (listener == delegates[i] as ListenerDelegate) { _listeners[type] -= listener; break; } } if (_listeners[type] == null) { _listeners.Remove(type); } } /// /// /// public void RemoveAllEventListener() { List keysList = new List(); keysList.AddRange(_listeners.Keys); for (int j = keysList.Count - 1; j >= 0; j--) { string type = keysList[j]; var delegates = _listeners[type].GetInvocationList(); //Debug.LogError("length:" + delegates.Length); for (int i = 0, l = delegates.Length; i < l; ++i) { //Debug.LogError("length:" + delegates.Length); //Debug.LogError("remove:" + i); ListenerDelegate listener = delegates[i] as ListenerDelegate; RemoveEventListener(type, listener); } } } } }