跳到主要内容

RTUpdater

重要 注意 提醒

Coding Style wiki


RTUpdater独立于 MonoBehaviour 的真实时间更新循环 (UniTask 驱动),提供 onUpdateonFixedUpdateonLateUpdate 回调,可自定义 targetFrameRate (更新频率)timeScale (自身时间尺度)不受 Unity Time.timeScale 影响 (游戏暂停仍持续运转),并额外支持 StartOnThread() 将循环切至线程池,适合网络心跳、后台轮询等场景。

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

快速上手

using OxGKit.TimeSystem;

var rtUpdater = new RTUpdater();

// 订阅更新回调
rtUpdater.onUpdate += (dt) => { /* 每次更新 (实际经过时间) */ };
rtUpdater.onFixedUpdate += (fdt) => { /* 固定间隔更新 */ };
rtUpdater.onLateUpdate += (dt) => { /* 后更新 */ };

// 可自定义更新频率与时间尺度
rtUpdater.targetFrameRate = 60f; // 默认 60
rtUpdater.timeScale = 1f; // 0 ~ 64,默认 1

// 启动更新循环 (即使 Time.timeScale = 0 仍持续运转)
rtUpdater.Start();

// 功能结束时务必停止
rtUpdater.Stop();

通用规则

更新频率与时间缩放

  • 每轮循环的更新频率 = targetFrameRate × timeScale (不乘算 Unity Time.timeScale),并以 fixedDeltaTime = 1 / 更新频率 作为等待间隔。
  • 每轮依次触发:onFixedUpdate(fixedDeltaTime)onUpdate(deltaTime)onLateUpdate(deltaTime);其中 deltaTime 为以系统时钟计算的上一轮实际经过时间fixedDeltaTime 为固定间隔值。

注意 仅于 targetFrameRate 大于 0 且 timeScale 大于 0 时运转,任一为 0 时循环闲置等待 (不触发回调)。若需要跟随 Time.timeScale 与游戏暂停的更新循环,请改用 DTUpdater (详见模块选型)。

生命周期

重要 更新循环为 UniTask 循环,拥有者 (功能/场景) 结束时务必调用 Stop 停止,否则循环会持续运转;循环中回调抛出异常时会自动停止并重新抛出。


委托

public delegate void RealTimeUpdate(float deltaTime);
public delegate void RealTimeFixedUpdate(float fixedDeltaTime);
public delegate void RealTimeLateUpdate(float deltaTime);

成员

成员说明
public RealTimeUpdate onUpdate每轮更新回调 (参数为上一轮实际经过时间 deltaTime)。
public RealTimeFixedUpdate onFixedUpdate每轮固定间隔回调 (参数为 fixedDeltaTime)。
public RealTimeLateUpdate 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 RTUpdater()

创建更新器并以创建当下的系统时间作为 timeSinceStartup 的基准点。


方法

方法总览

方法说明
Start启动更新循环。
StartOnThread启动更新循环并切换至线程池运转。
Stop停止更新循环。
IsRunning是否正在运转中。

Start

public void Start()

启动更新循环 (UniTask),已在运转中时再次调用无作用

StartOnThread

public void StartOnThread()

启动更新循环并先切换至线程池 (UniTask.SwitchToThreadPool) 运转,已在运转中时再次调用无作用

重要 回调可能在非 Unity 主线程执行,请勿直接访问 UnityEngine 对象 (需自行封送回主线程)。

注意 WebGL 平台不支持多线程,在 WebGL 上不会进行切换 (行为等同 Start)。

Stop

public void Stop()

停止更新循环并取消内部的 CancellationTokenSource;停止后可再次 Start 重新启动。

IsRunning

public bool IsRunning()

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