Version: 2023.1
言語: 日本語
バインディングの例
バインディングパスなしでバインドする

C# スクリプトでバインディングパスを使ってバインドする

バージョン: 2021.3 以降

この例では、C#スクリプトのバインディングパスを使ってバインドする方法を紹介します。

例の概要

この例ではカスタムエディターウィンドウを作成して、ゲームオブジェクトの名前を変更します。

この例で作成するすべてのファイルは、GitHub リポジトリ にあります。

要件

このガイドは、Unity エディター、UI Toolkit、および C# スクリプトに精通している開発者を対象としています。始める前に、以下をよく理解してください。

バインディングパスでバインドする

C# で、TextField を持つカスタムのエディターウィンドウを作成します。バインディングパスを ゲームオブジェクトの name プロパティに設定し、Bind() メソッドを明示的に呼び出します。

  1. Unity で任意のテンプレートでプロジェクトを作成します。

  2. Project ウィンドウに、bind-with-binding-path という名前のフォルダーを作成し、ファイルを保存します。

  3. bind-with-binding-path フォルダーに、Editor という名前のフォルダーを作成します。

  4. Editor フォルダーに、SimpleBindingExample.cs という名の C# スクリプトを作成し、そのコンテンツを以下に置き換えます。

    using UnityEditor;
    using UnityEngine;
    using UnityEditor.UIElements;
    using UnityEngine.UIElements;
    
    namespace UIToolkitExamples
    {
        public class SimpleBindingExample : EditorWindow
        {
            TextField m_ObjectNameBinding;
    
            [MenuItem("Window/UIToolkitExamples/Simple Binding Example")]
            public static void ShowDefaultWindow()
            {
                var wnd = GetWindow<SimpleBindingExample>();
                wnd.titleContent = new GUIContent("Simple Binding");
            }
    
            public void CreateGUI()
            {
                m_ObjectNameBinding = new TextField("Object Name Binding");
                // Note: the "name" property of a GameObject is "m_Name" in serialization.
                m_ObjectNameBinding.bindingPath = "m_Name";
                rootVisualElement.Add(m_ObjectNameBinding);
                OnSelectionChange();
            }
    
            public void OnSelectionChange()
            {
                GameObject selectedObject = Selection.activeObject as GameObject;
                if (selectedObject != null)
                {
                    // Create the SerializedObject from the current selection
                    SerializedObject so = new SerializedObject(selectedObject);
                    // Bind it to the root of the hierarchy. It will find the right object to bind to.
                    rootVisualElement.Bind(so);
    
                    // Alternatively you can instead bind it to the TextField itself.
                    // m_ObjectNameBinding.Bind(so);
                }
                else
                {
                    // Unbind the object from the actual visual element that was bound.
                    rootVisualElement.Unbind();
                    // If you bound the TextField itself, you'd do this instead:
                    // m_ObjectNameBinding.Unbind();
    
                    // Clear the TextField after the binding is removed
                    m_ObjectNameBinding.value = "";
                }
            }
        }
    }
    

バインディングのテスト

  1. Unity で Window > UIToolkitExamples > Simple Binding Example を選択します。カスタムエディターウィンドウが開き、テキストフィールドが表示されます。
  2. シーン内のゲームオブジェクトを選択します。ゲームオブジェクトの名前は、エディターウィンドウのテキストフィールドに表示されます。テキストフィールドでゲームオブジェクトの名前を変更すると、ゲームオブジェクトの名前も変更されます。

その他の参考資料

バインディングの例
バインディングパスなしでバインドする