概要
何番煎じだ? って感じなのですが、ネットのサンプルがなんかいまいちほしいやつじゃないので書きます。
- ボタンを押している間のOnNextの間隔を指定したい
- ボタンを離した瞬間を取得したい
- Observableを一時変数にとっておいたりしないで一発でさくっと書きたい
コード
間隔:Update
_button.OnPointerDownAsObservable()
.SelectMany(_ => _button.UpdateAsObservable())
.TakeUntil(_button.OnPointerUpAsObservable())
.DoOnCompleted(() =>
{
Debug.Log("released!");
})
.RepeatUntilDestroy(_button)
.Subscribe(unit =>
{
Debug.Log("pressing...");
});
間隔:1秒
_button.OnPointerDownAsObservable()
.SelectMany(_ => Observable.Interval(TimeSpan.FromSeconds(1)))
.TakeUntil(_button.OnPointerUpAsObservable())
.DoOnCompleted(() =>
{
Debug.Log("released!");
})
.RepeatUntilDestroy(_button)
.Subscribe(time =>
{
Debug.Log("pressing..." + time);
});
おまけ:ポインターの出入りを検知
_button.OnPointerEnterAsObservable()
.SelectMany(_ => Observable.Interval(TimeSpan.FromSeconds(1)))
.TakeUntil(_button.OnPointerExitAsObservable())
.DoOnCompleted(() =>
{
Debug.Log("out");
})
.RepeatUntilDestroy(_button)
.Subscribe(time =>
{
Debug.Log("in");
});
まとめ
SelectMany
の引数に与えるオペレータを変えれば間隔は如何様にもできます。
Button
がDestroy
されたときにもDoOnCompleted
が来ちゃうので、それが困る場合はDoOnCompleted
を追加しないでOnPointerUpAsObservable
を別に追加してください。
参考
【Unity】【UniRx】TakeXxx系のオペレータまとめ
【Unity】【UniRx】Repeat系のオペレータまとめ