跳到主要内容

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();