跳到主要内容

DeltaTimer

重要 注意 提醒

Coding Style wiki


DeltaTimer 是以外部喂入的 deltaTime 累加驱动的计时器 (游戏时间),需由拥有者 (MonoBehaviour 的 Update 等) 持续调用 UpdateTimer(dt) 驱动;停止喂入即冻结,喂入 Time.deltaTime 时自然跟随 Time.timeScale 与游戏暂停。支持 Timer (单次计时)Tick (循环计时)Mark (时间标记) 三种模式与时间速度调整。

命名空间OxGKit.TimeSystem
类型public class DeltaTimer
源码DeltaTimer.cs
using OxGKit.TimeSystem;

快速上手

using OxGKit.TimeSystem;
using UnityEngine;

public class SkillCooldown : MonoBehaviour
{
private DeltaTimer _cooldown;

private void Start()
{
// 创建并自动播放 (autoPlay: true)
this._cooldown = new DeltaTimer(true);
// 设置 3 秒冷却
this._cooldown.SetTimer(3f);
}

private void Update()
{
// 必须持续喂入 deltaTime 驱动计时器
this._cooldown.UpdateTimer(Time.deltaTime);

if (this._cooldown.IsTimerTimeout())
{
// 冷却结束 (时间到)
}
}
}

通用规则

DeltaTimer vs RealTimer

注意 DeltaTimer 的时间仅在被喂入 UpdateTimer(dt) 时前进,喂入 Time.deltaTime 时会跟随 Time.timeScale 与游戏暂停 (冻结);RealTimer 则以系统时钟计算,即使游戏暂停仍持续计时,请依场景选用 (详见模块选型)。

播放状态

重要 计时器构造后默认为停止状态,需调用 Play (或使用构造函数 autoPlay: true) 才会开始计时。

提醒 Stop 会清空所有计时数据 (保留时间速度);Reset 会连同时间速度一并重置为默认值;Pause 仅暂停,可由 Play 续播。


构造函数

public DeltaTimer()

public DeltaTimer(bool autoPlay)

创建计时器 (内部会先执行 Reset),autoPlay 为 true 时创建后立即开始计时。


成员

成员说明
public float deltaTime { get; }最后一次通过 UpdateTimer 喂入的 deltaTime。

驱动与播放控制

方法总览

方法说明
UpdateTimer由拥有者喂入 deltaTime 驱动计时器。
Play开始或续播计时。
Pause暂停计时 (可续播)。
Stop停止并清空计时数据。
Reset重置所有状态 (含时间速度)。
IsPlaying是否正在计时。
IsPause是否为暂停 (停止) 状态。
GetTime获取计时器当前时间 (秒)。
SetTimeSpeed设置时间运转速度。
GetTimeSpeed获取时间运转速度。

UpdateTimer

public void UpdateTimer(float dt)

需要通过 MonoBehaviour 的 Update 持续喂入 deltaTime 驱动计时器 (内部进行累加)。

private void Update()
{
this._deltaTimer.UpdateTimer(Time.deltaTime);
}

重要 停止喂入 = 计时冻结,所有 Timer / Tick / Mark 的判断皆不会前进。

Play

public void Play()

开始计时或自暂停状态续播 (会扣除暂停期间的时间,不会跳段)。

Pause

public void Pause()

暂停计时,记录暂停时间点,可由 Play 续播。

Stop

public void Stop()

停止计时并清空所有计时数据 (Timer / Tick / Mark 设置皆归零),但保留时间速度 (timeSpeed)。

Reset

public void Reset()

重置所有状态为默认值 (含时间速度重置为 1),并回到停止状态。

IsPlaying

public bool IsPlaying()

返回是否正在计时中。

IsPause

public bool IsPause()

返回是否为暂停 (非播放) 状态。

GetTime

public float GetTime()

获取计时器的当前累计时间 (秒),计时中会受 SetTimeSpeed 影响;暂停时返回暂停当下的时间。

