Version: 2021.3
言語: 日本語
UXML テンプレートへバインドする
バインドされたプロパティが変更されたときにコールバックを受信する

バインドされたプロパティが変更されたときにコールバックを受信する

バージョン: 2021.3 以降

この例では、バインドされたシリアル化されたプロパティが変更されたときに、コールバックを受け取る方法を示します。

例の概要

シーン内のゲームオブジェクトの名前にバインドする TextField を持つカスタムエディタウィンドウを作成します。ゲームオブジェクトの名前が GameObject の場合、テキストフィールドのラベルの背景色は濃い赤に変わります。

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

要件

This guide is for developers familiar with the Unity Editor, UI Toolkit, and C# scripting. You are recommended to have a basic understanding of the following:

コールバックを受信するためのバインディングを作成する

C#スクリプトを以下のように作成します。

  • シリアル化 されたプロパティの値が変更されるたびに、CheckName() メソッドを呼び出します。
  • TrackPropertyValue() 拡張メソッドでそのメソッドを登録します。
  • TrackPropertyValue() を別のプロパティで再度呼び出す前に、Unbind() を呼び出します。

VisualElement は、一度に 1 つのプロパティしか追跡できません。

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

  2. Project ウィンドウに、 callback-SerializedProperty-changes という名前のフォルダーを作成し、ファイルを保存してください。

  3. callback-SerializedProperty-change フォルダー内に、Editor という名前のフォルダーを作成します。

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

    using UnityEditor;
    using UnityEngine;
    using UnityEditor.UIElements;
    using UnityEngine.UIElements;
    
    namespace UIToolkitExamples
    {
        public class SimpleBindingPropertyTrackingExample : EditorWindow
        {
            TextField m_ObjectNameBinding;
    
            [MenuItem("Window/UIToolkitExamples/Simple Binding Property Tracking Example")]
            public static void ShowDefaultWindow()
            {
                var wnd = GetWindow<SimpleBindingPropertyTrackingExample>();
                wnd.titleContent = new GUIContent("Simple Binding Property Tracking");
            }
            
            public void CreateGUI()
            {
                m_ObjectNameBinding = new TextField("Object Name Binding");
                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);
    
                    // Note: the "name" property of a GameObject is actually named "m_Name" in serialization.
                    SerializedProperty property = so.FindProperty("m_Name");
                    
                    // Ensure to use Unbind() before tracking a new property
                    m_ObjectNameBinding.Unbind();
                    m_ObjectNameBinding.TrackPropertyValue(property, CheckName);
    
                    // Bind the property to the field directly
                    m_ObjectNameBinding.BindProperty(property);
    
                    CheckName(property);
                }
                else
                {
                    // Unbind any binding from the field
                    m_ObjectNameBinding.Unbind();
                }
            }
    
            void CheckName(SerializedProperty property)
            {
                if (property.stringValue == "GameObject")
                {
                    m_ObjectNameBinding.style.backgroundColor = Color.red * 0.5f;
                }
                else
                {
                    m_ObjectNameBinding.style.backgroundColor = StyleKeyword.Null;
                }
            }
        }
    }
    

バインディングのテスト

  1. Unity で Window > UIToolkitExamples > Simple Binding Property Tracking Example を選択します。カスタムエディターウィンドウが開き、テキストフィールドが表示されます。
  2. シーン内の任意のゲームオブジェクトを選択します。ゲームオブジェクトの名前は、エディターウィンドウのテキストフィールドに表示されます。
  3. テキストフィールドのゲームオブジェクトの名前を変更します。名前が GameObject の場合、ラベルの背景色が濃い赤に変わります。

その他の参考資料

UXML テンプレートへバインドする
バインドされたプロパティが変更されたときにコールバックを受信する