Unity通用计时器
- 计时器支持开始、暂停、继续、取消等功能,可设置计时时间和重复计时的次数。
- 计时器由Timer和TimerDriver控制,其中Timer设置计时器参数,TimerDriver实现计时
代码:
Timer管理器,负责创建TimerDriver
using UnityEngine;
public class TimerManager : MonoSingleton<TimerManager>
{
private void Awake()
{
gameObject.hideFlags = HideFlags.HideInHierarchy;
}
/// <summary>
/// 创建计时驱动器
/// </summary>
/// <param name="data"></param>
public TimerDriver CreateTimerDriver(Timer data)
{
GameObject driverTarget = new GameObject();
driverTarget.name = "TimeDriver";
driverTarget.transform.SetParent(transform);
TimerDriver driver = driverTarget.AddComponent<TimerDriver>();
driver.InitTimerDriver(data);
return driver;
}
}
Timer:负责创建计时器,暂停、继续等功能,存储计时相关数据
using System;
public class Timer
{
/// <summary>
/// 延迟时间
/// </summary>
public float delayTime {
get; private set; }
/// <summary>
/// 持续时间
/// </summary>
public float duration {
get; private set; }
/// <summary>
/// 计时检测间隔
/// </summary>
internal float intervalTime {
get; private set; }
/// <summary>
/// 重复次数
/// </summary>
public int repeatCount {
get; private set; }
/// <summary>
/// 重复间隔
/// </summary>
public float repeatTime {
get; private set; }
/// <summary>
/// 已重复计时次数
/// </summary>
public int repeatedCount {
get; private set; }
/// <summary>
/// 当前次 已计时时间
/// </summary>
public float passedTime {
get; private set; }
internal enum TimerState
{
/// <summary>
/// 开始计时
/// </summary>
Start,
/// <summary>
/// 准备计时
/// </summary>
Prepare,
/// <summary>
/// 计时中
/// </summary>
Timing,
/// <summary>
/// 暂停计时
/// </summary>
Pause,
/// <summary>
/// 停止计时
/// </summary>
Stop,
}
/// <summary>
/// 计时器状态
/// </summary>
internal TimerState currentTimerState {
get; private set; }
/// <summary>
/// 是否忽略时间速率
/// </summary>
internal bool ignoreTimeScale {
get; private set; }
/// <summary>
/// 开始
/// </summary>
private Action onStart;
/// <summary>
/// 暂停
/// </summary>
private Action onPause;
/// <summary>
/// 继续
/// </summary>
private Action onResume;
/// <summary>
/// 完成
/// </summary>
private Action onCompleted;
/// <summary>
/// 取消
/// </summary>
private Action onCancel;
/// <summary>
/// 正在计时中
/// </summary>
private Action<float> onTiming;
/// <summary>
/// 重开始
/// </summary>
private Action onReStart;
/// <summary>
/// 驱动器 暂停
/// </summary>
private Action onDriverPause;
/// <summary>
/// 驱动器 继续
/// </summary>
private Action onDriverResume;
private Timer()
{
repeatedCount = 0;
passedTime = 0;
}
~Timer()
{
onStart = null;
onPause = null;
onResume = null;
onCompleted = null;
onCancel = null;
onTiming = null;
onReStart = null;
onDriverPause = null;
onDriverResume = null;
}
/// <summary>
/// 开始计时
/// </summary>
/// <param name="duration">计时时长(/s)</param>
/// <param name="intervalTime">检测间隔(/s)</param>
/// <param name="completed">计时完成回调</param>
/// <param name="ignoreTimeScale">是否忽略时间速率</param>
/// <returns></returns>
public static Timer Start(float duration, Action completed, float intervalTime = 1, bool ignoreTimeScale = false)
{
return Start(duration, 0, intervalTime, 0, 0, null, null, completed, null, null, null, null, ignoreTimeScale);
}
/// <summary>
/// 开始计时
/// </summary>
/// <param name="duration">计时时长(/s)</param>
/// <param name="delayTime">延时计时时长(/s)</param>
/// <param name="intervalTime">检测间隔(/s)</param>
/// <param name="completed">计时完成回调</param>
/// <param name="ignoreTimeScale">是否忽略时间速率</param>
/// <returns></returns>
public static Timer Start(float duration, float delayTime, Action completed, float intervalTime = 1, bool ignoreTimeScale = false)
{
return Start(duration, delayTime, intervalTime, 0, 0, null, null, completed, null, null, null, null, ignoreTimeScale);
}
/// <summary>
/// 开始计时
/// </summary>
/// <param name="duration">计时时长(/s)</param>
/// <param name="intervalTime">检测间隔(/s)</param>
/// <param name="completed">计时完成回调</param>
/// <param name="update">计时中回调</param>
/// <param name="ignoreTimeScale">是否忽略时间速率</param>
/// <returns></returns>
public static Timer Start