UnityのUI ToolkitでPopupWindowを構築する方法についてまとめました。
Unity 2022.2.17
はじめに
PopupWindowクラスを使うと、UnityエディタのポップアップメニューのようなUIを作ることができます。
IMGUIでこれを作る場合には、以下の記事のようにPopupWindowContent.OnGUI
にGUIを構築するためのコードを書きます
これに対して、UI ToolkitでPopupWindowContent
を作成する場合はOnGUI
は使いません。
本記事ではこの方法についてまとめます。
PopupWindowContentを作る
UI ToolkitでPopupWindowContent
を作成する場合には、OnGUI
には何も書かず、PopupWindow
を開いた時の処理であるOnOpen
にUIを構築する処理を書きます。
using UnityEditor; using UnityEngine; using UnityEngine.UIElements; public sealed class PopupContentExample : PopupWindowContent { // サイズ public override Vector2 GetWindowSize() { return new Vector2(200, 100); } public override void OnGUI(Rect rect) { // UI Toolkitを使う場合にはOnGUIには何も書かない } // 開く時の処理 public override void OnOpen() { // editorWindow.rootVisualElementに対してUIを追加していく // UXMLファイルを使う場合には、editorWindow.rootVisualElementにCloneTreeしてもOK var label = new Label("This is PopupContentExample"); editorWindow.rootVisualElement.Add(label); } // 閉じる時の処理 public override void OnClose() { } }
作成したVisualElement
はeditorWindow.rootVisualElement
に対して追加します。
また、コード内のコメントの通り、UXMLファイルを読み込んでCloneTree
することでそれをルートとして使うこともできます。
PopupWindowを表示する
それでは次に前節で作ったPopupWindowContent
を表示してみます。
今回は以下のように、EditorWindow
上のボタンを押したらそのボタンの下に表示するようにします。
using UnityEditor; using UnityEngine.UIElements; using PopupWindow = UnityEditor.PopupWindow; public sealed class Example : EditorWindow { private void CreateGUI() { var button = new Button(); button.clicked += () => { var content = new PopupContentExample(); PopupWindow.Show(button.worldBound, content); }; button.text = "Open Popup"; rootVisualElement.Add(button); } [MenuItem("Window/Example")] private static void Open() { GetWindow<Example>(); } }
Window > Exampleからこのウィンドウを開いて、ウィンドウに表示されているボタンを押下すると以下の結果が得られます。
正常に動作していることを確認できました。