LoginSignup
8
8

More than 5 years have passed since last update.

【UnityEditor】 Unityの検索ボックスを使う

Last updated at Posted at 2017-01-27

はじめに

Unityの検索ボックスってオシャレですよね。
「これを自作のエディター拡張でも使えたらいいなぁ」と思ったので、検索ボックスを出す方法を調べてみました。
Unity_SearchBox.png

結論

EditorWindow上に検索ボックスを出すことに成功しました。
search_box.gif

環境

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」を選択すると、検索ボックス付きのウィンドウが表示されます。

image

image

完.

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8