Недостатки
1. Нужен Unirx, хоть он и бесплатен.
2. Непонятно кто вызывает Update в Timer, ведь Timer не MonoBehaviour. Возможно это делает Unirx, хотя по описанию этого плагина такого не скажешь.
3. Если Это все же MonoBehaviour, то при большом количестве таймеров получим много Update, что плохо.
Достоинства - прост.
Приведу свой таймер.
Сам таймер.
Код
public class Timer
{
private float __timer;
private bool __start;
private int __currentCount;
private readonly float __time;
private readonly Action __actTick;
private readonly Action __actEnd;
private int __count;
private readonly bool __delete;
public Timer(float delay, int repeatCount, Action actionTick, Action actionEnd = null, bool autostart = false, bool autodelete = false)
{
__actTick = actionTick;
__actEnd = actionEnd;
__time = delay;
__count = repeatCount;
__timer = 0;
__delete = autodelete;
if(autostart) Start();
}
public void Start()
{
__currentCount = __count;
__start = true;
}
public void Stop() { __start = false; }
public bool Tick()
{
if(!__start) return false;
__timer += Time.deltaTime;
if (__timer < __time) return false;
if(__actTick != null) __actTick.Invoke();
__currentCount--;
if(__currentCount != 0) return false;
if (__actEnd != null) __actEnd.Invoke();
__start = false;
return __delete;
}
}
Таймер-менеджер
Код
public class TimerManager : MonoBehaviour
{
private static readonly List<Timer> __timers = new List<Timer>();
public void Update()
{
foreach (var timer in __timers)
{
if (timer.Tick()) __timers.Remove(timer);
}
}
public static Timer AddTimer(float delay, int repeatCount, Action actionTick, bool autostart = false, bool autodelete = false, Action actionEnd = null)
{
var timer = new Timer(delay, repeatCount, actionTick, actionEnd, autostart, autodelete);
__timers.Add(timer);
return timer;
}
public static void StartTimer(Timer timer)
{
if(!__timers.Contains(timer)) __timers.Add(timer);
timer.Start();
}
public static void StopTimer(Timer timer, bool delete = false)
{
if (!__timers.Contains(timer)) return;
timer.Stop();
if (delete) __timers.Remove(timer);
}
}
1. Ничего дополнительного не нужно.
2. Update один - в менеджере.
Создаем таймер через TimerManager.AddTimer
Можно задать количество срабатываний таймера.
Можно вызывать действие каждое срабатывание и дополнительно после последнего срабатывания
Можно указать автостарт при создании, можно сначала создать а запустить потом.
Можно указать автоудаление таймера после последнего срабатывания
Можно приостановить таймер.
Можно при приостановке таймера его автоматически удалить.