(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


UniTaskで任意のタイミングでタスクを完了できる UniTaskCompletionSource【Unity】【UniTask】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2022.3.32f1
UniTask 2.5.5


はじめに

UnityはUniTaskというパッケージを使えば「待つ」という処理が簡単に実装出来ます。




例えば「1秒待機」「メソッドの処理が終わるまで待つ」みたいな事も以下のような感じに。

private async UniTaskVoid Start(){
  //SampleMethodの処理が終わるのをまってから後続処理をする
  await SampleMethod();

  /*後続の処理*/
}

public async UniTask SampleMethod() {
  /*なにか処理1*/

  //1秒待機
  await UniTask.Delay(TimeSpan.FromSeconds(1.0f));

  /*なにか処理2*/
}


ただこの書き方だと、メソッド外の処理などを待つみたいな実装は難しいです。

という事で今回は、UniTaskで任意のタイミングでタスクを完了する方法の紹介です!


なお、記事中では以下のアセットを使っています。

Clean & Minimalist GUI Pack|2D GUI|Unity Asset Store



UniTaskで任意のタイミングでタスクを完了する方法

さっそくですが、今回はUniTaskCompletionSourceというクラスを使います。



このクラスは任意のタイミングで完了させる事ができ、Taskを返す事でその完了まで待つ事が出来ます。

private UniTaskCompletionSource _source;
private UniTask WaitSource() {
  _source = new UniTaskCompletionSource();
  return _source.Task;//タスクが完了するまで待つ
}
//好きなタイミングで完了させられる
_source.TrySetResult();


例えば「ボタンが押されるまで処理を待つ」という実装は以下のようになります。

public UnityEngine.UI.Button _button;
private UniTaskCompletionSource _buttonClickSource;

private async UniTaskVoid Start() {
  //ボタンのクリックイベントを別メソッドで処理
  _button.onClick.AddListener(OnButtonClick);

  //ボタンのクリックを待機
  Debug.Log("ボタンのクリックの待機開始");
  await WaitForButtonClick();
  Debug.Log("ボタンがクリックの待機終了");
}

//ボタンのクリックを待つ用のメソッド
private UniTask WaitForButtonClick() {
  _buttonClickSource = new UniTaskCompletionSource();
  return _buttonClickSource.Task;
}

//ボタンがクリックされたときの処理
private void OnButtonClick(){
  Debug.Log("ボタンがクリックされました!");
  _buttonClickSource.TrySetResult();
}


なお、ボタンのクリックを待つだけなら、button.OnClickAsyncという拡張メソッドの方が簡単なので、

あくまでこんな風に使えるというイメージです。