Skip to content

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. マーブルダイアグラム

IntervalFrame のマーブルダイアグラム

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 との違い

IntervalTimeSpan による実時間ベースの間隔で発行します。IntervalFrame はフレーム数ベースです。フレームの概念がある環境(Unity など)ではフレームベースが自然な選択になります。

EveryUpdate との違い

毎フレーム(間隔 1 フレーム)で発行したい場合は EveryUpdate が最適化されています。IntervalFrame(1) でも同様の動作が得られますが、EveryUpdate はその用途に特化した実装です。

TimerFrame との違い

初回遅延と周期を個別に設定したい場合は TimerFrameperiodFrame を指定してください。