SetTimeSpeed

public void SetTimeSpeed(float timeSpeed)

设置时间运转速度 (默认 1),影响 GetTime 的时间流速 (连带影响 Timer / Tick / Mark 判断)。

GetTimeSpeed

public float GetTimeSpeed()

获取当前时间运转速度。


Timer 单次计时

依照设置的秒数进行单次倒计时

方法总览

方法说明
SetTimer设置要计时的秒数。
TimerCountdown获取倒计时剩余秒数 (到时返回 0)。
IsTimerTimeout返回计时时间是否已经到了。
GetTimerCountdownRatio获取倒计时时间比率 (1 递减至 0)。

SetTimer

public void SetTimer(float timeSeconds)

设置要计时的秒数 (以当前时间 + 秒数作为触发时间点)。

this._deltaTimer.SetTimer(3f);
this._deltaTimer.Play();

TimerCountdown

public float TimerCountdown()

计算触发时间的倒计时剩余秒数,如果已超过设置的触发时间将直接返回 0。

IsTimerTimeout

public bool IsTimerTimeout()

返回计时时间是否已经到了 (超过触发时间点返回 true)。

提醒 时间到后 IsTimerTimeout()持续返回 true,一次性行为请于触发后自行 Stop 或重新 SetTimer

GetTimerCountdownRatio

public float GetTimerCountdownRatio()

获取 Timer 倒计时的时间比率,1 递减至 0,0 = 时间到 (适合驱动进度条 UI)。


Tick 循环计时

持续依照设置的间隔秒数循环触发 (Timeout 后自动重新装填)。

方法总览

方法说明
SetTick设置 Tick 间隔秒数。
GetTick获取设置的 Tick 间隔秒数。
TickCountdown获取本次 Tick 的倒计时剩余秒数。
IsTickTimeout返回 Tick 时间是否已经到了 (自动重新装填)。
GetTickCountdownRatio获取 Tick 倒计时时间比率 (1 递减至 0)。

SetTick

public void SetTick(float tickSeconds)

设置 Tick 间隔秒数,当 IsTickTimeout 触发后仍会持续循环 Tick

// 每 0.5 秒触发一次
this._deltaTimer.SetTick(0.5f);
this._deltaTimer.Play();

GetTick

public float GetTick()

获取设置的 Tick 间隔秒数。

TickCountdown

public float TickCountdown()

获取本次 Tick 触发时间的倒计时剩余秒数,如果已超过触发时间将直接返回 0。

IsTickTimeout

public bool IsTickTimeout()

返回 Tick 时间是否已经到了;返回 true 时会自动以当前时间重新装填下一次 Tick,形成循环触发。

private void Update()
{
this._deltaTimer.UpdateTimer(Time.deltaTime);

if (this._deltaTimer.IsTickTimeout())
{
// 每个 Tick 周期触发一次
}
}

重要 IsTickTimeout() 返回 true 时会自动重新装填,该次触发即被“消耗”,同一周期内请仅由单一调用端检查一次,否则触发会被其他调用端吃掉。

GetTickCountdownRatio

public float GetTickCountdownRatio()

获取 Tick 倒计时的时间比率,1 递减至 0,0 = 时间到


Mark 时间标记

标记某个时间点,用于计算经过时间 (秒表用途)。

方法总览

方法说明
SetMark以当前时间设置标记。
GetMark获取标记时间。
GetElapsedMarkTime获取自标记以来的经过时间 (秒)。

SetMark

public void SetMark()

以计时器的当前时间设置标记时间。

GetMark

public float GetMark()

获取标记时间。

GetElapsedMarkTime

public float GetElapsedMarkTime()

获取自上次标记以来的经过时间 (秒),尚未超过标记时间点时返回 0。

this._deltaTimer.SetMark();

// ... 一段时间后
float elapsed = this._deltaTimer.GetElapsedMarkTime();