🦔

UniTaskでボタンの入力を1行で待つ

2024/07/15に公開

はじめに

UniTaskでボタンの入力を待ついい感じの方法を見つけたので紹介します。

実装

Button側
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;

public class ButtonSample : MonoBehaviour
{
    [SerializeField] private Button _button;

    /// <summary>
    /// ボタンがクリックされたときまで待つUniTaskを返す
    /// </summary>
    public UniTask OnClicked(CancellationToken token) => _button.OnClickAsync(token);
}
利用側
using Cysharp.Threading.Tasks;
using UnityEngine;

public class ButtonUser : MonoBehaviour
{
    [SerializeField] private ButtonSample _buttonSample;

    private CancellationToken _token;

    private async UniTaskVoid Start()
    {
        // GameObjectが破棄されたときにUniTaskがキャンセルされる
        _token = this.GetCancellationTokenOnDestroy();

        // ボタンがクリックされるのを待つループ
        while (!_token.IsCancellationRequested)
        {
            await _buttonSample.OnClicked(_token);
            Debug.Log("Button Clicked!");
        }
    }
}

いいところ

  • 記述が最小限
    • 実装側は1行レベル
    • 利用側はwhileループで待つだけ
  • 公開している情報が最小限
    • UniTaskだけしか公開してない
    • Buttonの情報は隠蔽されている

まとめ

ボタンを待つ方法は色々ありますが、この書き方はかなりシンプルなのでおすすめです。

Discussion