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

#はじめに
Unityの検索ボックスってオシャレですよね。
「これを自作のエディター拡張でも使えたらいいなぁ」と思ったので、検索ボックスを出す方法を調べてみました。
![Unity_SearchBox.png](https://qiita-image-store.s3.amazonaws.com/0/44288/a5ecf5c4-9d1d-151c-db47-8819aa4baffc.png)

# 結論
EditorWindow上に検索ボックスを出すことに成功しました。
![search_box.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/6b0b5cdf-16de-ffc4-a3fe-3ea57d9eb307.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](https://qiita-image-store.s3.amazonaws.com/0/44288/0235d73c-1505-6120-afc8-2929d951029e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/6b687448-49a5-4e7e-5c66-0d8ab0a5eddb.png)

完.