Advertisement
Guest User

Untitled

a guest
Dec 26th, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.81 KB | None | 0 0
  1. // TeaTimer v0.1
  2. // Unity MonoBehaviour Extension Set for a quick coroutine callback timer.
  3. //
  4. // #author Andrés Villalobos
  5. // #contact andresalvivar@gmail.com > twitter.com/matnesis
  6. // #created 2014/12/26 12:21 am
  7. //
  8. // #usage In any MonoBehaviour:
  9. //
  10. // #1 ttAppend - Appends a timed task into a queue to be executed in order.
  11. // this.ttAppend(2, () => Debug.Log(Time.time)); // prints 2
  12. // this.ttAppend(1, () => Debug.Log(Time.time)); // prints 3
  13. //
  14. // #2 ttInsert - Executes a timed task.
  15. // this.ttInsert(2, () => Debug.Log(Time.time)); // prints 2
  16. // this.ttInsert(1, () => Debug.Log(Time.time)); // prints 1
  17. //
  18. // #3 A more complex example.
  19. // this.ttAppend(1, () =>
  20. // {
  21. // Debug.Log(Time.time); // prints 1
  22. // }).ttInsert(1, () =>
  23. // {
  24. // Debug.Log(Time.time); // prints 1
  25. // }).ttAppend(0, () =>
  26. // {
  27. // Debug.Log(Time.time); // prints 1
  28. // });
  29.  
  30.  
  31. using System;
  32. using System.Collections;
  33. using System.Collections.Generic;
  34. using UnityEngine;
  35.  
  36.  
  37. /// <summary>
  38. /// Timed task data.
  39. /// </summary>
  40. public class TeaTask
  41. {
  42. public float atTime = 0;
  43. public YieldInstruction atYield = null;
  44. public Action callback = null;
  45.  
  46.  
  47. public TeaTask(float atTime, Action callback)
  48. {
  49. this.atTime = atTime;
  50. this.callback = callback;
  51. }
  52.  
  53.  
  54. public TeaTask(YieldInstruction atYield, Action callback)
  55. {
  56. this.atYield = atYield;
  57. this.callback = callback;
  58. }
  59. }
  60.  
  61.  
  62. /// <summary>
  63. /// MonoBehaviour Extension Set for a quick coroutine callback timer.
  64. /// </summary>
  65. public static class TeaTimer
  66. {
  67. public static Dictionary<MonoBehaviour, List<TeaTask>> queue;
  68. public static List<MonoBehaviour> currentlyRunning;
  69.  
  70.  
  71. /// <summary>
  72. /// Appends a timed task into a queue to be executed in order.
  73. /// </summary>
  74. /// <param name="instance"></param>
  75. /// <param name="atTime"></param>
  76. /// <param name="callback"></param>
  77. /// <returns></returns>
  78. public static MonoBehaviour ttAppend(this MonoBehaviour instance, float atTime, Action callback)
  79. {
  80. // Create dictionary
  81. if (queue == null)
  82. queue = new Dictionary<MonoBehaviour, List<TeaTask>>();
  83.  
  84. // Create key and value
  85. if (!queue.ContainsKey(instance))
  86. queue.Add(instance, new List<TeaTask>());
  87.  
  88. // Append
  89. List<TeaTask> taskList = queue[instance];
  90. taskList.Add(new TeaTask(atTime, callback));
  91.  
  92. // Execute queue
  93. instance.StartCoroutine(ExecuteQueue(instance));
  94.  
  95. return instance;
  96. }
  97.  
  98.  
  99. /// <summary>
  100. /// Appends a timed task into a queue to be executed in order.
  101. /// </summary>
  102. /// <param name="instance"></param>
  103. /// <param name="atYield"></param>
  104. /// <param name="callback"></param>
  105. /// <returns></returns>
  106. public static MonoBehaviour ttAppend(this MonoBehaviour instance, YieldInstruction atYield, Action callback)
  107. {
  108. // Create dictionary
  109. if (queue == null)
  110. queue = new Dictionary<MonoBehaviour, List<TeaTask>>();
  111.  
  112. // Create key and value
  113. if (!queue.ContainsKey(instance))
  114. queue.Add(instance, new List<TeaTask>());
  115.  
  116. // Append
  117. List<TeaTask> taskList = queue[instance];
  118. taskList.Add(new TeaTask(atYield, callback));
  119.  
  120. // Execute queue
  121. instance.StartCoroutine(ExecuteQueue(instance));
  122.  
  123. return instance;
  124. }
  125.  
  126.  
  127. /// <summary>
  128. /// Executes a timed task.
  129. /// </summary>
  130. /// <param name="instance"></param>
  131. /// <param name="atTime"></param>
  132. /// <param name="callback"></param>
  133. /// <returns></returns>
  134. public static MonoBehaviour ttInsert(this MonoBehaviour instance, float atTime, Action callback)
  135. {
  136. // Create dictionary
  137. if (queue == null)
  138. queue = new Dictionary<MonoBehaviour, List<TeaTask>>();
  139.  
  140. // Create key and value
  141. if (!queue.ContainsKey(instance))
  142. queue.Add(instance, new List<TeaTask>());
  143.  
  144. // Executes now
  145. instance.StartCoroutine(ExecuteOnce(atTime, null, callback));
  146.  
  147. return instance;
  148. }
  149.  
  150.  
  151. /// <summary>
  152. /// Executes a timed task.
  153. /// </summary>
  154. /// <param name="instance"></param>
  155. /// <param name="atYield"></param>
  156. /// <param name="callback"></param>
  157. /// <returns></returns>
  158. public static MonoBehaviour ttInsert(this MonoBehaviour instance, YieldInstruction atYield, Action callback)
  159. {
  160. // Create dictionary
  161. if (queue == null)
  162. queue = new Dictionary<MonoBehaviour, List<TeaTask>>();
  163.  
  164. // Create key and value
  165. if (!queue.ContainsKey(instance))
  166. queue.Add(instance, new List<TeaTask>());
  167.  
  168. // Executes now
  169. instance.StartCoroutine(ExecuteOnce(0, atYield, callback));
  170.  
  171. return instance;
  172. }
  173.  
  174.  
  175. /// <summary>
  176. /// Clear all queued callbacks.
  177. /// </summary>
  178. /// <param name="instance"></param>
  179. /// <returns></returns>
  180. private static MonoBehaviour ttClear(this MonoBehaviour instance)
  181. {
  182. // Ignore empty
  183. if (queue.ContainsKey(instance) == false)
  184. return instance;
  185.  
  186. // Clone list
  187. queue[instance].Clear();
  188.  
  189. return instance;
  190. }
  191.  
  192.  
  193. /// <summary>
  194. /// Execute all queued tasks for the instance.
  195. /// </summary>
  196. /// <param name="instance"></param>
  197. /// <returns></returns>
  198. private static IEnumerator ExecuteQueue(MonoBehaviour instance)
  199. {
  200. // Ignore empty
  201. if (queue.ContainsKey(instance) == false)
  202. yield break;
  203.  
  204. // Create runners list
  205. if (currentlyRunning == null)
  206. currentlyRunning = new List<MonoBehaviour>();
  207.  
  208. // Ignore if already running
  209. if (currentlyRunning.Contains(instance))
  210. yield break;
  211.  
  212. // Run a clone list of tasks until depleted
  213. List<TeaTask> batch = new List<TeaTask>();
  214. batch.AddRange(queue[instance]);
  215.  
  216. currentlyRunning.Add(instance);
  217. foreach (TeaTask c in batch)
  218. {
  219. // execute & remove tasks
  220. yield return instance.StartCoroutine(ExecuteOnce(c.atTime, c.atYield, c.callback));
  221. queue[instance].Remove(c);
  222. }
  223. currentlyRunning.Remove(instance);
  224.  
  225. // Try again is there are new items
  226. if (queue[instance].Count > 0)
  227. instance.StartCoroutine(ExecuteQueue(instance));
  228. }
  229.  
  230.  
  231. /// <summary>
  232. /// Executes a timed coroutine.
  233. /// </summary>
  234. /// <param name="atTime"></param>
  235. /// <param name="atYield"></param>
  236. /// <param name="callback"></param>
  237. /// <returns></returns>
  238. private static IEnumerator ExecuteOnce(float atTime, YieldInstruction atYield, Action callback)
  239. {
  240. // Wait until
  241. if (atTime > 0)
  242. yield return new WaitForSeconds(atTime);
  243.  
  244. if (atYield != null)
  245. yield return atYield;
  246.  
  247. // Task
  248. if (callback != null)
  249. callback();
  250. }
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement