TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Unity: UniRxのReactivePropertyで値が同じでも通知したい

状況

ReactivePropertyは値が同じ時は購読側に通知をしません。
通常はこれで問題ないのですが、通知して欲しい時がありました。

neuecc on Twitter: "UniRxだと通知飛ばす側がSetValueAndForceNotifyで強制的に飛ばせるって作りになってますね(定義側での挙動指定はできない)… "

使用方法

SetValueAndForceNotify

を使用すれば良いみたいです。

model.Count.Value = 1 // 同じ値は通知されない
// ↓
model.Count.SetValueAndForceNotify(1) // 同じ値でも通知される

必要だった状況

購読しているメソッド内部でifで分岐しており、メソッド外部の値を参照していました。

public void BindCount(int count) {
    if (this.level == 1) {
        // ~~~
    } else {
       // ~~~
    }
}

このメソッドではthis.levelというメソッド外部の値を参照していたため、this.levelが変わると、valueが同じでも、メソッドが再度実行されないといけない作りになっていました。
そのため、SetValueAndForceNotifyが必要となりました。

ですが、this.levelという値を参照をすべきではなく、ReactivePropertyをthis.levelとcountの2つの値で合成すべきでした。そうすれば、SetValueAndForceNotifyを使用する必要がなく、バグが引き起こされることもなかったと思います。

(なぜthis.levelを参照した作りにしたかというと、面倒だったので横着しました・・・(戒め))

結論

SetValueAndForceNotifyを使うか、合成したReactivePropertyを使用する。