타입 컨버터를 사용하면 데이터 소스와 UI 간에 데이터 타입을 전환할 수 있습니다. 다음과 같이 허용됩니다.
int
값에서 Texture2D
프로퍼티로 바인딩하는 등 UI와 다른 데이터 타입을 바인딩합니다.타입 컨버터에는 전역 컨버터와 바인딩별 컨버터의 두 가지 카테고리가 있습니다.
전역 컨버터는 정적으로 등록되며 바인딩 모드에 관계없이 모든 바인딩 인스턴스에 사용할 수 있습니다. 바인딩 시스템은 스타일 값과 기본 데이터 표현 간의 컨버터와 같이 편의를 위해 미리 등록된 여러 전역 컨버터를 제공합니다. 이러한 컨버터를 사용하여 데이터 소스에서 StyleFloat
를 사용하는 대신 일반 float
또는 StyleKeyword
를 StyleFloat
프로퍼티에 바인딩할 수 있습니다.
전역 컨버터를 등록하려면 ConverterGroups.RegisterGlobalConverter
메서드를 사용합니다. 이 메서드에는 소스 타입을 대상 타입으로 전환하는 델리게이트가 필요합니다. 양방향 사용을 활성화하려면 델리게이트가 ref
델리게이트여야 합니다. 등록하면 전역 컨버터는 추가 설정 없이도 특정 유형의 전환이 필요한 모든 바인딩 인스턴스에 자동으로 적용됩니다.
다음 예시는 Texture2D
와 TextureHandle
사이를 전환하는 전역 컨버터를 등록하는 예시입니다.
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
타입이 아닌 이상 완벽하게 일치해야 합니다. 예를 들어, int
를 float
로 전환하거나 float
를 int
로 전환할 수 없습니다. 이는 특히 enum
타입의 경우 불편할 수 있습니다. 이 제한 사항은 향후 릴리스에서 해결될 예정입니다.