2023年アドベントカレンダー 11日目の記事です。
はじめに
ビルドの生成物をZipした後にアップロードを頻繁に行うユースケースと遭遇したので出来るだけ作業が楽になる方法を考えて見ました。
今回紹介するのはビルド終了時にモーダルを表示し、はい
を選択すると./Build/Build_プロジェクト名_ビルド終了時間.zip
のファイルを生成するEditor拡張の作成例になります。
ビルド後に表示されるモーダルはこのような見た目になります。
ソース例
Editor拡張用のスクリプトとなるため、例の如くプロジェクト内の任意の場所にEditor
ディレクトリを作成し、その中に入れて利用してください。
#if UNITY_EDITOR
using System.IO;
using System.IO.Compression;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
/// <summary>
/// ビルド完了時にZipファイルを作成できるEditor拡張
/// </summary>
public class PostprocessBuildZip : IPostprocessBuildWithReport
{
// ビルド完了コールバックの優先順位
public int callbackOrder { get { return 0; } }
/// <summary>
/// ビルド完了時にZipファイルを作成する
/// </summary>
/// <param name="report"></param>
public void OnPostprocessBuild(BuildReport report)
{
// ダイアログが表示されたことを音を鳴らしてユーザーに知らせる
EditorApplication.Beep();
// ユーザーにZipファイルを作成するかどうか確認するダイアログを表示
bool isCreateZip = EditorUtility.DisplayDialog(
"Zipファイルの作成",
"ビルドが完了しました。Zipファイルを作成しますか?",
"はい",
"いいえ"
);
// ユーザーが「はい」を選択した場合のみ処理を続行
if (isCreateZip)
{
// プロジェクト名の取得
var directoryInfo = new DirectoryInfo(Application.dataPath).Parent;
string projectName = directoryInfo!.Name;
// 現在の日時をフォーマット
string dateTimeFormat = report.summary.buildEndedAt.ToString("yyMMddHHmmss");
// "Build"サブディレクトリのパス
string buildDirectory = Path.Combine("./", "Build");
// ディレクトリが存在しない場合は作成
if (!Directory.Exists(buildDirectory))
{
Directory.CreateDirectory(buildDirectory);
}
// Zipファイルの生成
string userSettingBuildPath = report.summary.outputPath; // ユーザーが指定したビルド先のパス
string zipFileName = $"Build_{projectName}_{dateTimeFormat}.zip"; // Zipファイル名
string zipPath = Path.Combine(buildDirectory, zipFileName);
ZipFile.CreateFromDirectory(userSettingBuildPath, zipPath);
Debug.Log("Build zip created at: " + zipPath);
}
}
}
#endif
主要部分の解説
IPostprocessBuildWithReport
ビルドプロセスが完了した直後に実行されるメソッドOnPostprocessBuild
とcallbackOrder
のプロパティが定義されており、今回最も重要な箇所になります。
このInterfaceを実装することによりビルド後の処理が実行可能になります。
OnPostprocessBuild
ビルド後に呼ばれるメソッドです。
引数としてビルド情報BuildReport
を受け取っているので、ここからユーザーが指定したビルド先のパスやビルド終了時間を取得しています。
callbackOrder
複数のクラスでIPostprocessBuildWithReport
が定義されていた場合の優先度です。
小さい方が優先度が高いです。
最後に
OnPostprocessBuildの中でビルド生成物をサーバーにアップロードしたり、バックエンドAPIを叩いたりできそうなので、かなり応用が効きそうだと思いました。
よろしければ本記事を参考に色々試してみてください。