定时器周期有延迟阶段和运行阶段,如果延迟阶段暂停,再开启,就直接进入运行阶段了。
一开始运行游戏会有延迟,延迟阶段,可以设置延迟时间,过了延迟时间就开始运行。
public class TimeAction
{
/// <summary>
/// 是否正在运行
/// </summary>
public bool IsRuning { get; private set; }
/// <summary>
/// 是否暂停
/// </summary>
public bool m_IsPause = false;
/// <summary>
/// 当前运行的时间
/// </summary>
private float m_CurrRunTime;
/// <summary>
/// 当前循环次数
/// </summary>
private int m_CurrLoop;
/// <summary>
/// 延迟时间
/// </summary>
private float m_DelayTime;
/// <summary>
/// 间隔(秒)
/// </summary>
private float m_Interval;
/// <summary>
/// 循环次数(-1 表示无限循环)
/// </summary>
private int m_Loop;
/// <summary>
/// 最后暂停时间
/// </summary>
private float m_LastPauseTime;
/// <summary>
/// 暂停了多久
/// </summary>
private float m_PauseTime;
/// <summary>
/// 开始运行
/// </summary>
private Action m_OnStar;
/// <summary>
/// 运行中 回调参数表示剩余次数
/// </summary>
private Action<int> m_OnUpdate;
/// <summary>
/// 运行完毕
/// </summary>
private Action m_OnComplete;
/// <summary>
/// 初始化
/// </summary>
/// <param name="delayTime">延迟时间</param>
/// <param name="interval">间隔(秒)</param>
/// <param name="loop">循环次数</param>
/// <param name="onStar">开始运行</param>
/// <param name="onUpdate">运行中 回调参数表示剩余次数</param>
/// <param name="onComplete">运行完毕</param>
/// <returns>this对象</returns>
public TimeAction Init(float delayTime, float interval, int loop, Action onStar, Action<int> onUpdate, Action onComplete)
{
m_DelayTime = delayTime;
m_Interval = interval;
m_Loop = loop;
m_OnStar = onStar;
m_OnUpdate = onUpdate;
m_OnComplete = onComplete;
return this;
}
/// <summary>
/// 开始运行
/// </summary>
public void Run()
{
//1.需要先把自己注册进时间管理器的链表中
GameEntry.Time.RegisterTimeAction(this);
//2.设置当前运行的时间
m_CurrRunTime = Time.time;
m_IsPause = false;
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
if (m_OnComplete != null) m_OnComplete();
IsRuning = false;
//把自己从时间管理器链表中移除
GameEntry.Time.RemoveTimeAction(this);
}
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
m_LastPauseTime = Time.time;
m_IsPause = true;
}
/// <summary>
/// 恢复(取消暂停)
/// </summary>
public void Resume()
{
m_IsPause = false;
//计算暂停了多久
m_PauseTime = Time.time - m_LastPauseTime;
}
internal void OnUpdate()
{
if (m_IsPause) return;
//1延迟阶段阶段暂停,等待延迟时间
//暂停时间+延时时间+暂停了多久
if (Time.time > m_CurrRunTime + m_DelayTime + m_PauseTime )
{
Debug.Log("当程序执行到这里表示已经过了延迟时间");
if (!IsRuning)
{
//开始运行
m_CurrRunTime = Time.time;
m_PauseTime = 0;
if (m_OnStar != null) m_OnStar();
IsRuning = true;
}
}
if (!IsRuning) return;
//延迟阶段阶段暂停,加上暂停了多久
if (Time.time > m_CurrRunTime + m_PauseTime)
{
m_CurrRunTime = Time.time + m_Interval;
m_PauseTime = 0;
//处理 循环间隔m_Interval 秒 执行一次
if (m_OnUpdate != null) m_OnUpdate(m_Loop - m_CurrLoop);
if (m_Loop > -1)//循环次数
{
m_CurrLoop++;
if (m_CurrLoop >= m_Loop) Stop();
}
}
}
}