跳至主要内容

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