1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity】最後のビルドをエディタから実行する

Posted at

概要

最後のビルドの動作を見たいときに、出力フォルダを開くのがめんどくさかったり、そもそも出力フォルダがどれだったか分からなくなるので、エディタ拡張で最後のビルドを実行する機能を作りました。
その過程で躓いたところも備忘録的にまとめます。

さくっと機能を使いたい方は、UnityPackageManagerで以下URLを「Add package from git URL...」してください。
https://github.com/udonba/Unity-RunLastBuild.git?path=Packages/RunLastBuild

image.png

機能

  • ビルドすると自動でその出力パスを記録する
  • エディタのメニューから最後のビルドを実行できる(Run Last Build)
  • 実行ファイル(.exe)なら実行し、それ以外なら出力フォルダを開く

ビルドする際は通常の操作と同じで、特別な操作は必要ありません。
通常のビルド処理に相乗りするようにしています。

解説

以下の組み合わせで実装します。

  • ビルド結果(ビルドした実行ファイルのパス)を取得する
  • パスをエディタに保持する
  • エディタから外部ファイルを実行する

ビルド結果を取得する

ビルド結果を取得するには、2つの方法があります。
① ビルド処理自体をBuildPipeline.BuildPlayerで自作し、その結果を受け取る
IPostprocessBuildWithReportインターフェースを実装し、ビルド後のコールバックで結果を取得する

今回は後者②の方法でやりました。

IPostprocessBuildWithReportでビルド結果を取得する

このインターフェースで実装するOnPostprocessBuildは、引数のBuildReport型にビルド結果が格納されています。IPostprocessBuildWithReportインターフェースを実装すればビルド後に呼び出されます。
この中身を見れば、ビルド結果を使っていろいろできます。

今回は実行ファイルのパスだけ分かれば十分なので、report.summary.outputPathを使います。

void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport report)
{
    // 出力パスを保存
    SaveOutputPath(report.summary.outputPath);
}

パスをエディタに保存する

ビルドの出力パスの取得はできました。次はこのパス文字列を、エディタに保持してもらいます。
ScriptableObjectを作成してこれに書き込みます。今回はstring型1個だけのシンプルなものを作成しました。
image.png

エディタに保持するだけなら、EditorPrefsを使う方法もあり、こっちの方が実装も楽です。しかし、EditorPrefsはプロジェクトを横断して設定を保持します。(参考記事
今回はプロジェクトごとに別個にビルドを保持させたかったので、ScriptableObjectを採用しました。

エディタから外部ファイルを実行する

Application.OpenURLを使用します。

保存されたビルド出力のパスをScriptableObjectから読み込み、これに渡してあげることで、表題の機能が実装できます。

(うろ覚えですがmac環境だとProcess.Startを使うのがめんどくさかった記憶があるので、Application.OpenURLを使っています。)

躓いたところ

report.summary.resultがビルド成否と一致しないバグ

ビルドが成功したときだけ処理したかったのですが、BuildReportにちゃんと結果が入ってませんでした。どうやらそういうバグが残っているようです。
IPostprocessBuildWithReporがそもそもビルドが成功したときしかコールバックされなかったので、今回は影響はありませんでした。

参考:[BUILDREPORT] REPORT IN IPOSTPROCESSBUILDWITHREPORT PROVIDES INCORRECT INFORMATION

Packages下にあるScriptableObjectを読み込む際は、Assets下とパスの形態が異なる

image.png
↑ エディタのProjectビューではPackages/RunLastBuild/Editor/LastBuildInfo.assetにファイルがあるように見えますが、このパスをAssetDatabase.LoadAssetAtPathメソッドに渡しても読み込めません。
Packages下のファイルをLoadAssetAtPathするには、Packages/com.udonba.runlastbuild/Editor/LastBuildInfo.assetのようなパスを渡してあげる必要があります。

参考:Using AssetDatabase.LoadAssetAtPath inside packages.

参考記事・その他

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?