はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】キャッシュされたビルドの成果物を削除してからビルドする方法(BuildOptions.CleanBuildCache)

はじめに

Unity2021.3あたり?からインクリメントビルドが導入されました。

開発中のイテレーションを高速化するために、Unity はインクリメンタルな (増分) ビルドパイプラインを使用しており、アプリケーションの一部が前回のビルド以降に変更された場合のみ再ビルドされます。これには、アセットシリアライゼーション、コードコンパイル、データ圧縮、署名などのビルドステップが含まれます。

docs.unity3d.com

しかし以下のような場合においては問題になってしまいます。

一般に、インクリメンタルビルド後に期待した変更がなく、インクリメンタルビルドパイプラインに問題があると考えられる場合は、クリーンビルドを作成します。この問題の最も一般的な理由は、アセットに影響を与えるビルドプロセスのコールバックの実装または変更によるものです。

その対処法として今までのビルドによって生成されたキャッシュを削除する方法を二つ紹介します。

やり方

Build Settingsを利用する場合

Build SettingsBuildのポップアップメニューからClean Build...を選択します。

Clean Build

BuildPipeline.BuildPlayerを利用する場合

BuildPipeline.BuildPlayerを実行する際、BuildOptions.CleanBuildCacheを指定してあげます。

[MenuItem("Tools/Build StandaloneOSX")]
public static void Build()
{
    // locationPathName : 保存先のパス(プロジェクトフォルダからの相対パス)
    // options : BuildOptions.CleanBuildCacheを指定することで「キャッシュを削除して」ビルドできる
    // scenes : ビルドに含めるシーンのプロジェクトフォルダからの相対パス(空の場合、現在開いているシーン)
    // target : どのプラットフォームか
    var options = new BuildPlayerOptions()
    {
        locationPathName = "Build/App.exe",
        options = BuildOptions.CleanBuildCache,
        scenes = EditorBuildSettings.scenes.Select(x => x.path).ToArray(),
        target = BuildTarget.StandaloneOSX,
    };

    var buildReport = BuildPipeline.BuildPlayer(options);

    if (buildReport.summary.result == BuildResult.Succeeded)
    {
        Debug.Log($"Build Succeeded. : {buildReport.summary.outputPath}");
    }
    else
    {
        Debug.Log("Build Failed.");
    }
}