跳到主要内容

IntervalTimer

重要 注意 提醒

Coding Style wiki


IntervalTimer类 JavaScript setInterval 的间隔触发计时器 (UniTask 驱动),每隔指定毫秒触发一次 Action,支持 ignoreTimeScale (是否忽略 Time.timeScale) 与 SetIntervalOnThread (切至线程池运转);也可通过静态管理器 IntervalSetter 统一创建与管理。

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

快速上手

using OxGKit.TimeSystem;

var intervalTimer = new IntervalTimer();

// 每 1000 毫秒触发一次
intervalTimer.SetInterval(() =>
{
// 周期性工作
}, 1000);

// 功能结束时务必停止
intervalTimer.StopInterval();

通用规则

  • 首次触发发生在第一个间隔之后 (先等待、后触发),之后持续循环。
  • 同一实例已在运转中时,再次调用 SetInterval / SetIntervalOnThread 无作用,需先 StopInterval 再重新设置。
  • ignoreTimeScale 默认 false:间隔以 Unity 缩放时间计算 (Time.timeScale = 0 时不会触发);设为 true 则以未缩放时间计算。

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


构造函数

public IntervalTimer()

创建间隔触发计时器 (创建后需再调用 SetInterval 启动)。


方法

方法总览

方法说明
SetInterval启动间隔触发 (每隔指定毫秒触发一次 Action)。
SetIntervalOnThread启动间隔触发并切换至线程池运转。
StopInterval停止间隔触发。
IsRunning是否正在运转中。

SetInterval

public void SetInterval(Action action, int milliseconds, bool ignoreTimeScale = false)

启动间隔触发,每隔 milliseconds 毫秒触发一次 action;已在运转中时再次调用无作用

// 每 500 毫秒触发一次,忽略 Time.timeScale
intervalTimer.SetInterval(() => { /* ... */ }, 500, true);

SetIntervalOnThread

public void SetIntervalOnThread(Action action, int milliseconds, bool ignoreTimeScale = false)

启动间隔触发并先切换至线程池 (UniTask.SwitchToThreadPool) 运转;已在运转中时再次调用无作用

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

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

StopInterval

public void StopInterval()

停止间隔触发并取消内部的 CancellationTokenSource;停止后可再次 SetInterval 重新启动。

IsRunning

public bool IsRunning()

返回间隔触发是否正在运转中。