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 frameCount | Unity などでデフォルトのフレームプロバイダーを使う場合 |
int frameCount, FrameProvider | テスト時や独自のフレームプロバイダーを使いたい場合 |
3. マーブルダイアグラム
購読が指定フレーム数だけ遅延されます。図ではグレーの値が購読開始前の通知で、遅延期間中にソースが発行した値は受け取られません。
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 との違い
| 項目 | DelaySubscription | DelaySubscriptionFrame |
|---|---|---|
| 時間単位 | 実時間(TimeSpan) | フレーム数(int) |
| プロバイダー | TimeProvider | FrameProvider |
| 主な用途 | 一般的な .NET アプリケーション | Unity などのゲームエンジン |
動作の仕組みは DelaySubscription と同一で、時間の計測単位がフレームに変わるだけです。