2.5.4UniTaskのキャンセルの基本UniTaskは、完了までに時間がかかる非同期処理です。非同期処理を実行する際、ある条件でその処理を完了前に取りやめたいことが良くあります。サーバーからデータを取得しようとしたが、取得に時間がかかりすぎている場合に取得を中止し、通信に失敗した旨をユーザーに伝えたい場合です。今回は、UniTaskの実行中にその処理を中止する方法について学んでいきます。オブジェクトを使用してキャンセルすることができます。例として、次のコードを作成し、適当なオブジェクトにアタッチして実行しましょう。finished!");}}C#実行してから何もせずにいると、指定した秒数でタイマーが終了します。実行してから、指定秒数が経過するまでにスペースキーを押すとタイマーが途中で止まります。UniTaskがキャンセルされる仕組みについてみていきます。オブジェクトを要求します。オブジェクトはUniTaskのキャンセルを引き起こすオブジェクトであり、様々な方法で作成することができます。オブジェクトを取得しています。メソッドに渡されます。例外を送出し、処理を中断させす。メソッドが呼び出されたときに、キャンセルされます。オブジェクトがキャンセルされるようになっています。メソッドがキャンセルされます。メソッドを呼び出すようにします。呼び出してキャンセルもしておきます。渡されたUniTaskの処理がプログラムの終わりで終了することを保証するためです。これについては、後に詳しく学びます。例外が送出されることで引き起こされます。構文により、UniTaskがキャンセルされたときの動作を記述することができます。使用すれば、キャンセルされたかされていないかに関わらず、必ず実行したい処理を記述することもできます。よって再度例外をするかどうかによって、処理の挙動が変わります。次の二つのコードはキャンセル時に異なる結果を示します。method”が表示されませんが、2つ目のコードでは表示されます。文以降の処理が例外の影響を受けないためです。文でキャッチすることでUniTaskがキャンセルされた場合の処理を記述する場合は、そのキャンセルをなかったことにしたいのか、他の場所へそのキャンセルを伝播させたいのかを場面に合わせて考える必要があります。例外が送出することで引き起こされていました。オブジェクトがキャンセルされているかを確認し、例外を送出することもできます。より確認し、キャンセルされている場合に例外を送出しています。これは、次のような書き方もできます。渡した場合とは少し挙動が異なることに注意してください。指定秒数を長めに設定すると、違いが分かりやすいです)。インスタンスから取得していました。取得する方法があります。ここからは、それらについて学習します。インスタンスから取得する方法です。使用した非同期処理のキャンセルに使われます。名前空間で定義されています。UniTaskから変換して取得することができます。キャンセルされるのは、変換元のUniTaskが終了したときです。B)で指定して、2回呼び出しています。BのUniTaskに渡されています。AのUniTaskの方が先に終了します。BのUniTaskがキャンセルされます。取得元のGameObjectが破棄されるとき、キャンセルされます。オブジェクトを得ています。メソッドに渡しています。破棄するようにしています。そのため、上の例ではオブジェクトの破棄と同時にUniTaskがキャンセルされています。後に学習しますが、すべてのUniTaskは、それが不必要になったときに必ずキャンセルされることを保証しなければなりません。しなければ、リソースリークを引き起こすかもしれないからです。UniTaskが不必要になるタイミングでよくあるのは、現在のシーンから新たなシーンへと移行するときです。シーンの遷移時、そのシーンでのみ必要なUniTaskは、新たなシーンではすべて不必要になるためキャンセルされる必要があります。UniTaskに渡して実行すると、そのUniTaskはシーン遷移時、自動的にキャンセルされることになります。組み合わせて同様のことができますが、コードは冗長になります。渡すことで、UniTaskの実行をキャンセルできることを学習しました。UniTaskにキャンセルのために渡すオプションの引数と考えるよりは、特別な理由がない限りは必ず渡す引数であると考えた方が良いです。すべてのUniTaskは、それが不必要になったときに、キャンセルされたか正常に完了したかを問わず処理が終了していることを保証しなければならないからです。不必要になったUniTaskを必ず終了させないといけない理由を理解するため、1つの例を見てみます。メソッドは、指定されたメッセージを1秒ごとに、永遠に表示し続けるUniTaskです。メソッドでは、このメソッドを呼び出し、1秒後に現在のシーンを再度読み込むという処理を行っています。これを実行すると、以下のような結果になります。結果からわかる通り、シーンの遷移が発生したとしても、UniTaskの処理は終わりません。シーンを新たに読み込むごとに、実行中であるUniTaskの数は際限なく増えていきます。ここでは明らかなリソースリークが発生しており、そのうちメモリ不足によりアプリケーションはクラッシュするかもしれません。重要なのは、UniTaskと、それを呼び出したGameObjectの寿命の間には何にも関係がないということです。新たなシーンが読み込まれ、UniTaskを呼び出したGameObjectが破棄されたとしても、UniTaskは残り続けます。そのため、UniTaskが不必要になった時点で、リソースリークを避けるため、処理が完了していないUniTaskはキャンセルし、その処理が終了することを保証する必要があるのです。上のコードを正しく書き直すと、次のようになります。キャンセルされ、古いシーンで呼び出されたUniTaskが停止することを保証することができます。結果を見ても、シーンが切り替わった時点で、古いシーンからのメッセージの表示は停止していることがわかります。繰り返しますが、すべてのUniTaskについて、それが不必要になったときにその処理が停止していることを保証しなければなりません。永遠に終了しないUniTaskが残り続けると、そのうち実行中のUniTaskの数が膨大になってアプリケーションのクラッシュを引き起こしたり、あるいは意図せずに残っているUniTaskにより、意図しない動作が引き起こされたりするかもしれないからです。渡し、そのシーンの終了時にはキャンセルされるようにしなければいけません。TrackerすべてのUniTaskが、処理を完了もしくは適切にキャンセルされることを保証しようとしても、意図せずに残り続けるUniTaskが生まれてしまうことは良くあります。Trackerによって、意図せずに動作が続いているUniTaskがないかどうかをチェックすることができます。Trackingを有効にしたうえで、悪いコードと良いコードのそれぞれを実行してみます。悪いコードの実行時にはPending状態のUniTaskが続々と増えていき、良いコードの実行時には、新たなPending状態のUniTaskが出現すると同時に、古いUniTaskがCanceled状態になって停止していることがわかります。Trackerにより、適切に停止していないUnitaskがないかどうかをチェックすると良いでしょう。Cがそれぞれキャンセルされるようにしましょう。メソッドはキャンセルされるまでは終了しないUniTaskです。指定したフレーム分だけ遅延させるUniTaskで、ライブラリのUniTaskから提供されています。使用してUniTaskをキャンセルできるようにしましょう。インターフェースを実装するため)を忘れないようにしましょう。よって、不要になった時点で二つのUniTaskの処理が停止することを保証します。伊都アキラ関連記事UniTask【UniTask】UniTask非同期処理入門Unityにおいて効率的に非同期処理を行うためのライブラリであるUniTaskの入門解説です。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。認証期間が終了しました。ページを再読み込みしてください。Dotprologue.メニューホームダウンロード運営者情報お問い合わせEnglishホーム検索トップサイドバ。