4 using System.Collections.Generic;
35 private struct TimerData
37 public Callback Callback;
38 public float Duration;
42 public TimerData(
float time, Callback callback,
bool loop,
int id)
51 private struct TimerIdPair
57 public delegate
void Callback();
60 private List<TimerData> deferredTimers;
61 private List<TimerIdPair> activeTimers;
62 private int nextTimerId;
69 deferredTimers =
new List<TimerData>(10);
70 activeTimers =
new List<TimerIdPair>(20);
75 private int GetKeyTime(
float time)
78 return (
int)(time * 1000);
81 private bool HasKeyTimePassed(
int key)
83 return key <= GetKeyTime(Time.time);
86 private int AddTimer(TimerData timer,
bool deferred =
false)
90 deferredTimers.Add(timer);
95 int keyTime = GetKeyTime(Time.time + timer.Duration);
98 timers.
Push(keyTime, timer);
101 activeTimers.Add(
new TimerIdPair { Id = timer.Id, KeyTime = keyTime });
110 private int GetActiveTimerIndex(
int timerId)
112 for (
int i = 0; i < activeTimers.Count; ++i)
114 if (activeTimers[i].Id == timerId)
123 private bool RemoveActiveTimer(
int timerId)
125 int index = GetActiveTimerIndex(timerId);
128 activeTimers.RemoveAt(index);
135 private int GetTimerDeferredIndex(
int timerId)
137 for (
int i = 0; i < deferredTimers.Count; ++i)
139 if (deferredTimers[i].Id == timerId)
148 private void AddDeferredTimers()
150 for (
int i = 0; i < deferredTimers.Count; i++)
152 AddTimer(deferredTimers[i]);
155 deferredTimers.Clear();
158 private void Update()
161 while (timers.
Count > 0 && HasKeyTimePassed(timers.
Top.Key))
163 TimerData timer = timers.
Top.Value;
166 RemoveActiveTimer(timer.Id);
186 if (timers.
Count == 0)
199 public Timer StartTimer(
float timeSeconds, Callback callback,
bool loop =
false,
bool deferred =
false)
201 int id = AddTimer(
new TimerData(timeSeconds, callback, loop, nextTimerId++), deferred);
204 return new Timer(
id);
216 int index = GetActiveTimerIndex(timerId.
Id);
219 int priority = activeTimers[index].KeyTime;
220 activeTimers.RemoveAt(index);
229 int deferredIndex = GetTimerDeferredIndex(timerId.
Id);
230 if (deferredIndex > -1)
232 deferredTimers.RemoveAt(deferredIndex);
240 return GetActiveTimerIndex(timerId.
Id) > -1 || GetTimerDeferredIndex(timerId.
Id) > -1;