跳到主要内容

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

返回更新循环是否正在运转中。