🪤
BuildPlayerWindow.RegisterBuildPlayerHandlerはプロジェクト内で択一
API紹介
BuildPlayerWindow.RegisterBuildPlayerHandler
このAPIを使うとEditorのBuild
とBuild 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ではなく目の前のエラーメッセージを読めないおろかな人間なのはそう……。
まとめ
ビルドに関する処理をフックしたいときは IPreprocessBuildWithReport と IPostprocessBuildWithReport を使って、あと、ログはちゃんと……ちゃんと読みましょう……特に黄色とか赤色のやつ……。
おしまい。
-
実際にビルドされると面倒なのでログを出すだけに留めています。 ↩︎
Discussion