UnityのUI Toolkitで、RadioButtonGroup
を使ってラジオボタンによる選択肢を簡単に作る方法についてまとめました。
Unity 2022.2.17
RadioButtonGroupとは?
RadioButtonGroup
を使うと、下図のようなラジオボタンによる選択肢を実装することができます。
いずれか一つだけを選択するUIを作成するのに便利です。
本記事ではこのRadioButtonGroup
を使って上図のEditorWindow
を実装する方法についてまとめます。
UXMLファイルを作成する
まずUI BuilderをつかってUXMLファイルを作成します。
RadioButtonGroup
を配置し、Choices
にカンマ区切りで選択肢を入力します。
Value
にインデックスを入力すれば初期値を入力することもできます。
生成されたUXMLは以下の通りです。
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True"> <ui:RadioButtonGroup label="Radio Button Group" value="0" choices="First,Second,Third" /> </ui:UXML>
EditorWindowを作成する
次にこれをEditorWindow
に表示して制御します。
using UnityEditor; using UnityEngine; using UnityEngine.UIElements; public sealed class Example : EditorWindow { [SerializeField] private VisualTreeAsset layout; private void CreateGUI() { layout.CloneTree(rootVisualElement); var radioButtonGroup = rootVisualElement.Q<RadioButtonGroup>(); // RegisterValueChangedCallbackで値の変化を監視できる radioButtonGroup.RegisterValueChangedCallback(evt => { Debug.Log(evt.newValue); }); } [MenuItem("Window/Example")] private static void Open() { GetWindow<Example>(); } }
これに関しては特に特別なことはやっていません。
値の変更はコメントに書いた通りの方法で監視できます。
実行結果
EditorWindow
のスクリプトができたら、Inspectorからlayout
プロパティに先ほど作ったUXMLファイルをアサインします。
アサイン後、Window > Exampleからウィンドウを開くと、下図の結果が得られます。
正常にラジオボタンを構築できていることを確認できました。
スクリプトで構築する
RadioButtonGroup
のレイアウトをUXMLを用いずにスクリプトで構築するには以下のようにします。
using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; public sealed class Example : EditorWindow { private void CreateGUI() { var radioButtonGroup = new RadioButtonGroup( "Radio Button Group", new List<string> { "First", "Second", "Third" } ); radioButtonGroup.RegisterValueChangedCallback(evt => { Debug.Log(evt.newValue); }); rootVisualElement.Add(radioButtonGroup); } [MenuItem("Window/Example")] private static void Open() { GetWindow<Example>(); } }