using System; using System.Collections.Generic; namespace SFramework{ public static class SEventManager { public enum EVENT { BEGIN = 0, //UI_ACTIVE_WELCOME, //UI_ACTIVE_SETTING, //UI_ACTIVE_BUY, //IAP_DATA_READY, //IAP_PAY_SUCCESS, //IAP_PAY_FAILED, //ADS_PLAY_FINISH, //ADS_PLAY_SKIPPED, //ADS_PLAY_FAILED, //ADS_PLAY_CONTINUE, //HTTP_QUERY_RECORD_RESPOND, //HTTP_COMMIT_RECORD_SUCCESS, END, } public delegate void EventCallbackDelegate(EVENT ev, Object[] args); private static Dictionary _dictEvents; private static List _lstGlobalEventCallback; private static List _lstActions; static SEventManager() { _lstGlobalEventCallback = new List() {DefaultEventCallback}; _lstActions = new List(); _dictEvents = new Dictionary(); for (EVENT ev = EVENT.BEGIN + 1; ev < EVENT.END; ++ev) { _dictEvents[ev] = new EventCallbackDelegate(DefaultEventCallback); } } public static void DestroyAllSceneEvent() { for (EVENT ev = EVENT.BEGIN + 1; ev < EVENT.END; ++ev) { foreach (Delegate i in _dictEvents[ev].GetInvocationList()) { if (!_lstGlobalEventCallback.Contains(i as EventCallbackDelegate)) { _dictEvents[ev] -= (i as EventCallbackDelegate); } } } } private static void DefaultEventCallback(EVENT ev, Object[] args) { } public static void RegisterGlobalEvent(EVENT ev, EventCallbackDelegate cb) { _lstActions.Add(() => { _lstGlobalEventCallback.Add(cb); _dictEvents[ev] += cb; }); TryProcessActions(); } public static void RegisterEvent(EVENT ev, EventCallbackDelegate cb) { _lstActions.Add(() => { _dictEvents[ev] += cb; }); TryProcessActions(); } public static void UnregisterEvent(EVENT ev, EventCallbackDelegate cb) { _lstActions.Add(() => { _dictEvents[ev] -= cb; _lstGlobalEventCallback.Remove(cb); }); TryProcessActions(); } private static void TryProcessActions() { if (_lstActions.Count > 1) { return; } while (_lstActions.Count > 0) { Action action = _lstActions[0]; try { action(); } catch (Exception e) { UnityEngine.Debug.LogError(String.Format("ProcessAction Error:" + e.StackTrace)); } finally { UnityEngine.Debug.Assert(_lstActions[0] == action, "Action List Changed during Processing"); _lstActions.RemoveAt(0); } } } private static void FireEventInternal(EVENT ev, Object[] args) { //UnityEngine.Debug.Log("FireEvent:" + ev.ToString()); foreach (EventCallbackDelegate cb in _dictEvents[ev].GetInvocationList()) { try { cb(ev, args); } catch (Exception e) { UnityEngine.Debug.LogError(String.Format("ProcessEvent {0} Message:{1} Error:{2}", ev.ToString(), e.Message, e.StackTrace)); } } } public static void FireEvent(EVENT ev, params object[] args) { //UnityEngine.Debug.Log("EventManager FireEvent -> Event.Name: " + ev.ToString() + " Length: " + args.Length.ToString()); _lstActions.Add(()=> { FireEventInternal(ev, args); }); TryProcessActions(); } } }