TimerFrame
1. 概要
TimerFrame は、指定したフレーム数が経過した後に Unit を発行するファクトリメソッドです。periodFrame を併せて指定すると、初回発行後も一定フレーム間隔で繰り返し発行し続けます。
Timer のフレームベース版であり、Unity などゲームエンジン上でフレーム単位のタイミング制御が必要な場合に使用します。
2. シグネチャ
単発
csharp
public static Observable<Unit> TimerFrame(int dueTimeFrame, CancellationToken cancellationToken = default)指定したフレーム数が経過した後に Unit を 1 つ発行し、完了します。
csharp
Observable.TimerFrame(60) // 60 フレーム後に発行繰り返し
csharp
public static Observable<Unit> TimerFrame(int dueTimeFrame, int periodFrame, CancellationToken cancellationToken = default)dueTimeFrame 経過後に最初の値を発行し、以降は periodFrame 間隔で繰り返し発行します。
csharp
Observable.TimerFrame(30, 10) // 30 フレーム後に初回、以降 10 フレームごとFrameProvider 指定バリエーション
csharp
public static Observable<Unit> TimerFrame(int dueTimeFrame, FrameProvider frameProvider, CancellationToken cancellationToken = default)
public static Observable<Unit> TimerFrame(int dueTimeFrame, int periodFrame, FrameProvider frameProvider, CancellationToken cancellationToken = default)使用する FrameProvider を明示的に指定するオーバーロードです。テスト時にフェイクフレームプロバイダーを注入する場合などに使用します。
オーバーロードの使い分け
| overload | 使う場面 |
|---|---|
TimerFrame(int) | 指定フレーム後に 1 回だけ発行する |
TimerFrame(int, int) | 初回遅延+フレーム周期的な繰り返し |
各 FrameProvider 付き | テスト容易性の確保、カスタム FrameProvider の利用 |
3. マーブルダイアグラム
単発の場合、dueTimeFrame フレームが経過した時点で Unit を 1 つ発行し完了します。periodFrame 付きの場合、初回発行後に periodFrame ごとに繰り返し発行し続けます。
4. サンプルコード
csharp
using R3;
// 60 フレーム後に 1 回だけ発行
Observable.TimerFrame(60)
.Subscribe(
_ => Console.WriteLine("発火"),
_ => Console.WriteLine("完了"));
// 出力(60 フレーム後): 発火
// 出力: 完了
// 30 フレーム後に初回発行、以降 10 フレームごとに繰り返し
var cts = new CancellationTokenSource();
Observable.TimerFrame(30, 10, cts.Token)
.Subscribe(_ => Console.WriteLine("tick"));
// 出力:
// tick(30 フレーム後)
// tick(40 フレーム後)
// tick(50 フレーム後)
// ...(cts.Cancel() で停止)5. 補足
Timer との違い
Timer は TimeSpan / DateTimeOffset による実時間ベースの遅延・繰り返しを行います。TimerFrame はフレーム数ベースです。フレームの概念がある環境(Unity など)ではフレームベースが自然な選択になります。
IntervalFrame との違い
IntervalFrame は初回の発行も periodFrame 後に行われます。初回遅延と周期を個別に設定したい場合は TimerFrame を使用してください。