using System.Collections.Generic; using System.Linq; using UnityEngine; namespace JNGame.Runtime.Util { public delegate void TimerCallback(); public class TimerInfo { public TimerCallback Callback { get; set; } public float Interval { get; set; } public int Repeat { get; set; } public float RunTime = 0; public bool IsRunSuccess { get; private set; } = false; public void Update(float dt) { if (IsRunSuccess) return; RunTime += dt; if (RunTime >= Interval) { RunTime = 0; Callback?.Invoke(); if (Repeat > 0) { Repeat -= 1; } if (Repeat == 0) IsRunSuccess = true; } } } public class Timers : SingletonScene { private List timers = new List(); public TimerInfo SetInterval(float interval,TimerCallback callback) { return SetTimeout(interval,callback,-1); } public TimerInfo SetTimeout(float interval,TimerCallback callback,int repeat = 1) { TimerInfo timerInfo = new TimerInfo() { Callback = callback, Interval = interval, Repeat = repeat, }; timers.Add(timerInfo); return timerInfo; } public void ClearTimeout(TimerCallback callback) { var removes = timers.Where(time => callback == time.Callback).ToList(); removes.ForEach(time=> timers.Remove(time)); } private void Update() { timers.ForEach(time => { time.Update(Time.deltaTime); }); var removes = timers.Where(time => time.IsRunSuccess).ToList(); removes.ForEach(time=> timers.Remove(time)); } } }