yotiky Tech Blog

とあるエンジニアの備忘録

Unity ビルドの前後に処理を実行する

ビルド前処理は IPreprocessBuildWithReport 、ビルド後処理は IPostprocessBuildWithReport を実装する。
作成したファイルを Editor フォルダに入れる。

public class BuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
{
    // 実行される順番
    public int callbackOrder => 0;

    // ビルド前処理
    public void OnPreprocessBuild(BuildReport report)
    {
    }

    // ビルド後処理
    public void OnPostprocessBuild(BuildReport report)
    {
    }
}

ビルド前に外部の exe ファイルを実行する

ビルド前に外部の exe ファイルを実行する場合の実装例。

Process.Start の引数の fileName相対パスでも大丈夫だが、ProcessInfo を使う場合は、ファイル名単体かフルパスじゃないと動かない。

Arguments でパスを使用する場合は、CurrentDirectory = Unity プロジェクトのルートフォルダからの相対パスが使える。

    public void OnPreprocessBuild(BuildReport report)
    {
        var info = new ProcessStartInfo();
        info.FileName = "cmd.exe";
        info.Arguments = $"/c cd";
        info.WorkingDirectory = Environment.CurrentDirectory;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        info.UseShellExecute = false;
        info.RedirectStandardOutput = true;

        Process process = null;
        try
        {
            process = Process.Start(info);

            Debug.Log(process.StandardOutput.ReadToEnd());
            process.WaitForExit();
        }
        catch(Exception e)
        {
            throw new BuildFailedException(e);
        }
        finally
        {
            if (process != null)
            {
                if (!process.HasExited)
                {
                    process.Kill();
                }
                process.Dispose();
                process = null;
            }
        }
    }