LoginSignup
2
1

【Unity】ビルド完了後に自動でZipファイルを作成する方法

Posted at

2023年アドベントカレンダー 11日目の記事です。

はじめに

ビルドの生成物をZipした後にアップロードを頻繁に行うユースケースと遭遇したので出来るだけ作業が楽になる方法を考えて見ました。
今回紹介するのはビルド終了時にモーダルを表示し、はいを選択すると./Build/Build_プロジェクト名_ビルド終了時間.zipのファイルを生成するEditor拡張の作成例になります。

ビルド後に表示されるモーダルはこのような見た目になります。

image.png

ソース例

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

ビルドプロセスが完了した直後に実行されるメソッドOnPostprocessBuildcallbackOrderのプロパティが定義されており、今回最も重要な箇所になります。
このInterfaceを実装することによりビルド後の処理が実行可能になります。

OnPostprocessBuild

ビルド後に呼ばれるメソッドです。
引数としてビルド情報BuildReportを受け取っているので、ここからユーザーが指定したビルド先のパスやビルド終了時間を取得しています。

callbackOrder

複数のクラスでIPostprocessBuildWithReportが定義されていた場合の優先度です。
小さい方が優先度が高いです。

最後に

OnPostprocessBuildの中でビルド生成物をサーバーにアップロードしたり、バックエンドAPIを叩いたりできそうなので、かなり応用が効きそうだと思いました。
よろしければ本記事を参考に色々試してみてください。

2
1
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
2
1