クリエイティブ

UniRxで処理の間に呼ばれるObsevableを生成

はじめに

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で分岐させる方法を書いてみました。
汎用化させたりしなければこういった処理は不要ですが、参考になれば幸いです。

  • この記事を書いた人

あるせ

上場ゲーム会社の現役プログラマーで1児の父です。 プログラミングを始めたい方向けのライトな記事からゲーム開発の現場で得た知見まで幅広く発信します!

PickUp

1

ChatGPTを使って画像生成を行っていると、背景を透過した画像を作りたいと思うことがよくあります。ChatGPTで生成した画像に対して「背景透過してpngで書き出して」と依頼してみたのですが、背景が ...

2

問題 上記のような問題が発生し困っていました。調べたところ改行コードの問題がよくヒットしましたが、自分の場合は解決できませんでした。 原因と解決方法 原因はGit LFSを使用していたことでした。Gi ...

-クリエイティブ
-, , ,