F3DTime.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. public class F3DTime : MonoBehaviour
  6. {
  7. public static F3DTime time;
  8. // Timer objects
  9. List<Timer> timers;
  10. // Timer removal queue
  11. List<int> removalPending;
  12. private int idCounter;
  13. /// <summary>
  14. /// Timer entity class
  15. /// </summary>
  16. class Timer
  17. {
  18. public int id;
  19. public bool isActive;
  20. public float rate;
  21. public int ticks;
  22. public int ticksElapsed;
  23. public float last;
  24. public Action callBack;
  25. public Timer(int id_, float rate_, int ticks_, Action callback_)
  26. {
  27. id = id_;
  28. rate = rate_ < 0 ? 0 : rate_;
  29. ticks = ticks_ < 0 ? 0 : ticks_;
  30. callBack = callback_;
  31. last = 0;
  32. ticksElapsed = 0;
  33. isActive = true;
  34. }
  35. public void Tick()
  36. {
  37. last += Time.deltaTime;
  38. if (isActive && last >= rate)
  39. {
  40. last = 0;
  41. ticksElapsed++;
  42. callBack.Invoke();
  43. if (ticks > 0 && ticks == ticksElapsed)
  44. {
  45. isActive = false;
  46. F3DTime.time.RemoveTimer(id);
  47. }
  48. }
  49. }
  50. }
  51. /// <summary>
  52. /// Awake
  53. /// </summary>
  54. void Awake()
  55. {
  56. time = this;
  57. timers = new List<Timer>();
  58. removalPending = new List<int>();
  59. }
  60. /// <summary>
  61. /// Creates new timer
  62. /// </summary>
  63. /// <param name="rate">Tick rate</param>
  64. /// <param name="callBack">Callback method</param>
  65. /// <returns>Time GUID</returns>
  66. public int AddTimer(float rate, Action callBack)
  67. {
  68. return AddTimer(rate, 0, callBack);
  69. }
  70. /// <summary>
  71. /// Creates new timer
  72. /// </summary>
  73. /// <param name="rate">Tick rate</param>
  74. /// <param name="ticks">Number of ticks before timer removal</param>
  75. /// <param name="callBack">Callback method</param>
  76. /// <returns>Timer GUID</returns>
  77. public int AddTimer(float rate, int ticks, Action callBack)
  78. {
  79. Timer newTimer = new Timer(++idCounter, rate, ticks, callBack);
  80. timers.Add(newTimer);
  81. return newTimer.id;
  82. }
  83. /// <summary>
  84. /// Removes timer
  85. /// </summary>
  86. /// <param name="timerId">Timer GUID</param>
  87. public void RemoveTimer(int timerId) { removalPending.Add(timerId); }
  88. /// <summary>
  89. /// Timer removal queue handler
  90. /// </summary>
  91. void Remove()
  92. {
  93. if (removalPending.Count > 0)
  94. {
  95. foreach (int id in removalPending)
  96. for (int i = 0; i < timers.Count; i++)
  97. if (timers[i].id == id)
  98. {
  99. timers.RemoveAt(i);
  100. break;
  101. }
  102. removalPending.Clear();
  103. }
  104. }
  105. /// <summary>
  106. /// Updates timers
  107. /// </summary>
  108. void Tick()
  109. {
  110. for (int i = 0; i < timers.Count; i++)
  111. timers[i].Tick();
  112. }
  113. // Update is called once per frame
  114. void Update()
  115. {
  116. Remove();
  117. Tick();
  118. }
  119. }