데이터 바인딩은 MonoBehaviour
의 string
프로퍼티와 같은 비 UI 오브젝트의 프로퍼티를 TextField의 value
프로퍼티와 같은 UI 오브젝트의 프로퍼티와 동기화합니다.바인딩은 프로퍼티와 이 프로퍼티를 수정하는 시각적 컨트롤 간의 링크를 의미합니다.
데이터 바인딩을 사용하여 프로퍼티와 특정 시각적 요소 간의 값을 동기화하면 UI에서 값이 변경될 때 이벤트 핸들러를 작성하지 않아도 됩니다.
참고:SerializedObject 데이터 바인딩은 런타임이 아닌 에디터에서만 작동합니다.
직렬화된 프로퍼티에만 바인딩할 수 있습니다.즉, 직렬화 시스템과 호환되는 다음 오브젝트에만 시각적 요소를 바인딩할 수 있습니다.
ScriptableObject
클래스MonoBehaviour
클래스,
bool,
float` 등과 같은 기본 C# 타입Vector3
, Color
, Object
등과 같은 네이티브 Unity 타입INotifyValueChanged
인터페이스를 구현하는 시각적 요소의 value
프로퍼티만 바인딩할 수 있습니다.예를 들어, TextField.value
를 ’string’에 바인딩할 수는 있지만, TextField.name
을 ’string’에 바인딩할 수는 없습니다.
오브젝트와 BindableElement
에서 파생되거나 IBindable
인터페이스를 구현하는 모든 시각적 요소 사이를 바인딩할 수 있습니다.
바인딩을 만들려면 call Bind()
또는 BindProperty()
를 호출합니다.
Bind()
호출Bind()
를 호출하여 요소를 SerializedObject에 바인딩할 수 있습니다.요소를 바인딩하기 전에 바인딩 경로를 설정하고 SerializedObject를 생성해야 합니다.
바인딩을 위한 SerializedProperty
에 쉽게 액세스할 수 없는 경우 이 방법을 사용합니다.예제는 C# 스크립트로 바인딩 만들기를 참조하십시오.
Bind()
확장 메서드는 지정된 bindingPath
프로퍼티를 가진 시각적 요소의 전체 계층 구조를 설정합니다.바인딩하려는 단일 요소 또는 계층 구조의 부모에서 Bind()
메서드를 호출할 수 있습니다.예를 들어, 에디터 창의 rootVisualElement
에서 Bind()
를 호출할 수 있습니다.이렇게 하면 지정된 bindingPath
프로퍼티를 가진 모든 자식 요소가 바인딩됩니다.
Editor.CreateInspectorGUI()
또는 PropertyDrawer.CreatePropertyGUI()
오버라이드에서 Bind()
를 호출하지 마십시오.이러한 오버라이드는 해당 메서드가 반환하는 시각적 요소에서 자동으로 호출됩니다.
Unbind()
호출Unbind()
메서드는 요소와 해당 요소의 모든 직간접 자식 요소에 대한 값 추적을 중지합니다.일반적으로 사용자가 인스펙터 또는 에디터 창을 닫으면 트래킹이 중지되므로 Unbind()
를 호출하지 않아도 됩니다.수명 기간 동안 요소를 다른 타겟에 바인딩해야 하는 경우 Unbind()
를 호출하십시오.
C#에서 생성자를 호출하여 InspectorElement
를 구성하는 경우, 생성자 호출 중에 바인딩이 발생합니다.InspectorElement
가 생성된 후 리바인딩하려면 Unbind()
를 호출한 다음 Bind()
를 명시적으로 호출하거나 부모에서 바인드 작업이 바인딩을 만들게 해야 합니다.
바인딩을 생성하기 위해 Bind()
를 호출하는 경우 시각적 요소의 바인딩 경로를 바인딩하려는 오브젝트의 프로퍼티 이름으로 설정해야 합니다.
예제:
다음과 같은 컴포넌트 스크립트가 있는 경우:
using UnityEngine;
public class MyComp :MonoBehaviour
{
[SerializeField]
int m_Count;
}
시각적 요소를 m_Count
에 바인딩하려면 바인딩 경로를 m_Count
로 설정합니다.
시각적 요소를 게임 오브젝트의 이름 프로퍼티인 m_Name
에 바인딩하려면 바인딩 경로를 m_Name
으로 설정합니다.
바인딩 경로는 UI 빌더, UXML 또는 C# 스크립트를 사용하여 설정할 수 있습니다.
IBindable
인터페이스에서 bindingPath
를 설정합니다.예제는 바인딩 경로로 바인딩을 참조하십시오.BindProperty()
호출BindProperty()
를 호출하여 요소를 SerializedProperty
에 직접 바인딩할 수 있습니다.
이 메서드는 이미 SerializedProperty
오브젝트가 있는 경우, 특히 SerializedObject
의 프로퍼티를 횡단하여 UI를 동적으로 빌드하는 경우 사용합니다.예제는 바인딩 경로 없이 바인딩을 참조하십시오.
시각적 요소를 소스 오브젝트의 중첩된 프로퍼티에 바인딩할 수 있습니다.이렇게 하려면 요소의 바인딩 경로를 첫 번째 조상의 바인딩 경로와 결합합니다.이 메서드는 다음 요소와 함께 사용하십시오.
BindableElement
TemplateContainer
(UXML의 <Instance>
태그에 해당)GroupBox
예제는 중첩된 프로퍼티에 바인딩을 참조하십시오.
바인딩된 직렬화 프로퍼티가 변경될 때 콜백을 수신하도록 바인딩을 만들 수 있습니다.이를 위해서는 모든 VisualElement
에서 사용할 수 있는 TrackPropertyValue()
확장 메서드를 활용하십시오.그러면 제공된 SerializedProperty
가 변경될 때 실행되는 콜백이 등록됩니다.예제는 직렬화된 프로퍼티가 변경될 때 콜백 수신을 참조하십시오.
바인딩된 직렬화 오브젝트의 프로퍼티가 변경될 때 콜백을 수신하도록 바인딩을 생성할 수도 있습니다.이를 위해서는 모든 VisualElement
에서 사용할 수 있는 TrackSerializedObjectValue()
확장 메서드를 활용하면 됩니다.그러면 제공된 SerializedProperty
가 변경될 때 실행되는 콜백이 등록됩니다.예제는 모든 프로퍼티가 변경될 때 콜백 수신을 참조하십시오.
커스텀 요소를 생성하고 값 바인딩 시스템을 통해 직렬화된 프로퍼티에 바인딩할 수 있습니다.
바인딩 가능한 커스텀 요소를 만들려면 다음 단계를 따르십시오.
BindableElement
에서 해당 요소를 상속하거나 IBinding
인터페이스를 구현합니다.INotifyValueChanged
인터페이스를 구현합니다.SetValueWithoutNotify()
메서드를 INotifyValueChanged
인터페이스에 구현합니다.value
프로퍼티 접근자를 INotifyValueChanged
인터페이스에 구현합니다.예제는 커스텀 컨트롤 만들기 및 스타일링을 참조하십시오.
참고:바인딩 시스템에서는 enum
의 SerializedPropertyType에서 지원하는 타입으로만 요소를 바인딩할 수 있으므로 커스텀 데이터 타입을 커스텀 요소에 직접 바인딩할 수 없습니다.즉, 클래스나 구조체(예: ’MyStruct’라는 구조체)를 정의하고 이것을 INotifyValueChanged<MyStruct>
를 구현하는 요소에 바인딩할 수 없다는 뜻입니다.그러나 커스텀 데이터 타입의 직렬화 가능한 중첩 프로퍼티에 바인딩할 수 있습니다.여기에는 다형성 직렬화(필드가 [SerializeReference]
속성]을 사용하는 경우)가 포함됩니다.예제는 커스텀 컨트롤을 커스텀 데이터 타입에 바인딩을 참조하십시오.
생성하는 UI 타입에 따라 바인딩은 다양한 시점에 발생합니다.이것을 바인드 시간이라고 합니다.
다음 표에서는 컨트롤의 바인드 시간을 설명합니다.
조건 | 자동 바인드 시간(바인딩 경로가 설정되었다고 가정) |
---|---|
C#에서 구성된 InspectorElement |
생성자 호출 중에 |
해당 메서드가 반환할 때 CreateInspectorGUI() 또는 CreatePropertyGUI() 의 반환값 아래에 있는 자식 요소 |
CreateInspectorGUI() 또는 CreatePropertyGUI() 가 반환된 후 |
부모 요소에서 Bind() 또는 BindProperty() 가 호출될 때 요소 아래에 있는 자식 요소입니다. |
Bind() 또는 BindProperty() 호출 중에 |
기타 | 자동 바인딩이 지원되지 않으므로 요소 또는 부모 요소 중 하나를 수동으로 바인딩해야 합니다. |
다음은 바인드 시간과 관련된 바인딩을 만들 때의 베스트 프랙티스입니다.
Editor``](../ScriptReference/Editor.html) 또는 커스텀 [
PropertyDrawer](../ScriptReference/PropertyDrawer.html)를 생성하는 경우, [
CreateInspectorGUI()](../ScriptReference/Editor.CreateInspectorGUI.html) 또는
CreatePropertyGUI()의 바디 끝 부분의 [비주얼 트리](UIE-VisualTree.html)에 있는 시각적 요소에서 [
Bind()](../ScriptReference/UIElements.BindingExtensions.Bind.html) 또는 [
BindProperty()](../ScriptReference/UIElements.BindingExtensions.BindProperty.html)를 호출하는 대신 해당 요소의 바인딩 경로를 설정합니다.이러한 요소는 [
CreateInspectorGUI()](../ScriptReference/Editor.CreateInspectorGUI.html) 또는 [
CreatePropertyGUI()](../ScriptReference/PropertyDrawer.CreatePropertyGUI.html) 반환 후 자동으로 바인딩됩니다.그러나 그 이후에 시각적 트리에 요소를 추가하는 경우 [
Bind()](../ScriptReference/UIElements.BindingExtensions.Bind.html)) 또는 [
BindProperty()`를 호출하여 바인딩합니다.Bind()
또는 BindProperty()
를 호출합니다.Bind()
또는 BindProperty()
를 호출하여 여러 컨트롤을 동시에 바인딩하려면 각 컨트롤의 바인딩 경로를 설정한 다음, 모든 컨트롤을 포괄하는 가장 낮은 수준의 부모 요소에서 Bind()
를 호출합니다.Bind()
는 바인딩 경로가 있는 경우 호출되는 요소를 바인딩하고, 바인딩 경로가 있는 경우 모든 자식 요소를 재귀적으로 바인딩합니다.성능에 부정적인 영향을 미치지 않도록 하려면 Bind()
메서드를 사용하여 시각적 요소를 두 번 이상 바인딩하지 마십시오.다음 예제를 통해 데이터 바인딩을 사용하여 코딩하는 방법을 알아보십시오.