【Unity】たまに聞くUniTaskとは何なのか、初心者向けに解説してみる

どうも、個人ゲーム開発者のゆみねこです。

UniTaskとか、UniRxってワードを聞いたことがありませんか?
ない? なら今覚えろ。

  • UniTaskとはなんなのか
  • 使えるとどう便利なのか
  • どう使うのか

初心者向けに解説していきます。
一筋縄ではいかない内容ですが、少しでも理解できればググンと実力が上がります。ググンと。

一度に理解できなくてもいいので、どんなものか知るだけでも挑んでみましょう!

UniTaskとは

かんたんな概要

UniTaskは、Unityで非同期処理がかんたんに実装できるライブラリです。

非同期処理ってのはシンプルに説明すると、「あるタスクが実行中に、別のタスクを実行できるようにする処理」のことです。

なんのこっちゃなので、具体的な例をあげてみます。

使いみち

  • 画像のロード中にゲームを進行する
  • エリアの切り替え前にバックグラウンドで次のエリアをロードしておく
  • サーバーからの応答を待機しつつゲームも進行する

といったように、主にロードやネットワークで使われます。
が、他にも、

  • 数秒待ってからメソッドを呼び出す
  • フェードアウト処理が終わってから操作可能にする

といったように、なにかを待機してから次に移る処理なら何にでも使えます。

async / await をそのまま使う場合との違い

過去記事でも紹介しましたが、Unity 2018.3以降なら、async / await をTaskで待機すれば、同じような使い方ができます。

ですが、TaskはWebGLだと動かないという大きなデメリットがあります。
unityroomで公開したいときには使えません。

また、TaskはC#の機能であり、Unityに最適化されていません。
例えば、「次のフレームまで待機」させたい場合、コルーチンなら、

なんて書き方ができますが、Taskにはありません。

更に、Unityには「AsyncOperation」という、なにやらかっこいい名前のクラスが用意されています。
SceneManagerやResourcesの非同期ロード処理に使われているのですが、これをawaitで待機することはできません(なんでだよ)

これらの問題を、UniTaskは全て解決してくれます。

「async / await をUnityで気兼ねなく使えるようにしよう!」
というコンセプトのライブラリです。素晴らしいですね。

繰り返しになりますが、async / await が分からないという方は、過去記事でかんたんに説明しています。

【Unity】ほんの数行! 簡単にウェイト処理を実装する方法4つ

導入方法

https://github.com/Cysharp/UniTask/releases

  1. 最新のunitypackageをダウンロード
  2. 導入したいUnity Projectを開き、unitypackageファイルをダブルクリックするか、Editorにドロップ
スポンサードサーチ

使い方

シンプルに待機する

async / await をナマで使った時と比較してみてください。

TaskがUniTaskに変わっただけです。
なにこれ超シンプル。

たったこれだけで、WebGLで動くようになるのです。
(あ、UniTaskを使うためのusing UniRx.Asyncも必要でしたね)。

フレームベースで待機する

Taskには「次のフレームまで待機」がないと書きました。

UniTaskに任せろ

UniTask.DelayFrame( フレーム数 )
で待機できます。

1なら次のフレームまで、100なら100フレーム待機します。

Unityの非同期処理に使う

さっき、以下の記述ではエラーを吐くと言いましたよね。

なんとびっくり、using UniRx.Asyncをつけるだけで動くようになります。

コルーチンを待機させる

とあるUnityエンジニア
とあるUnityエンジニア

たしかに便利だね。でもすでにコルーチンを使っちゃってるから、差し替えがめんどうだなあ。

UniTask
UniTask

任せろ

なんと、await にコルーチンのメソッドを指定できます。

これにより、すでにがっつりコルーチンを組んじゃったProjectであっても、かんたんにasync / await に切り替えることができます。

まとめ

  • 非同期処理をしたいなら、とりあえず async / await が便利
  • UniTaskを使うともっと便利
  • WebGLでビルドしたいなら必須!

どうですか?

「非同期だのasyncだの、何言ってるんだこいつら……」
という初心者さんの苦手意識が、少しでも和らいだなら幸いです。

というか、非同期もasync / await もめちゃくちゃ奥が深いし、ぼくも完全に理解しているわけじゃありません。

まずは簡単なものから、実践的な方法だけを学び、後から少しずつ理解を深めていきましょう。

記事をシェアする