데이터 바인딩은 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()
메서드를 사용하여 시각적 요소를 두 번 이상 바인딩하지 마십시오.다음 예제를 통해 데이터 바인딩을 사용하여 코딩하는 방법을 알아보십시오.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.