はじめに
この記事は「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 を呼び出したりして位置を調整する必要がありそうです - 他にも下記のようなオープンソースで
エディタの再生ボタンの左右をエディタ拡張できます