跳至主要内容

DTUpdater

重要 注意 提醒

Coding Style wiki


DTUpdater獨立於 MonoBehaviour 的更新迴圈 (UniTask 驅動),提供 onUpdateonFixedUpdateonLateUpdate 回調,可自訂 targetFrameRate (更新頻率)timeScale (自身時間尺度);更新頻率會乘算 Unity 的 Time.timeScale,當 Time.timeScale = 0 時迴圈閒置 (跟隨遊戲暫停),適合驅動需要跟隨遊戲時間的非 MonoBehaviour 系統。

命名空間OxGKit.TimeSystem
類型public class DTUpdater
原始碼DTUpdater.cs
using OxGKit.TimeSystem;

快速上手

using OxGKit.TimeSystem;

var dtUpdater = new DTUpdater();

// 訂閱更新回調
dtUpdater.onUpdate += (dt) => { /* 每次更新 (實際經過時間) */ };
dtUpdater.onFixedUpdate += (fdt) => { /* 固定間隔更新 */ };
dtUpdater.onLateUpdate += (dt) => { /* 後更新 */ };

// 可自訂更新頻率與時間尺度
dtUpdater.targetFrameRate = 60f; // 預設 60
dtUpdater.timeScale = 1f; // 0 ~ 64,預設 1

// 啟動更新迴圈
dtUpdater.Start();

// 功能結束時務必停止
dtUpdater.Stop();

通用規則

更新頻率與時間縮放

  • 每輪迴圈的更新頻率 = targetFrameRate × (Time.timeScale × timeScale),並以 fixedDeltaTime = 1 / 更新頻率 作為等待間隔。
  • 每輪依序觸發:onFixedUpdate(fixedDeltaTime)onUpdate(deltaTime)onLateUpdate(deltaTime);其中 deltaTime 為以系統時鐘計算的上一輪實際經過時間fixedDeltaTime 為固定間隔值。

注意 僅於 Time.timeScale 大於 0 且 targetFrameRate 大於 0 且 timeScale 大於 0 時運轉,任一為 0 時迴圈閒置等待 (不觸發回調);因此 DTUpdater跟隨 Unity 遊戲暫停。若需要不受 Time.timeScale 影響的更新迴圈,請改用 RTUpdater (詳見模組選型)。

生命週期

重要 更新迴圈為 UniTask 迴圈,擁有者 (功能/場景) 結束時務必呼叫 Stop 停止,否則迴圈會持續運轉;迴圈中回調擲出例外時會自動停止並重新擲出。


委派

public delegate void DeltaTimeUpdate(float deltaTime);
public delegate void DeltaTimeFixedUpdate(float fixedDeltaTime);
public delegate void DeltaTimeLateUpdate(float deltaTime);

成員

成員說明
public DeltaTimeUpdate onUpdate每輪更新回調 (參數為上一輪實際經過時間 deltaTime)。
public DeltaTimeFixedUpdate onFixedUpdate每輪固定間隔回調 (參數為 fixedDeltaTime)。
public DeltaTimeLateUpdate onLateUpdate每輪後更新回調 (於 onUpdate 之後觸發)。
public float timeSinceStartup { get; }自實例建立以來的經過時間 (秒,系統時鐘計算)。
public float timeAtLastFrame { get; }上一輪更新的時間點 (秒)。
public float timeScale { get; set; }自身時間尺度,設值會被限制於 0 ~ 64 (預設 1)。
public float targetFrameRate { get; set; }目標更新頻率 (每秒次數),負值會被歸 0 (預設 60)。
public float deltaTime { get; }上一輪的實際經過時間 (秒)。
public float fixedDeltaTime { get; }當前的固定間隔時間 (1 / 更新頻率)。

建構子

public DTUpdater()

建立更新器並以建立當下的系統時間作為 timeSinceStartup 的基準點。


方法

方法總覽

方法說明
Start啟動更新迴圈。
Stop停止更新迴圈。
IsRunning是否正在運轉中。

Start

public void Start()

啟動更新迴圈 (UniTask),已在運轉中時再次呼叫無作用

Stop

public void Stop()

停止更新迴圈並取消內部的 CancellationTokenSource;停止後可再次 Start 重新啟動。

IsRunning

public bool IsRunning()

返回更新迴圈是否正在運轉中。