【Unity】【エディタ拡張】Add Componentのようなメニューを実装できるAdvanced Dropdownの使い方

Unityのエディタ拡張でAdd Componentのようなメニューを実装できるAdvanced Dropdownの使い方をまとめました。

Unity 2019.4.33f1

Add Componentのようなメニューとは?

UnityのAdd Componentメニューは以下のような特徴を持ちます。

  • 階層型のメニューを表示できる
  • 検索機能がある
  • アニメーション付き

Add Component

Advanced Dropdownを使うと、エディタ拡張でこのようなメニューを自作することができます。
本記事ではこのAdvanced Dropdownの使い方をまとめます。

ドロップダウンを作る

これを実装するには以下のようにAdvancedDropdownクラスを継承したクラスを作成します。

using UnityEditor.IMGUI.Controls;
using UnityEngine;

public class ExampleAdvancedDropdown : AdvancedDropdown
{
    public ExampleAdvancedDropdown(AdvancedDropdownState state) : base(state)
    {
                var minSize = minimumSize;
        minSize.y = 200;
        minimumSize = minSize;
    }

    protected override AdvancedDropdownItem BuildRoot()
    {
        var root = new AdvancedDropdownItem("Root");

        for (var i = 0; i < 10; i++)
        {
            var item = new AdvancedDropdownItem($"Item {i + 1}");
            for (var j = 0; j < 10; j++)
                item.AddChild(new AdvancedDropdownItem($"Item {i + 1} - {j + 1}"));
            root.AddChild(item);
        }

        return root;
    }

    protected override void ItemSelected(AdvancedDropdownItem item)
    {
        Debug.Log($"Selected: {item.name}");
    }
}

BuildRoot()をオーバーライドして、階層化されたメニューを作成しています。
またメニューが選択されたときの処理はItemSelected()に記述します。

ドロップダウンを使う

さてこうして作ったドロップダウンメニューは以下のようにして使用します。

using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;

public class AdvancedDropdownTestWindow : EditorWindow
{
    private void OnGUI()
    {
        var buttonLabel = new GUIContent("Show");
        var buttonStyle = EditorStyles.toolbarButton;
        var buttonRect = GUILayoutUtility.GetRect(buttonLabel, buttonStyle);
        if (GUI.Button(buttonRect, buttonLabel, buttonStyle))
        {
        // ドロップダウンを表示
            var dropdown = new ExampleAdvancedDropdown(new AdvancedDropdownState());
            dropdown.Show(buttonRect);
        }
    }

    [MenuItem("Example/Advanced Dropdown")]
    public static void Open()
    {
        GetWindow<AdvancedDropdownTestWindow>();
    }
}

結果

このウィンドウを開くと以下のような結果が得られます。

結果

参考

docs.unity3d.com