IntervalFrame
1. 概要
IntervalFrame は、一定のフレーム間隔で Unit を繰り返し発行するファクトリメソッドです。Interval のフレームベース版であり、Unity などゲームエンジン上でフレーム単位の周期処理を行う場合に使用します。
自動的には完了しないため、CancellationToken やオペレーター(Take など)で購読を終了させる必要があります。
2. シグネチャ
基本
csharp
public static Observable<Unit> IntervalFrame(int periodFrame, CancellationToken cancellationToken = default)periodFrame フレームごとに Unit を繰り返し発行します。初回の発行は periodFrame フレーム経過後です。
csharp
Observable.IntervalFrame(10) // 10 フレームごとに発行FrameProvider 指定
csharp
public static Observable<Unit> IntervalFrame(int periodFrame, FrameProvider frameProvider, CancellationToken cancellationToken = default)使用する FrameProvider を明示的に指定するオーバーロードです。
csharp
Observable.IntervalFrame(10, myFrameProvider)オーバーロードの使い分け
| overload | 使う場面 |
|---|---|
IntervalFrame(int) | 一定フレーム間隔で繰り返し発行する(最も一般的) |
IntervalFrame(int, FrameProvider) | テスト容易性の確保、カスタム FrameProvider の利用 |
3. マーブルダイアグラム
periodFrame フレームが経過するたびに Unit を発行します。初回の発行は購読時点から periodFrame フレーム後であり、以降も同じフレーム間隔で発行し続けます。自動的には完了しません。
4. サンプルコード
csharp
using R3;
// 10 フレームごとに繰り返し発行
var cts = new CancellationTokenSource();
Observable.IntervalFrame(10, cts.Token)
.Subscribe(_ => Console.WriteLine("tick"));
// 出力:
// tick(10 フレーム後)
// tick(20 フレーム後)
// tick(30 フレーム後)
// ...(cts.Cancel() で停止)
// Take と組み合わせて 3 回で自動完了
Observable.IntervalFrame(5)
.Take(3)
.Subscribe(
_ => Console.WriteLine("tick"),
_ => Console.WriteLine("完了"));
// 出力:
// tick(×3 回)
// 完了5. 補足
Interval との違い
Interval は TimeSpan による実時間ベースの間隔で発行します。IntervalFrame はフレーム数ベースです。フレームの概念がある環境(Unity など)ではフレームベースが自然な選択になります。
EveryUpdate との違い
毎フレーム(間隔 1 フレーム)で発行したい場合は EveryUpdate が最適化されています。IntervalFrame(1) でも同様の動作が得られますが、EveryUpdate はその用途に特化した実装です。
TimerFrame との違い
初回遅延と周期を個別に設定したい場合は TimerFrame に periodFrame を指定してください。