Skip to content

EveryUpdate ​

1. 概要 ​

EveryUpdate は、毎フレーム(毎アップデートティック)に Unit を発行し続けるファクトリメソッドです。自動的には完了しません。

ゲームエンジン(Unity など)における Update() コールバックのリアクティブ版に相当し、毎フレーム実行したいロジックを Observable パイプラインとして記述できます。

2. シグネチャ ​

基本 ​

csharp
public static Observable<Unit> EveryUpdate()

デフォルトの FrameProvider を使用して、毎フレーム Unit を発行します。

csharp
Observable.EveryUpdate()

CancellationToken 付き ​

csharp
public static Observable<Unit> EveryUpdate(CancellationToken cancellationToken)

キャンセルトークンを指定して、購読を停止できるオーバーロードです。

csharp
var cts = new CancellationTokenSource();
Observable.EveryUpdate(cts.Token)

FrameProvider 指定 ​

csharp
public static Observable<Unit> EveryUpdate(FrameProvider frameProvider)

使用する FrameProvider を明示的に指定するオーバーロードです。

csharp
Observable.EveryUpdate(myFrameProvider)

Unity では UnityFrameProvider.Update、UnityFrameProvider.FixedUpdate、UnityFrameProvider.PostLateUpdate などを指定して、どの PlayerLoop タイミングで毎フレーム発行するかを選べます。利用できる Unity 向け Provider は Unity providers を参照してください。

FrameProvider + CancellationToken ​

csharp
public static Observable<Unit> EveryUpdate(FrameProvider frameProvider, CancellationToken cancellationToken)

FrameProvider とキャンセルトークンの両方を指定するオーバーロードです。

オーバーロードの使い分け ​

overload使う場面
EveryUpdate()デフォルトの FrameProvider で毎フレーム発行する
EveryUpdate(CancellationToken)キャンセル可能な毎フレーム発行
EveryUpdate(FrameProvider)カスタム FrameProvider を使用する
EveryUpdate(FrameProvider, CancellationToken)カスタム FrameProvider とキャンセルの両方を指定する

3. マーブルダイアグラム ​

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

毎フレーム Unit を発行し続けます。完了通知は自動的には送信されず、CancellationToken のキャンセルや Dispose で購読を終了する必要があります。

4. サンプルコード ​

csharp
using R3;

// 毎フレーム処理を実行
var cts = new CancellationTokenSource();
Observable.EveryUpdate(cts.Token)
    .Subscribe(_ => Console.WriteLine("update"));
// 出力:
// update(毎フレーム)
// ...(cts.Cancel() で停止)

// Where と組み合わせて条件付きフレーム処理
Observable.EveryUpdate()
    .Where(_ => IsPlayerMoving())
    .Subscribe(_ => UpdatePlayerPosition());

// Take で最初の 100 フレームだけ処理
Observable.EveryUpdate()
    .Take(100)
    .Subscribe(
        _ => Console.WriteLine("processing"),
        _ => Console.WriteLine("100 フレーム完了"));

5. 補足 ​

IntervalFrame との違い ​

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

NextFrame との違い ​

NextFrame は次の 1 フレームで発行して完了する単発のファクトリメソッドです。EveryUpdate は停止するまで毎フレーム発行し続けます。