PC-20230316NUNE\Administrator 6da2f9e691 提交
2024-10-16 20:41:40 +08:00

80 lines
2.0 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace JNGame.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<Timers>
{
private List<TimerInfo> timers = new List<TimerInfo>();
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));
}
}
}