本日はUnityの小ネタ枠です。
Unityでビルドの実行前または完了後に処理を行う方法についてです。
ビルドの実行前または完了後に処理を行う
ビルドの実行前に処理を行うにはIPreprocessBuildWithReportインタフェースを、完了後に処理を行うにはIPostprocessBuildWithReportインタフェースを利用します。
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
それぞれUnityEditorの名前空間を利用するため、作成したスクリプトはAssets/Editorフォルダ配下に配置する必要がある点に注意してください。

Editorフォルダ配下に配置しない場合、ビルド時に以下のようなエラーが発生します。
error CS0234: The type or namespace name 'Build' does not exist in the namespace 'UnityEditor'
ビルドの実行前に処理を行う
IPreprocessBuildWithReportインタフェースを実装すると、OnPreprocessBuild関数でビルド前の処理が実行できます。
using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; public class BuildPreProcessTest : IPreprocessBuildWithReport { // 処理の優先度(値が低いほど先に実行される) public int callbackOrder => 0; // ビルド前に実行される処理 public void OnPreprocessBuild(BuildReport report) { Debug.Log($"ビルド前の処理を行います。優先度は{callbackOrder}です"); } }
ビルドの完了後に処理を行う
IPostprocessBuildWithReportインタフェースを実装すると、OnPreprocessBuild関数でビルド前の処理が実行できます。
using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; public class BuildPostProcessTest : IPostprocessBuildWithReport { // 処理の優先度(値が低いほど先に実行される) public int callbackOrder => 0; // ビルド完了後に実行される処理 public void OnPostprocessBuild(BuildReport report) { Debug.Log($"ビルド完了後の処理を行います。優先度は{callbackOrder}です"); } }
動作確認
IPreprocessBuildWithReportとIPostprocessBuildWithReportは1つのクラスに合わせて実装することもできます。
前述のサンプルスクリプトに加えて以下のサンプルスクリプトをUnityプロジェクトに配置して動作確認を行いました。
using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; public class BuildProcessTest : IPreprocessBuildWithReport, IPostprocessBuildWithReport { // 処理の優先度(値が低いほど先に実行される) public int callbackOrder => 100; // ビルド前に実行される処理 public void OnPreprocessBuild(BuildReport report) { Debug.Log($"ビルド前の処理を行います。優先度は{callbackOrder}です"); } // ビルド完了後に実行される処理 public void OnPostprocessBuild(BuildReport report) { Debug.Log($"ビルド完了後の処理を行います。優先度は{callbackOrder}です"); } }

以下の通りビルド実行前と完了後のタイミングでcallbackOrderの優先度に従い処理が実行されました。
