Unityのエディタ拡張でAdd Componentのようなメニューを実装できるAdvanced Dropdownの使い方をまとめました。
Unity 2019.4.33f1
Add Componentのようなメニューとは?
Unityの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>(); } }
結果
このウィンドウを開くと以下のような結果が得られます。