버전:2021.3+
이 예제는 바인딩된 직렬화된 프로퍼티가 변경될 때 콜백을 수신하는 방법을 보여줍니다.
이 예제에서는 씬의 게임 오브젝트 이름에 바인딩하는 TextField가 있는 커스텀 에디터 창을 생성합니다.게임 오브젝트의 이름이 GameObject
인 경우 텍스트 필드 레이블의 배경색이 진한 빨간색으로 변경됩니다.
이 예제에서 생성한 완성된 파일은 GitHub 저장소에서 확인할 수 있습니다.
이 가이드는 Unity 에디터, UI 툴킷, C# 스크립팅에 익숙한 개발자용입니다.시작하기 전에 먼저 다음을 숙지하십시오.
다음과 같은 C# 스크립트를 만듭니다.
CheckName()
메서드 호출TrackPropertyValue()
확장 메서드로 메서드 등록TrackPropertyValue()
를 다시 호출하기 전에 Unbind()
호출VisualElement
는 주어진 시간에 하나의 프로퍼티만 추적할 수 있습니다.
템플릿을 사용하여 Unity에서 프로젝트를 생성합니다.
프로젝트 창에서 파일을 저장할 폴더 이름을 ’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
인 경우 레이블의 배경색이 진한 빨간색으로 변경됩니다.