はじめに
この記事は「Unity Advent Calendar 2019」の 12/6 の記事です
上記の「CustomToolbar」を Unity プロジェクトに導入することで
エディタの再生ボタンの左右に独自の GUI を追加することができます
使用例
使い方
「CustomToolbar」を Unity プロジェクトに導入すると、
デフォルトで上記のような GUI がサンプルで追加されているので、
Assets/Editor/Editor/PlayFromStartScene.cs Assets/Editor/Editor/RestartPlayMode.cs Assets/Scenes
上記のファイルやフォルダを削除して
必要なスクリプトだけを残します
using UnityEditor; | |
using UnityEngine; | |
using UnityToolbarExtender; | |
[InitializeOnLoad] | |
public static class Example | |
{ | |
static Example() | |
{ | |
// 再生ボタンの左側に GUI を追加する | |
ToolbarExtender.LeftToolbarGUI.Add( OnLeftToolbarGUI ); | |
// 再生ボタンの右側に GUI を追加する | |
ToolbarExtender.RightToolbarGUI.Add( OnRightToolbarGUI ); | |
} | |
// 再生ボタンの左側に GUI を追加する | |
private static void OnLeftToolbarGUI() | |
{ | |
// GUI を詰めて表示するために FlexibleSpace を呼び出しておく | |
GUILayout.FlexibleSpace(); | |
// ボタンを表示する | |
if ( GUILayout.Button( "ピカチュウ" ) ) | |
{ | |
Debug.Log( "ピカチュウ" ); | |
} | |
} | |
// 再生ボタンの右側に GUI を追加する | |
private static void OnRightToolbarGUI() | |
{ | |
// ボタンを表示する | |
if ( GUILayout.Button( "ピカチュウ" ) ) | |
{ | |
Debug.Log( "ピカチュウ" ); | |
} | |
// GUI を詰めて表示するために FlexibleSpace を呼び出しておく | |
GUILayout.FlexibleSpace(); | |
} | |
} |
あとは、上記のようなスクリプトを Editor フォルダに追加することで
エディタの再生ボタンの左右に独自の GUI を追加することができます
サンプル
using System.Reflection; | |
using UnityEditor; | |
using UnityEngine; | |
using UnityToolbarExtender; | |
[InitializeOnLoad] | |
public static class Example | |
{ | |
static Example() | |
{ | |
// 再生ボタンの左側に GUI を追加する | |
ToolbarExtender.LeftToolbarGUI.Add( OnLeftToolbarGUI ); | |
// 再生ボタンの右側に GUI を追加する | |
ToolbarExtender.RightToolbarGUI.Add( OnRightToolbarGUI ); | |
} | |
// 再生ボタンの左側に GUI を追加する | |
private static void OnLeftToolbarGUI() | |
{ | |
// GUI を詰めて表示するために FlexibleSpace を呼び出しておく | |
GUILayout.FlexibleSpace(); | |
// Save Project を実行するボタンを表示する | |
if ( IconButton( "SaveActive" ) ) | |
{ | |
EditorApplication.ExecuteMenuItem( "File/Save Project" ); | |
} | |
// Project Settings を開くボタンを表示する | |
if ( IconButton( "EditorSettings Icon" ) ) | |
{ | |
EditorApplication.ExecuteMenuItem( "Edit/Project Settings..." ); | |
} | |
// 空のゲームオブジェクトを作成するボタンを表示する | |
if ( IconButton( "GameObject Icon" ) ) | |
{ | |
EditorApplication.ExecuteMenuItem( "GameObject/Create Empty Child" ); | |
} | |
// 新しいフォルダを作成するボタンを表示する | |
if ( IconButton( "Folder Icon" ) ) | |
{ | |
EditorApplication.ExecuteMenuItem( "Assets/Create/Folder" ); | |
} | |
#if UNITY_2019_1_OR_NEWER | |
// Unity 2019 だと上記のボタンが再生ボタンと重なってしまうため | |
// 少し間隔を開けるために GUILayout.Space を呼び出す | |
GUILayout.Space( 20 ); | |
#endif | |
} | |
// 再生ボタンの右側に GUI を追加する | |
private static void OnRightToolbarGUI() | |
{ | |
// Inspector をロック / アンロックするボタンを表示する | |
if ( TextButton( "Lock" ) ) | |
{ | |
var tracker = ActiveEditorTracker.sharedTracker; | |
tracker.isLocked = !tracker.isLocked; | |
tracker.ForceRebuild(); | |
} | |
// Inspector の Debug モードの ON / OFF を切り替えるボタンを表示する | |
if ( TextButton( "Debug" ) ) | |
{ | |
var window = Resources.FindObjectsOfTypeAll<EditorWindow>(); | |
var inspectorWindow = ArrayUtility.Find( window, c => c.GetType().Name == "InspectorWindow" ); | |
if ( inspectorWindow == null ) return; | |
var inspectorType = inspectorWindow.GetType(); | |
var tracker = ActiveEditorTracker.sharedTracker; | |
var isNormal = tracker.inspectorMode == InspectorMode.Normal; | |
var methodName = isNormal ? "SetDebug" : "SetNormal"; | |
var attr = BindingFlags.NonPublic | BindingFlags.Instance; | |
var methodInfo = inspectorType.GetMethod( methodName, attr ); | |
methodInfo.Invoke( inspectorWindow, null ); | |
tracker.ForceRebuild(); | |
} | |
GUILayout.FlexibleSpace(); | |
} | |
// アイコン付きのボタンを表示する | |
private static bool IconButton( string name ) | |
{ | |
var content = EditorGUIUtility.IconContent( name ); | |
return GUILayout.Button( content, GUILayout.Width( 32 ), GUILayout.Height( 22 ) ); | |
} | |
// テキスト付きのボタンを表示する | |
private static bool TextButton( string text ) | |
{ | |
return GUILayout.Button( text, GUILayout.Height( 22 ) ); | |
} | |
} |
自分は上記のようなスクリプトを Editor フォルダに追加して
- Save Project を実行
- Project Settings を開く
- 空のゲームオブジェクトを作成
- 新しいフォルダを作成
- Inspector をロック / アンロックする
- Inspector の Debug モードの ON / OFF を切り替える
このようなコマンドを実行できるようにしています
補足
- GUILayout や EditorGUILayout を表示する GUI の位置を調整したい場合は
ToolbarExtender.cs の OnGUI 関数の中の Rect の計算式を調整します - 現状 Unity 2019 だと GUI の位置が少しずれて表示されてしまうようなので
ToolbarExtender.cs の OnGUI 関数の中の Rect の計算式を調整したり
GUILayout.Space を呼び出したりして位置を調整する必要がありそうです - 他にも下記のようなオープンソースで
エディタの再生ボタンの左右をエディタ拡張できます