Version: 2022.3
언어: 한국어
커스텀 인스펙터 생성
바인드 가능 요소 레퍼런스

SerializedObject 데이터 바인딩

데이터 바인딩은 MonoBehaviourstring 프로퍼티와 같은 비 UI 오브젝트의 프로퍼티를 TextField의 value 프로퍼티와 같은 UI 오브젝트의 프로퍼티와 동기화합니다.바인딩은 프로퍼티와 이 프로퍼티를 수정하는 시각적 컨트롤 간의 링크를 의미합니다.

데이터 바인딩을 사용하여 프로퍼티와 특정 시각적 요소 간의 값을 동기화하면 UI에서 값이 변경될 때 이벤트 핸들러를 작성하지 않아도 됩니다.

참고:SerializedObject 데이터 바인딩은 런타임이 아닌 에디터에서만 작동합니다.

직렬화 요구사항

직렬화된 프로퍼티에만 바인딩할 수 있습니다.즉, 직렬화 시스템과 호환되는 다음 오브젝트에만 시각적 요소를 바인딩할 수 있습니다.

  • 사용자 정의 ScriptableObject 클래스
  • 사용자 정의 MonoBehaviour 클래스
  • 네이티브 Unity 컴포넌트 타입
  • 네이티브 Unity 에셋 타입
  • int,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# 스크립트를 사용하여 설정할 수 있습니다.

BindProperty() 호출

BindProperty()를 호출하여 요소를 SerializedProperty에 직접 바인딩할 수 있습니다.

이 메서드는 이미 SerializedProperty 오브젝트가 있는 경우, 특히 SerializedObject의 프로퍼티를 횡단하여 UI를 동적으로 빌드하는 경우 사용합니다.예제는 바인딩 경로 없이 바인딩을 참조하십시오.

중첩된 프로퍼티에 요소 바인딩

시각적 요소를 소스 오브젝트의 중첩된 프로퍼티에 바인딩할 수 있습니다.이렇게 하려면 요소의 바인딩 경로를 첫 번째 조상의 바인딩 경로와 결합합니다.이 메서드는 다음 요소와 함께 사용하십시오.

예제는 중첩된 프로퍼티에 바인딩을 참조하십시오.

값 변경 시 콜백 수신

바인딩된 직렬화 프로퍼티가 변경될 때 콜백을 수신하도록 바인딩을 만들 수 있습니다.이를 위해서는 모든 VisualElement에서 사용할 수 있는 TrackPropertyValue() 확장 메서드를 활용하십시오.그러면 제공된 SerializedProperty가 변경될 때 실행되는 콜백이 등록됩니다.예제는 직렬화된 프로퍼티가 변경될 때 콜백 수신을 참조하십시오.

바인딩된 직렬화 오브젝트의 프로퍼티가 변경될 때 콜백을 수신하도록 바인딩을 생성할 수도 있습니다.이를 위해서는 모든 VisualElement에서 사용할 수 있는 TrackSerializedObjectValue() 확장 메서드를 활용하면 됩니다.그러면 제공된 SerializedProperty가 변경될 때 실행되는 콜백이 등록됩니다.예제는 모든 프로퍼티가 변경될 때 콜백 수신을 참조하십시오.

커스텀 요소 바인딩

커스텀 요소를 생성하고 값 바인딩 시스템을 통해 직렬화된 프로퍼티에 바인딩할 수 있습니다.

바인딩 가능한 커스텀 요소를 만들려면 다음 단계를 따르십시오.

  1. 커스텀 요소를 선언합니다.
  2. BindableElement에서 해당 요소를 상속하거나 IBinding 인터페이스를 구현합니다.
  3. INotifyValueChanged 인터페이스를 구현합니다.
  4. SetValueWithoutNotify() 메서드를 INotifyValueChanged 인터페이스에 구현합니다.
  5. value 프로퍼티 접근자를 INotifyValueChanged 인터페이스에 구현합니다.

예제는 커스텀 컨트롤 만들기 및 스타일링을 참조하십시오.

참고:바인딩 시스템에서는 enum의 SerializedPropertyType에서 지원하는 타입으로만 요소를 바인딩할 수 있으므로 커스텀 데이터 타입을 커스텀 요소에 직접 바인딩할 수 없습니다.즉, 클래스나 구조체(예: ’MyStruct’라는 구조체)를 정의하고 이것을 INotifyValueChanged<MyStruct>를 구현하는 요소에 바인딩할 수 없다는 뜻입니다.그러나 커스텀 데이터 타입의 직렬화 가능한 중첩 프로퍼티에 바인딩할 수 있습니다.여기에는 다형성 직렬화(필드가 [SerializeReference] 속성]을 사용하는 경우)가 포함됩니다.예제는 커스텀 컨트롤을 커스텀 데이터 타입에 바인딩을 참조하십시오.

베스트 프랙티스

생성하는 UI 타입에 따라 바인딩은 다양한 시점에 발생합니다.이것을 바인드 시간이라고 합니다.

다음 표에서는 컨트롤의 바인드 시간을 설명합니다.

조건 자동 바인드 시간(바인딩 경로가 설정되었다고 가정)
C#에서 구성된 InspectorElement 생성자 호출 중에
해당 메서드가 반환할 때 CreateInspectorGUI() 또는 CreatePropertyGUI()의 반환값 아래에 있는 자식 요소 CreateInspectorGUI() 또는 CreatePropertyGUI()가 반환된 후
부모 요소에서 Bind() 또는 BindProperty()가 호출될 때 요소 아래에 있는 자식 요소입니다. Bind() 또는 BindProperty() 호출 중에
기타 자동 바인딩이 지원되지 않으므로 요소 또는 부모 요소 중 하나를 수동으로 바인딩해야 합니다.

다음은 바인드 시간과 관련된 바인딩을 만들 때의 베스트 프랙티스입니다.

바인딩 예제

다음 예제를 통해 데이터 바인딩을 사용하여 코딩하는 방법을 알아보십시오.

추가 리소스

커스텀 인스펙터 생성
바인드 가능 요소 레퍼런스