はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【UniRx, UniTask】ReactivePropertyをawaitしたらどうなるか(awaitした後ReactivePropertyの値が変わるまで)

はじめに

UniRxを使っていたところ、PeactivePropertyawaitしたらどうなるか気になりました。

そこで今回は実験していきたいと思います。

ReactivePropertyをawaitする

結論からいうと、awaitした後からReactivePropertyの値が変わるまで待ちます。

private async void Start()
{
    var reactiveProperty = new ReactiveProperty<int>(0);
            
    // 1, 2, 3と値が変わっていく
    UniTask.Void(async () =>
    {
        await UniTask.DelayFrame(2);
        reactiveProperty.Value = 1;
        await UniTask.DelayFrame(2);
        reactiveProperty.Value = 2;
        await UniTask.DelayFrame(3);
        reactiveProperty.Value = 3;
    });

    // awaitした瞬間からreactivePropertyが変わるまで待つ
    await reactiveProperty;
    Debug.Log(reactiveProperty.Value); // 1

    await UniTask.DelayFrame(3);
            
    await reactiveProperty;
    Debug.Log(reactiveProperty.Value); // 3
}

ちなみにReactiveProperty.Dispose()した後にawait reactivePropertyをするとTaskCanceledExceptionが投げられるみたいです。

Observableをawaitする

おまけですが、ObservableawaitをするとOnCompletedが発火されるまで待ちます。

private async void Start()
{
    var subject = new Subject<int>();

    var disposable = subject.Subscribe(x => Debug.Log(x));

    UniTask.Void(async () =>
    {
        // OnNextしたとしてもawaitは抜けない
        await UniTask.Yield();
        subject.OnNext(1);
        await UniTask.Yield();
        subject.OnNext(2);
        await UniTask.Yield();
        subject.OnNext(3);

        // OnCompletedしたらawait subjectを抜ける
        subject.OnCompleted();
    });

    await subject;
            
    // 1, 2, 3, await終わりの順番で出力されている
    Debug.Log("await終わり");
            
    disposable.Dispose();
}

さいごに

ReactivePropertyawaitすると次の値まで待つってのはかなり役に立ちそうですよね。

またReactivePropertyUniTask版であるAsyncReactivePropertyというのもあるので、そちらも後で紹介できたらと考えてます。

ではまた。