この記事でのバージョン
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という拡張メソッドの方が簡単なので、
あくまでこんな風に使えるというイメージです。