SEventManager.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.Collections.Generic;
  3. namespace SFramework{
  4. public static class SEventManager {
  5. public enum EVENT {
  6. BEGIN = 0,
  7. //UI_ACTIVE_WELCOME,
  8. //UI_ACTIVE_SETTING,
  9. //UI_ACTIVE_BUY,
  10. //IAP_DATA_READY,
  11. //IAP_PAY_SUCCESS,
  12. //IAP_PAY_FAILED,
  13. //ADS_PLAY_FINISH,
  14. //ADS_PLAY_SKIPPED,
  15. //ADS_PLAY_FAILED,
  16. //ADS_PLAY_CONTINUE,
  17. //HTTP_QUERY_RECORD_RESPOND,
  18. //HTTP_COMMIT_RECORD_SUCCESS,
  19. END,
  20. }
  21. public delegate void EventCallbackDelegate(EVENT ev, Object[] args);
  22. private static Dictionary<EVENT, EventCallbackDelegate> _dictEvents;
  23. private static List<EventCallbackDelegate> _lstGlobalEventCallback;
  24. private static List<Action> _lstActions;
  25. static SEventManager() {
  26. _lstGlobalEventCallback = new List<EventCallbackDelegate>() {DefaultEventCallback};
  27. _lstActions = new List<Action>();
  28. _dictEvents = new Dictionary<EVENT, EventCallbackDelegate>();
  29. for (EVENT ev = EVENT.BEGIN + 1; ev < EVENT.END; ++ev) {
  30. _dictEvents[ev] = new EventCallbackDelegate(DefaultEventCallback);
  31. }
  32. }
  33. public static void DestroyAllSceneEvent() {
  34. for (EVENT ev = EVENT.BEGIN + 1; ev < EVENT.END; ++ev) {
  35. foreach (Delegate i in _dictEvents[ev].GetInvocationList()) {
  36. if (!_lstGlobalEventCallback.Contains(i as EventCallbackDelegate)) {
  37. _dictEvents[ev] -= (i as EventCallbackDelegate);
  38. }
  39. }
  40. }
  41. }
  42. private static void DefaultEventCallback(EVENT ev, Object[] args) {
  43. }
  44. public static void RegisterGlobalEvent(EVENT ev, EventCallbackDelegate cb) {
  45. _lstActions.Add(() => {
  46. _lstGlobalEventCallback.Add(cb);
  47. _dictEvents[ev] += cb;
  48. });
  49. TryProcessActions();
  50. }
  51. public static void RegisterEvent(EVENT ev, EventCallbackDelegate cb) {
  52. _lstActions.Add(() => {
  53. _dictEvents[ev] += cb;
  54. });
  55. TryProcessActions();
  56. }
  57. public static void UnregisterEvent(EVENT ev, EventCallbackDelegate cb) {
  58. _lstActions.Add(() => {
  59. _dictEvents[ev] -= cb;
  60. _lstGlobalEventCallback.Remove(cb);
  61. });
  62. TryProcessActions();
  63. }
  64. private static void TryProcessActions() {
  65. if (_lstActions.Count > 1) {
  66. return;
  67. }
  68. while (_lstActions.Count > 0) {
  69. Action action = _lstActions[0];
  70. try {
  71. action();
  72. } catch (Exception e) {
  73. UnityEngine.Debug.LogError(String.Format("ProcessAction Error:" + e.StackTrace));
  74. } finally {
  75. UnityEngine.Debug.Assert(_lstActions[0] == action, "Action List Changed during Processing");
  76. _lstActions.RemoveAt(0);
  77. }
  78. }
  79. }
  80. private static void FireEventInternal(EVENT ev, Object[] args) {
  81. //UnityEngine.Debug.Log("FireEvent:" + ev.ToString());
  82. foreach (EventCallbackDelegate cb in _dictEvents[ev].GetInvocationList()) {
  83. try {
  84. cb(ev, args);
  85. } catch (Exception e) {
  86. UnityEngine.Debug.LogError(String.Format("ProcessEvent {0} Message:{1} Error:{2}", ev.ToString(), e.Message, e.StackTrace));
  87. }
  88. }
  89. }
  90. public static void FireEvent(EVENT ev, params object[] args) {
  91. //UnityEngine.Debug.Log("EventManager FireEvent -> Event.Name: " + ev.ToString() + " Length: " + args.Length.ToString());
  92. _lstActions.Add(()=> {
  93. FireEventInternal(ev, args);
  94. });
  95. TryProcessActions();
  96. }
  97. }
  98. }