MRが楽しい

MRやVRについて学習したことを書き残す

UniRxのToUniTaskを使って複数ボタンのいずれかの押下を待機する おまけ(複数ボタンをリストで指定する)

本日は UniRx の小ネタ枠です。
UniRx の ToUniTask を使って複数ボタンのいずれかの押下を待機する方法を記事にします。
今回は前回記事に引き続いて複数ボタンをリストで指定する方法を試しました。

前回記事

本記事は以下の記事の続きになります。
bluebirdofoz.hatenablog.com

リストで指定した数のボタンのいずれかの押下を待機する

以下のサンプルスクリプトを作成しました。
Merge オペレータ内で List から IObservable を統合し、その完了を ToUniTask メソッドを使って待機しています。
・ListButtonAwaitTest.cs

using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
using UniRx;

public class ListButtonAwaitTest : MonoBehaviour
{
    [SerializeField]
    private List<Button> buttons;
    
    async void Start()
    {
        Debug.Log("ボタンが押されるまで待機します");
        
        // useFirstValue:trueにすると、OnNextでもawaitの待機が解除される
        // デフォルトまたはuseFirstValue:falseの場合、OnCompleteが来るまで待機が解除されない
        var result = await Observable.Merge(
                buttons.Select(button => button.OnClickAsObservable().Select(_ => button.name))
            )
            .ToUniTask(useFirstValue:true);
        
        Debug.Log($"{result}ボタンが押されました");
    }
}

前回と同じサンプルシーンを用意して Inspector で Button コンポーネントの参照を List で設定します。

シーンを再生して動作を確認します。
ボタンを押下すると await が解除され、押下されたボタンの種類がデバッグログで表示されました。