(:3[kanのメモ帳]

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

(:3[kanのメモ帳]



Unityのエディタ拡張時に非同期タスクの進捗状況を表示する Progress【Unity】【エディタ拡張】


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



この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityにはエディタ拡張時に進捗を表示するための

EditorUtility.Display(Cancelable)ProgressBarという物が用意されています。

f:id:kan_kikuchi:20200330091721g:plain



そしてUnity 2020.1から、これに似た機能である

エディタ拡張時に非同期処理の進捗を表示するためのProgressが追加されました。



今回はこれを試してみようという感じの記事です。

なお、イメージとしては以下のような感じ。

f:id:kan_kikuchi:20200902073739g:plain



Progress

さっそくProgressの使い方ですが、Startで開始し、Reportで更新、Finishで終了する感じです。

//タスク開始、返り値でタスクIDの取得
int id = Progress.Start("タスク名", "タスクの説明");
//Startで受け取ったIDを使ってタスクの進捗状況を更新
Progress.Report(id, progress, "タスクの説明");
//タスクの終了(Progress.StatusにはCanceledやFailedもある)
Progress.Finish(id, Progress.Status.Succeeded);


他にもタスクの状況を取得したり、タスクをキャンセルしたりなんて事も出来ます。

//タスクの状況を取得(Running, Succeeded, Failed, Canceledがある)
Progress.Status taskStatus = Progress.GetStatus(id);
//タスクキャンセル
Progress.Cancel(id);


なお、エディタの右下で現在進行中のタスクが表示されます。

また、クリックする事で詳細を確認する事も可能です。

f:id:kan_kikuchi:20200902072913g:plain


ちなみにEditorCoroutineUtilityを使うと、

エディタ拡張時でも非同期処理(コルーチン)を簡単に実装出来ます。

(※EditorCoroutineはパッケージマネージャーからインストールする必要あり)

f:id:kan_kikuchi:20200828080630g:plain


実際にEditorCoroutineUtilityProgressを使って、

エディタ拡張で非同期処理を行い、その進捗を表示してみると以下のような感じに。


f:id:kan_kikuchi:20200902073739g:plain


一応EditorUtility.Display(Cancelable)ProgressBarで代用出来ない事もないですが、

進捗表示に画面を専有しないエラーが出ても自動で停止するなど、

使い勝手はProgressの方が良さそうでした。