はじめに
Unityの検索ボックスってオシャレですよね。
「これを自作のエディター拡張でも使えたらいいなぁ」と思ったので、検索ボックスを出す方法を調べてみました。
結論
EditorWindow上に検索ボックスを出すことに成功しました。
環境
Unity 5.5.0f3
Windows 10
ソースコード
下記のスクリプトをプロジェクト内のEditorフォルダ以下へ入れてください。
SearchBoxTestWindow.cs
namespace SearchBoxTest
{
using UnityEngine;
using UnityEditor;
public class SearchBoxTestWindow : EditorWindow
{
private static GUIStyle toolbarSearchField;
private static GUIStyle toolbarSearchFieldCancelButton;
private static GUIStyle toolbarSearchFieldCancelButtonEmpty;
private static int searchFieldHash = "SearchBoxTestWindow_SearchField".GetHashCode();
private string text = "";
[MenuItem("EditorWindow/SearchBoxTest")]
static void Open()
{
// ウィンドウを開く
GetWindow<SearchBoxTestWindow>();
}
void OnGUI()
{
if (toolbarSearchField == null) { toolbarSearchField = GetStyle("ToolbarSeachTextField"); }
if (toolbarSearchFieldCancelButton == null) { toolbarSearchFieldCancelButton = GetStyle("ToolbarSeachCancelButton"); }
if (toolbarSearchFieldCancelButtonEmpty == null) { toolbarSearchFieldCancelButtonEmpty = GetStyle("ToolbarSeachCancelButtonEmpty"); }
// 検索ボックスを表示
this.text = SearchField(this.text);
}
static string SearchField(string text)
{
Rect rect = GUILayoutUtility.GetRect(16f, 24f, 16f, 16f, new GUILayoutOption[]
{
GUILayout.Width(250f) // 検索ボックスのサイズ
});
rect.x += 4f;
rect.y += 4f;
int controlID = GUIUtility.GetControlID(searchFieldHash, FocusType.Passive, rect);
return (string)ToolbarSearchField(controlID, rect, text, false);
}
static string ToolbarSearchField(int id, Rect position, string text, bool showWithPopupArrow)
{
Rect position2 = position;
position2.width -= 14f;
Rect position3 = position;
position3.x += position.width;
position3.width = 14f;
text = EditorGUI.TextField(position, text, toolbarSearchField);
if (text == "")
{
GUI.Button(position3, GUIContent.none, toolbarSearchFieldCancelButtonEmpty);
}
else
{
if (GUI.Button(position3, GUIContent.none, toolbarSearchFieldCancelButton))
{
text = "";
GUIUtility.keyboardControl = 0;
}
}
return text;
}
static private GUIStyle GetStyle(string styleName)
{
GUIStyle gUIStyle = GUI.skin.FindStyle(styleName);
if (gUIStyle == null)
{
gUIStyle = EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector).FindStyle(styleName);
}
if (gUIStyle == null)
{
Debug.LogError("Missing built-in guistyle " + styleName);
gUIStyle = new GUIStyle();
}
return gUIStyle;
}
}
}
上記のソースコードを書くにあたってUnityのProjectウィンドウのソースコードを参考にしました。
https://github.com/MattRix/UnityDecompiled/blob/master/UnityEditor/UnityEditor/ProjectBrowser.cs
動かす
画面上部のメニューの 「EditorWindow/SearchBoxTest」を選択すると、検索ボックス付きのウィンドウが表示されます。
完.