🪤

BuildPlayerWindow.RegisterBuildPlayerHandlerはプロジェクト内で択一

2023/04/02に公開

API紹介

BuildPlayerWindow.RegisterBuildPlayerHandler

このAPIを使うとEditorのBuildBuild And Runをフックして動作を上書きできます。
逆に言うと「Editor上のボタン」しかフックしていないのでCLIからビルドした場合はここを通りません。

検証

今回は1つのプロジェクト内で複数回コールバックを登録してみます。[1]

Scripts

ScriptA
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class ScriptA
{
    static ScriptA()
    {
        BuildPlayerWindow.RegisterBuildPlayerHandler(OnBuild);
    }

    private static void OnBuild(BuildPlayerOptions options)
    {
        Debug.Log(nameof(ScriptA));
    }
}
BとCはコピペなので折りたたみ
ScriptB
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class ScriptB
{
    static ScriptB()
    {
        BuildPlayerWindow.RegisterBuildPlayerHandler(OnBuild);
    }

    private static void OnBuild(BuildPlayerOptions options)
    {
        Debug.Log(nameof(ScriptB));
    }
}
ScriptC
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class ScriptC
{
    static ScriptC()
    {
        BuildPlayerWindow.RegisterBuildPlayerHandler(OnBuild);
    }

    private static void OnBuild(BuildPlayerOptions options)
    {
        Debug.Log(nameof(ScriptC));
    }
}

結果

この状態でBuildボタンを実行するとこういうログが出ます。

3つともコピペなので同じことをしているはずなのに、ログが出ているのはScriptCだけ……。
つまりプロジェクトの中で複数のクラスがBuildPlayerWindow.RegisterBuildPlayerHandlerに登録した場合、そのうちの1つしか実行されないのです。どれを実行するかはEditorのお気持ち次第ですが、おそらく後勝ちだと思います。

……まあ The build player handler in BuildPlayerWindow is being reassigned! ってWarningログが出てるので驚くのがまずおかしくて、悪いのはEditorではなく目の前のエラーメッセージを読めないおろかな人間なのはそう……。

まとめ

ビルドに関する処理をフックしたいときは IPreprocessBuildWithReportIPostprocessBuildWithReport を使って、あと、ログはちゃんと……ちゃんと読みましょう……特に黄色とか赤色のやつ……。

おしまい。

脚注
  1. 実際にビルドされると面倒なのでログを出すだけに留めています。 ↩︎

Discussion