Version: 2023.2
언어: 한국어
바인딩 모드 및 업데이트 트리거 정의
로깅 레벨 정의

데이터 타입 전환

타입 컨버터를 사용하면 데이터 소스와 UI 간에 데이터 타입을 전환할 수 있습니다. 다음과 같이 허용됩니다.

  • int 값에서 Texture2D 프로퍼티로 바인딩하는 등 UI와 다른 데이터 타입을 바인딩합니다.
  • 각도를 라디안 대신 도 단위로 표시하는 등 데이터를 다르게 표현하려는 경우 UI와 동일한 데이터 타입을 전환합니다.

타입 컨버터에는 전역 컨버터와 바인딩별 컨버터의 두 가지 카테고리가 있습니다.

전역 컨버터

전역 컨버터는 정적으로 등록되며 바인딩 모드에 관계없이 모든 바인딩 인스턴스에 사용할 수 있습니다. 바인딩 시스템은 스타일 값과 기본 데이터 표현 간의 컨버터와 같이 편의를 위해 미리 등록된 여러 전역 컨버터를 제공합니다. 이러한 컨버터를 사용하여 데이터 소스에서 StyleFloat를 사용하는 대신 일반 float 또는 StyleKeywordStyleFloat 프로퍼티에 바인딩할 수 있습니다.

전역 컨버터를 등록하려면 ConverterGroups.RegisterGlobalConverter 메서드를 사용합니다. 이 메서드에는 소스 타입을 대상 타입으로 전환하는 델리게이트가 필요합니다. 양방향 사용을 활성화하려면 델리게이트가 ref 델리게이트여야 합니다. 등록하면 전역 컨버터는 추가 설정 없이도 특정 유형의 전환이 필요한 모든 바인딩 인스턴스에 자동으로 적용됩니다.

다음 예시는 Texture2DTextureHandle 사이를 전환하는 전역 컨버터를 등록하는 예시입니다.

public struct TextureHandle
{
    public static Texture2D ResolveTexture(TextureHandle handle)
    {
        return /* Actual texture */; 
    } 
    
   public static FromTexture(Texture2D texture)
   {
        return new TextureHandle { handle = /* Compute handle */ }; 
   }

    public int handle;
}

// Registers the global converter
ConverterGroups.RegisterGlobalConverter((ref TextureHandle handle) => TextureHandle.ResolveTexture(handle));
ConverterGroups.RegisterGlobalConverter((ref Texture2D texture) => TextureHandle.FromTexture(texture));

바인딩별 컨버터

바인딩별 컨버터는 특정 바인딩 인스턴스에 적용됩니다. 개별 또는 그룹 바인딩별 컨버터를 등록할 수 있습니다.

개별 컨버터

개별 컨버터를 등록하려면 DataBinding.sourceToUiConverters.AddConverter 또는 DataBinding.uiToSourceConverters.AddConverter 메서드를 사용합니다. 소스 타입을 대상 타입으로 전환하려면 이 메서드에 델리게이트가 필요합니다. 양방향 사용을 활성화하려면 델리게이트가 ref 델리게이트여야 합니다.

다음 예시에서는 바인딩 인스턴스에 대해 라디안과 도를 전환하도록 개별 컨버터를 등록 및 적용합니다.

var binding = new DataBinding();
binding.sourceToUiConverters.AddConverter((ref float radian) => Mathf.RadToDeg * radian);
binding.uiToSourceConverters.AddConverter((ref float degree) => Mathf.DegToRad * degree);

그룹 컨버터

그룹 컨버터를 등록하고 DataBinding 인스턴스에 적용하려면 ConverterGroup 클래스를 사용합니다.

다음 예시는 그룹 컨버터를 등록하는 방법을 보여 줍니다.

// Create a converter group
var group = new ConverterGroup("Inverters");

// Add converters to the converter group
group.AddConverter((ref int v) => -v);
group.AddConverter((ref float v) => -v);
group.AddConverter((ref double v) => -v);
// Register the converter group
ConverterGroups.RegisterConverterGroup(group);


// Add a converter to an existing converter group
if (ConverterGroups.TryGetConverterGroup("Inverters", out var group))
{
    group.AddConverter((ref short v) => -v);
}

컨버터 그룹 적용

컨버터 그룹을 등록하고 나면 바인딩 인스턴스에 적용할 수 있습니다. C#, UI Builder, UXML의 바인딩 인스턴스에 컨버터 그룹을 적용할 수 있습니다.

C#에서 컨버터 그룹을 적용하려면 DataBinding.ApplyConverterGroupToUI 또는 DataBinding.ApplyConverterGroupToSource 메서드를 사용합니다. 이러한 메서드는 컨버터 그룹 이름을 파라미터로 사용합니다.

다음 예시는 컨버터 그룹 Inverters를 C#의 바인딩 인스턴스에 적용합니다.

var binding = new DataBinding();
if (ConverterGroups.TryGetConverterGroup("Inverters", out var group))
{
    binding.ApplyConverterGroupToUI(group);
    binding.ApplyConverterGroupToSource(group);
}

참고: 컨버터 그룹을 다른 컨버터 그룹에 적용하면 “실행 후 잊어버리는” 방식으로 작동합니다. 따라서 컨버터 그룹을 적용하면 추가적이며 지속적인 모니터링이나 관리 없이도 의도한 기능을 독립적으로 수행합니다.

다음 예시는 컨버터 그룹 Inverters를 UXML의 바인딩에 적용합니다.

<ui:DataBinding source-to-ui-converters="Inverters" ui-to-source-converters="Inverters" />

UI Builder에서 컨버터 그룹을 적용하는 자세한 방법은 런타임 바인딩 시작하기를 참조하십시오.

베스트 프랙티스

다음 팁과 베스트 프랙티스를 준수하여 성능을 최적화합니다.

  • 메모리 할당 최소화: 가능하면 메모리를 할당하는 전환 델리게이트를 작성하지 마십시오. 특히 enum 타입을 처리할 때는 더욱 주의해야 합니다. 전환 중에 메모리를 할당하면 불필요한 오버헤드가 발생하고 성능에 영향을 미칠 수 있습니다. 대신 효율적이고 메모리 친화적인 전환 방식을 사용하십시오.
  • 컨버터를 효율적으로 유지: 컨버터가 빠르고 효율적인 타입 전환을 수행하는 데 집중할 수 있도록 해야 합니다. 컨버터 내에서 대규모 작업이나 복잡한 연산을 수행하면 성능이 저하되고 불필요한 복잡성이 발생할 수 있으므로 이를 피하십시오.
  • 데이터 소스에서 타입 전환 통합: 바인딩별 전환에만 의존하는 대신 타입 전환을 데이터 소스에 직접 통합하는 것을 고려합니다. 데이터 소스 자체 내에서 전환을 처리하면 프로세스를 간소화하고 전반적인 성능을 개선할 수 있습니다. 이 접근 방식은 바인딩별로 전환을 관리하는 것에 대한 복잡성을 줄일 수도 있습니다.

알려진 제한 사항

소스 타입과 대상 타입은 UnityEngine.Object 타입이 아닌 이상 완벽하게 일치해야 합니다. 예를 들어, intfloat로 전환하거나 floatint로 전환할 수 없습니다. 이는 특히 enum 타입의 경우 불편할 수 있습니다. 이 제한 사항은 향후 릴리스에서 해결될 예정입니다.

추가 리소스

바인딩 모드 및 업데이트 트리거 정의
로깅 레벨 정의