169 lines
4.9 KiB
C#
169 lines
4.9 KiB
C#
/****************************************************************************
|
||
* Copyright (c) 2017 snowcold
|
||
* Copyright (c) 2017~2024 liangxiegame UNDER MIT LICENSE
|
||
* https://github.com/akbiggs/UnityTimer
|
||
*
|
||
* https://qframework.cn
|
||
* https://github.com/liangxiegame/QFramework
|
||
* https://gitee.com/liangxiegame/QFramework
|
||
****************************************************************************/
|
||
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace QFramework.TimeExtend
|
||
{
|
||
public class Timer
|
||
{
|
||
static List<Timer> timers = new List<Timer>();
|
||
private Action<float> UpdateEvent;
|
||
private System.Action EndEvent;
|
||
/// <summary>
|
||
/// 用户设定的定时时长
|
||
/// </summary>
|
||
private float mTime = -1;
|
||
/// <summary>
|
||
/// 是否循环执行
|
||
/// </summary>
|
||
private bool mLoop;
|
||
/// <summary>
|
||
/// 是否忽略Timescale
|
||
/// </summary>
|
||
private bool mIgnorTimescale;
|
||
/// <summary>
|
||
/// 用户指定的定时器标志,便于手动清除、暂停、恢复
|
||
/// </summary>
|
||
private readonly string mFlag;
|
||
|
||
public static TimerDriver Driver = null;//拿驱动器的引用只是为了初始化驱动器
|
||
/// <summary>
|
||
/// 获得当前时间
|
||
/// </summary>
|
||
private float CurrentTime => mIgnorTimescale ? Time.realtimeSinceStartup : UnityEngine.Time.time;
|
||
|
||
/// <summary>
|
||
/// 缓存时间
|
||
/// </summary>
|
||
private float mCachedTime;
|
||
/// <summary>
|
||
/// 已经流逝的时光
|
||
/// </summary>
|
||
float mTimePassed;
|
||
/// <summary>
|
||
/// 计时器是否结束
|
||
/// </summary>
|
||
private bool mIsFinish = false;
|
||
/// <summary>
|
||
/// 计时器是否暂停
|
||
/// </summary>
|
||
private bool mIsPause = false;
|
||
|
||
private const bool ShowLog = true;
|
||
|
||
/// <summary>
|
||
/// 构造定时器
|
||
/// </summary>
|
||
/// <param name="time">定时时长</param>
|
||
/// <param name="flag">定时器标识符</param>
|
||
/// <param name="loop">是否循环</param>
|
||
/// <param name="ignorTimescale">是否忽略TimeScale</param>
|
||
private Timer(float time, string flag, bool loop = false, bool ignorTimescale = true)
|
||
{
|
||
if (null == Driver) Driver = TimerDriver.Get; //初始化Time驱动
|
||
mTime = time;
|
||
mLoop = loop;
|
||
mIgnorTimescale = ignorTimescale;
|
||
mCachedTime = CurrentTime;
|
||
if (timers.Exists((v) => { return v.mFlag == flag; }))
|
||
{
|
||
if (ShowLog) Debug.LogWarningFormat("【TimerTrigger(容错)】:存在相同的标识符【{0}】!", flag);
|
||
}
|
||
mFlag = string.IsNullOrEmpty(flag) ? GetHashCode().ToString() : flag;//设置辨识标志符
|
||
}
|
||
|
||
/// <summary>
|
||
/// 刷新定时器
|
||
/// </summary>
|
||
private void Update()
|
||
{
|
||
if (!mIsFinish && !mIsPause) //运行中
|
||
{
|
||
mTimePassed = CurrentTime - mCachedTime;
|
||
if (null != UpdateEvent) UpdateEvent.Invoke(Mathf.Clamp01(mTimePassed / mTime));
|
||
if (mTimePassed >= mTime)
|
||
{
|
||
if (null != EndEvent) EndEvent.Invoke();
|
||
if (mLoop)
|
||
{
|
||
mCachedTime = CurrentTime;
|
||
}
|
||
else
|
||
{
|
||
Stop();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 回收定时器
|
||
/// </summary>
|
||
private void Stop()
|
||
{
|
||
if (timers.Contains(this))
|
||
{
|
||
timers.Remove(this);
|
||
}
|
||
mTime = -1;
|
||
mIsFinish = true;
|
||
mIsPause = false;
|
||
UpdateEvent = null;
|
||
EndEvent = null;
|
||
}
|
||
|
||
|
||
|
||
#region-------------UpdateAllTimer---------------
|
||
public static void UpdateAllTimer()
|
||
{
|
||
for (int i = 0; i < timers.Count; i++)
|
||
{
|
||
if (null != timers[i])
|
||
{
|
||
timers[i].Update();
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
}
|
||
|
||
public class TimerDriver : MonoBehaviour
|
||
{
|
||
#region 单例
|
||
private static TimerDriver mInstance;
|
||
public static TimerDriver Get
|
||
{
|
||
get
|
||
{
|
||
if (null == mInstance)
|
||
{
|
||
mInstance = FindObjectOfType<TimerDriver>() ?? new GameObject("TimerEntity").AddComponent<TimerDriver>();
|
||
}
|
||
return mInstance;
|
||
}
|
||
}
|
||
private void Awake()
|
||
{
|
||
mInstance = this;
|
||
}
|
||
#endregion
|
||
private void Update()
|
||
{
|
||
Timer.UpdateAllTimer();
|
||
}
|
||
}
|
||
}
|