Skip to content

DelaySubscriptionFrame

1. 概要

DelaySubscriptionFrame は、DelaySubscription のフレームベース版です。ソースシーケンスへの購読自体を指定したフレーム数だけ遅延させます。

Unity などのゲームエンジン環境で、フレーム単位の購読遅延を行いたい場合に使用します。

2. シグネチャ

フレーム数による購読遅延

csharp
public static Observable<T> DelaySubscriptionFrame<T>(
    this Observable<T> source,
    int frameCount)

frameCount フレーム経過後にソースへの購読を開始します。

csharp
source.DelaySubscriptionFrame(10)

フレーム数 + FrameProvider による購読遅延

csharp
public static Observable<T> DelaySubscriptionFrame<T>(
    this Observable<T> source,
    int frameCount,
    FrameProvider frameProvider)

FrameProvider を指定してフレームカウントの実装を差し替えられます。

csharp
source.DelaySubscriptionFrame(10, fakeFrameProvider)

overload の使い分け

overload使う場面
int frameCountUnity などでデフォルトのフレームプロバイダーを使う場合
int frameCount, FrameProviderテスト時や独自のフレームプロバイダーを使いたい場合

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

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

購読が指定フレーム数だけ遅延されます。図ではグレーの値が購読開始前の通知で、遅延期間中にソースが発行した値は受け取られません。

4. サンプルコード

csharp
using R3;

// Unity で 10 フレーム後に購読を開始
source
    .DelaySubscriptionFrame(10)
    .Subscribe(x => ProcessValue(x));

// FakeFrameProvider を使ったテスト
var fakeFrames = new FakeFrameProvider();
var subscribed = false;

Observable.Defer(() =>
{
    subscribed = true;
    return Observable.Return(42);
})
.DelaySubscriptionFrame(5, fakeFrames)
.Subscribe(x => Console.WriteLine(x));

// subscribed: false — まだ購読されていない
fakeFrames.Advance(5);
// subscribed: true — 購読開始

5. 補足

DelaySubscription との違い

項目DelaySubscriptionDelaySubscriptionFrame
時間単位実時間(TimeSpanフレーム数(int
プロバイダーTimeProviderFrameProvider
主な用途一般的な .NET アプリケーションUnity などのゲームエンジン

動作の仕組みは DelaySubscription と同一で、時間の計測単位がフレームに変わるだけです。