UnityのBuildSettingsにプロジェクト専用のオプションを追加してみます。メニューや設定用のウインドウを用意するよりも導線が綺麗になります。

CustomBuildPlayerWindowクラスの実装
拡張したBuildSettingsの実装はこちら。スクリプトをプロジェクトにいれるとBuildSettingsが上記スクリーンショットのものに入れ替わります。
using System.Linq; using System.Reflection; using UnityEngine; using UnityEditor; class CustomBuildPlayerWindow : BuildPlayerWindow { System.Action m_BaseOnGUI; [InitializeOnLoadMethod] static void OnLoad() { EditorApplication.update += () => { var buildPlayerWindow = Resources.FindObjectsOfTypeAll<BuildPlayerWindow>().FirstOrDefault(); if (buildPlayerWindow != null && !(buildPlayerWindow is CustomBuildPlayerWindow)) { var customWindow = GetWindow<CustomBuildPlayerWindow>(typeof(BuildPlayerWindow)); buildPlayerWindow.Close(); customWindow.Show(); } }; } private void OnGUI() { GUILayout.BeginHorizontal(); if (m_BaseOnGUI == null) { var onGUIMethod = typeof(BuildPlayerWindow).GetMethod("OnGUI", BindingFlags.Instance | BindingFlags.NonPublic); m_BaseOnGUI = onGUIMethod.CreateDelegate(typeof(System.Action), this) as System.Action; } m_BaseOnGUI(); GUI.enabled = true; GUILayout.BeginVertical(GUILayout.Width(300)); GUILayout.Space(2); GUILayout.Label("Additional Options", EditorStyles.boldLabel); AdditionalOptionsGUI(); GUILayout.Space(10); GUILayout.EndVertical(); GUILayout.Space(10); GUILayout.EndHorizontal(); } void AdditionalOptionsGUI() { EditorGUILayout.Toggle("Run Tests", true); EditorGUILayout.Toggle("Clean Build", false); EditorGUILayout.Toggle("Build Asset Bundles", false); EditorGUILayout.Toggle("Include Awesome Assets", true); GUILayout.FlexibleSpace(); GUILayout.Label("Do not go gentle into that good night,\nOld age should burn and rave at close of day,\nRage, rage against the dying of the light.\n\nDylan Thomas - 1914-1953", EditorStyles.helpBox); } }
実装の説明
BuildSettingsはBuildPlayerWindowに実装されているので派生クラスを作ります。
class CustomBuildPlayerWindow : BuildPlayerWindow { ... }
次に用意したウインドウを開く処理を作ります。従来通りGetWindowを使ってウインドウを開いても良いのですが、「どこから開くんだっけ・・・?」というのを避けたいのが趣旨にありますので、ここは工夫して開かれたBuildPlayerWindowをCustomBuildPlayerWindowに置き換えるようにします。
[InitializeOnLoadMethod] static void OnLoad() { EditorApplication.update += () => { var buildPlayerWindow = Resources.FindObjectsOfTypeAll<BuildPlayerWindow>().FirstOrDefault(); if (buildPlayerWindow != null && !(buildPlayerWindow is CustomBuildPlayerWindow)) { var customWindow = GetWindow<CustomBuildPlayerWindow>(typeof(BuildPlayerWindow)); buildPlayerWindow.Close(); customWindow.Show(); } }; }
これで見た目はBuildSettingsと変わらないCustomBuildPlayerWindowが表示されるようになりました。
あとはOnGUIを実装すれば完成です。BuildPlayerWindowのOnGUIはプライベートなのでReflectionを使って呼び出します。
System.Action m_BaseOnGUI; void OnGUI() { if (m_BaseOnGUI == null) { var onGUIMethod = typeof(BuildPlayerWindow).GetMethod("OnGUI", BindingFlags.Instance | BindingFlags.NonPublic); m_BaseOnGUI = onGUIMethod.CreateDelegate(typeof(System.Action), this) as System.Action; } m_BaseOnGUI(); ...
以前紹介したBuildPlayerWindow.RegisterBuildPlayerHandlerと相性が良いです。