バージョン: 2021.3 以降
この例では、バインドされたシリアル化されたプロパティが変更されたときに、コールバックを受け取る方法を示します。
シーン内のゲームオブジェクトの名前にバインドする TextField を持つカスタムエディタウィンドウを作成します。ゲームオブジェクトの名前が GameObject
の場合、テキストフィールドのラベルの背景色は濃い赤に変わります。
この例で作成するすべてのファイルは、GitHub リポジトリ にあります。
このガイドは、Unity エディター、UI Toolkit、および C# スクリプトに精通している開発者を対象としています。始める前に、以下をよく理解してください。
C#スクリプトを以下のように作成します。
CheckName()
メソッドを呼び出します。TrackPropertyValue()
拡張メソッドでそのメソッドを登録します。TrackPropertyValue()
を別のプロパティで再度呼び出す前に、Unbind()
を呼び出します。VisualElement
は、一度に 1 つのプロパティしか追跡できません。
Unity で任意のテンプレートでプロジェクトを作成します。
Project ウィンドウに、 callback-SerializedProperty-changes
という名前のフォルダーを作成し、ファイルを保存してください。
callback-SerializedProperty-change フォルダー内に、Editor
という名前のフォルダーを作成します。
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;
}
}
}
}
GameObject
の場合、ラベルの背景色が濃い赤に変わります。