コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】エディタの再生ボタンの左右に独自の GUI を追加する

はじめに

この記事は「Unity Advent Calendar 2019」の 12/6 の記事です

上記の「CustomToolbar」を Unity プロジェクトに導入することで
エディタの再生ボタンの左右に独自の GUI を追加することができます

使用例

f:id:baba_s:20191114142056p:plain

f:id:baba_s:20191114141436p:plain

使い方

f:id:baba_s:20191120140803p:plain

「CustomToolbar」を Unity プロジェクトに導入すると、
デフォルトで上記のような GUI がサンプルで追加されているので、

f:id:baba_s:20191120140957p:plain

Assets/Editor/Editor/PlayFromStartScene.cs
Assets/Editor/Editor/RestartPlayMode.cs
Assets/Scenes

上記のファイルやフォルダを削除して

f:id:baba_s:20191120141106p:plain

必要なスクリプトだけを残します

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();
}
}
view raw Example.cs hosted with ❤ by GitHub

あとは、上記のようなスクリプトを Editor フォルダに追加することで

f:id:baba_s:20191120141517p:plain

エディタの再生ボタンの左右に独自の 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 ) );
}
}
view raw Example.cs hosted with ❤ by GitHub

自分は上記のようなスクリプトを Editor フォルダに追加して

f:id:baba_s:20191114141436p:plain

  • Save Project を実行
  • Project Settings を開く
  • 空のゲームオブジェクトを作成
  • 新しいフォルダを作成
  • Inspector をロック / アンロックする
  • Inspector の Debug モードの ON / OFF を切り替える

このようなコマンドを実行できるようにしています

補足

関連記事