はじめに
UniRxでボタンを押した際に一定の個数以下の時にワーニングを出し、
ワーニングで「OKボタン」を押したかどうかによって後続の処理を分岐させるのを書いてみました。
一つの画面を汎用化させてシーケンスの途中で表示する画面を出し分ける必要があったため、途中の処理をFuncで渡して差し込めるようにしました。
シンプルな割に結構時間かかってしまったので備忘録します。
サンプルコードを記載
Observableの受け渡し用のInfoクラス作成
Observableが呼ばれた際に実行するFuncを設定できるようにInfoクラスを作ります。
public interface ITestInfo
{
Func<int, IObservable<bool>> BeforeObservableFunc { get; }
}
public class TestInfo : ITestInfo
{
// 特定の処理の前に呼ばれるObservableを生成
// 引数がintで戻り値がIObservable<bool>のFuncを設定
public Func<int, IObservable<bool>> BeforeObservableFunc { get; set; } = (int count) => Observable.Return(true);
}
InfoクラスにObservableを設定
上記で作成したInfoクラスのObservableにFuncを設定します。
var testInfo = new TestInfo();
testInfo.BeforeObservableFunc = (int count) =>
{
return Observable.Create<bool>(observer =>
{
var disposable = new CompositeDisposable();
// countの数値が適正かどうか判断
if (count <= 0)
{
// 問題があったため確認画面を表示
Observable
.Subscribe(_ =>
{
observer.OnNext(false);
observer.OnCompleted();
}
).AddTo(disposable);
}
else
{
observer.OnNext(true);
observer.OnCompleted();
}
return Disposable.Create(() => { disposable.Dispose(); });
});
};
IObservableの実行タイミングの動作設定
呼び出し側のコードを記載します。
SelectManyでInfoクラスに設定したBeforeObservableFuncを呼び出し引数として「適当な数値」を渡します。
戻り値としてIObservable<bool>が返ってきますので、問題があれば後続のWhere(isOk => isOK)で止められるためSubsctibeが実行されずに終了します。
IObservable
.SelectMany(_ => info.BeforeObservableFunc(「適当な数値」))
.Where(isOk => isOk)
.Subscribe(_ =>
{
// 条件がtrueのときのみ実行
}).AddTo(this);
まとめ
Unityでボタンを押した後の処理をUniRxで分岐させる方法を書いてみました。
汎用化させたりしなければこういった処理は不要ですが、参考になれば幸いです。