Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

147 рядки
4.0 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace CIG.Extensions
  6. {
  7. public static class ActionInvoker
  8. {
  9. public static void Invoke(this MonoBehaviour monoBehaviour, Action action, float time, bool realtime = false)
  10. {
  11. IEnumerator enumerator = ActionInvoker.InvokeCoroutine(action, time, realtime);
  12. if (ActionInvoker._invokeMethods.ContainsKey(action))
  13. {
  14. UnityEngine.Debug.LogWarningFormat("[ActionInvoker] Overriding enumerator for action '{0}'.", new object[]
  15. {
  16. ActionInvoker.GetMethodName(action)
  17. });
  18. ActionInvoker._invokeMethods[action] = enumerator;
  19. }
  20. else
  21. {
  22. ActionInvoker._invokeMethods.Add(action, enumerator);
  23. }
  24. monoBehaviour.StartCoroutine(enumerator);
  25. }
  26. public static void InvokeNextFrame(this MonoBehaviour monoBehaviour, Action action)
  27. {
  28. IEnumerator enumerator = ActionInvoker.InvokeCoroutine(action);
  29. if (ActionInvoker._invokeMethods.ContainsKey(action))
  30. {
  31. UnityEngine.Debug.LogWarningFormat("[ActionInvoker] Overriding enumerator for action '{0}'.", new object[]
  32. {
  33. ActionInvoker.GetMethodName(action)
  34. });
  35. ActionInvoker._invokeMethods[action] = enumerator;
  36. }
  37. else
  38. {
  39. ActionInvoker._invokeMethods.Add(action, enumerator);
  40. }
  41. monoBehaviour.StartCoroutine(enumerator);
  42. }
  43. public static void InvokeRepeating(this MonoBehaviour monoBehaviour, Action action, float time, float repeatRate, bool realtime = false)
  44. {
  45. IEnumerator enumerator = ActionInvoker.InvokeRepeatingCoroutine(action, time, repeatRate, realtime);
  46. if (ActionInvoker._invokeMethods.ContainsKey(action))
  47. {
  48. UnityEngine.Debug.LogWarningFormat("[ActionInvoker] Overriding enumerator for action '{0}'.", new object[]
  49. {
  50. ActionInvoker.GetMethodName(action)
  51. });
  52. ActionInvoker._invokeMethods[action] = enumerator;
  53. }
  54. else
  55. {
  56. ActionInvoker._invokeMethods.Add(action, enumerator);
  57. }
  58. monoBehaviour.StartCoroutine(enumerator);
  59. }
  60. public static bool IsInvoking(this MonoBehaviour monoBehaviour, Action action)
  61. {
  62. return ActionInvoker._invokeMethods.ContainsKey(action);
  63. }
  64. public static void CancelInvoke(this MonoBehaviour monoBehaviour, Action action)
  65. {
  66. if (ActionInvoker._invokeMethods.ContainsKey(action))
  67. {
  68. monoBehaviour.StopCoroutine(ActionInvoker._invokeMethods[action]);
  69. ActionInvoker._invokeMethods.Remove(action);
  70. }
  71. }
  72. private static string GetMethodName(Action action)
  73. {
  74. return action.Method.ToString();
  75. }
  76. private static IEnumerator InvokeCoroutine(Action action, float time, bool realtime)
  77. {
  78. if (realtime)
  79. {
  80. yield return new WaitForSecondsRealtime(time);
  81. }
  82. else
  83. {
  84. yield return new WaitForSeconds(time);
  85. }
  86. if (!ActionInvoker._invokeMethods.ContainsKey(action))
  87. {
  88. yield break;
  89. }
  90. ActionInvoker._invokeMethods.Remove(action);
  91. action();
  92. yield break;
  93. }
  94. private static IEnumerator InvokeCoroutine(Action action)
  95. {
  96. yield return null;
  97. if (!ActionInvoker._invokeMethods.ContainsKey(action))
  98. {
  99. yield break;
  100. }
  101. ActionInvoker._invokeMethods.Remove(action);
  102. action();
  103. yield break;
  104. }
  105. private static IEnumerator InvokeRepeatingCoroutine(Action action, float time, float repeatRate, bool realtime)
  106. {
  107. if (realtime)
  108. {
  109. yield return new WaitForSecondsRealtime(time);
  110. }
  111. else
  112. {
  113. yield return new WaitForSeconds(time);
  114. }
  115. if (!ActionInvoker._invokeMethods.ContainsKey(action))
  116. {
  117. yield break;
  118. }
  119. while (ActionInvoker._invokeMethods.ContainsKey(action))
  120. {
  121. action();
  122. if (realtime)
  123. {
  124. yield return new WaitForSecondsRealtime(time);
  125. }
  126. else
  127. {
  128. yield return new WaitForSeconds(repeatRate);
  129. }
  130. }
  131. yield break;
  132. yield break;
  133. }
  134. private static Dictionary<Action, IEnumerator> _invokeMethods = new Dictionary<Action, IEnumerator>();
  135. }
  136. }