🦔
UniTaskでボタンの入力を1行で待つ
はじめに
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