MRが楽しい

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

UniRxのFirstやTakeを使ってボタンの押下をawaitを使って待機する

本日は UniRx の小ネタ枠です。
UniRxのFirstやTakeを使ってボタンの押下をawaitを使って待機する方法を記事にします。

ボタンの押下をawaitを使って待機する

UniRxのOnClickAsObservableメソッドを使うことでButtonのクリックイベントをIObservableに変換できます。
更にFirstオペレータを使ってボタンが押下されるまでawaitで待機できるようになります。

サンプルスクリプト

以下のボタンのクリックイベントを受け取るまで処理の途中でawaitで待機を行うサンプルスクリプトを作成しました。
・ButtonFirstAwaitTest.cs

using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class ButtonFirstAwaitTest : MonoBehaviour
{
    [SerializeField]
    private Button button;

    private async void Start()
    {
        Debug.Log("ボタンが押されるまで待機します");
        
        // ボタンが押下されたらFirstがOnCompletedを発行して待機を完了する
        await button.OnClickAsObservable().First();
        
        Debug.Log("ボタンが押されました");
    }
}

以下のサンプルシーンを用意してInspectorでButtonコンポーネントの参照を設定しました。

シーンを再生して動作を確認します。

ボタンを押下するとawaitが解除され、続きの処理が実行されたログが表示されました。

複数回のボタン押下を待機する

複数回ボタンが押下されるのを待機する場合はTakeオペレータを利用します。
Takeで指定した回数のボタンが押下されるまでawaitで待機できるようになります。
・ButtonTakeAwaitTest.cs

using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class ButtonTakeAwaitTest : MonoBehaviour
{
    [SerializeField]
    private Button button;

    private async void Start()
    {
        Debug.Log("ボタンが押されるまで待機します");
        
        int count = 0;
        // ボタンが3回押下されたらTakeがOnCompletedを発行して待機を完了する
        await button.OnClickAsObservable().Do(_ => count++).Take(3);
        
        Debug.Log($"{count}回ボタンが押されました");
    }
}