本日は 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}回ボタンが押されました"); } }