MRが楽しい

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

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

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

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

UniRx の OnClickAsObservable メソッドを使うことで Button のクリックイベントを IObservable に変換できます。
更に ToUniTask メソッドを使って IObservable の完了を await で待機できるようになります。

サンプルスクリプト

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

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

public class ButtonAwaitTest : MonoBehaviour
{
    [SerializeField]
    private Button releaseButton;
    
    async void Start()
    {
        Debug.Log("ボタンが押されるまで待機します");
        
        // useFirstValue:trueにすると、OnNextでもawaitの待機が解除される
        // デフォルトまたはuseFirstValue:falseの場合、OnCompleteが来るまで待機が解除されない
        await releaseButton.OnClickAsObservable().ToUniTask(useFirstValue:true);
        
        Debug.Log("ボタンが押されました");
    }
}

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

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

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