커스텀 바인딩 유형을 생성하여 런타임 바인딩 시스템을 확장할 수 있습니다. 커스텀 바인딩 유형을 생성하려면 클래스를 생성하고 CustomBinding 클래스에서 상속합니다.
CustomBinding은 단일 바인딩 인스턴스가 아닌 여러 바인딩 인스턴스를 등록할 수 있는 IBinding 인터페이스와 유사합니다. CustomBinding은 확장성 엔트리 포인트이며 바인딩을 업데이트하기 위한 Update 메서드만 제공합니다. 그러나 다음 메서드를 구현하여 바인딩이 등록되거나 등록 취소되거나 요소의 데이터 소스 컨텍스트가 변경되면 콜백을 수신할 수 있습니다.
바인딩 유형의 데이터 소스 및 데이터 소스 경로를 정의하려면 IDataSourceProvider 인터페이스를 구현합니다. 바인딩 시스템은 이 인터페이스에서 제공하는 dataSource 및 dataSourcePath 프로퍼티를 사용하여 확인된 데이터 소스 및 데이터 소스 경로를 결정합니다. 이러한 프로퍼티는 계층 구조에서 얻은 값을 오버라이드하기 때문에 ‘로컬’ 프로퍼티라고 합니다. 중요한 점은 이러한 ‘로컬’ 프로퍼티를 수정해도 요소 자체나 그 자손에 영향을 미치지 않는다는 것입니다.
기본적으로 바인딩 시스템은 프레임마다 CustomBinding 인스턴스를 업데이트합니다.
업데이트 트리거를 정의하려면 다음 메서드를 사용하십시오.
MarkDirty: 바인딩 오브젝트를 다음 주기 동안 업데이트되도록 dirty로 설정합니다.updateTrigger: 이 enum 프로퍼티를 사용하여 바인딩이 업데이트되는 방식을 변경합니다.BindingResult: 업데이트 프로세스를 커스터마이즈하려면 이 메서드를 사용합니다. BindingResult는 업데이트가 성공했는지 알려 주는 구조체입니다. 여기에는 status와 message가 포함되어 있습니다.
BindingResult에는 status와 message가 포함되어 있습니다. 다음은 가능한 status 값입니다.
다음 주기에 바인딩 오브젝트를 업데이트해야 하는 경우 BindingResult 메서드의 Pending 결과를 사용하여 바인딩 시스템에 알릴 수 있습니다.
이 섹션에서는__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary 빌더, UXML, C#에서 커스텀 바인딩 유형을 생성하고 바인딩을 설정하는 방법을 보여 주는 예시를 제공합니다.
다음 예시에서는 현재 시간을 표시하는 커스텀 바인딩 유형을 생성합니다. 레이블의 text 프로퍼티에 바인드하여 시계를 생성할 수 있습니다.
using System;
using Unity.Properties;
using UnityEngine.UIElements;
[UxmlObject]
public partial class CurrentTimeBinding : CustomBinding
{
[UxmlAttribute]
public string timeFormat = "HH:mm:ss";
public CurrentTimeBinding()
{
updateTrigger = BindingUpdateTrigger.EveryUpdate;
}
protected override BindingResult Update(in BindingContext context)
{
var timeNow = DateTime.Now.ToString(timeFormat);
var element = context.targetElement;
if (ConverterGroups.TrySetValueGlobal(ref element, context.bindingId, timeNow, out var errorCode))
return new BindingResult(BindingStatus.Success);
// Error handling
var bindingTypename = TypeUtility.GetTypeDisplayName(typeof(CurrentTimeBinding));
var bindingId = $"{TypeUtility.GetTypeDisplayName(element.GetType())}.{context.bindingId}";
return errorCode switch
{
VisitReturnCode.InvalidPath => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Binding id `{bindingId}` is either invalid or contains a `null` value."),
VisitReturnCode.InvalidCast => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Invalid conversion from `string` for binding id `{bindingId}`"),
VisitReturnCode.AccessViolation => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Trying set value for binding id `{bindingId}`, but it is read-only."),
_ => throw new ArgumentOutOfRangeException()
};
}
}
커스텀 바인딩 유형을 생성하면 UI 빌더의 Add binding 창에 표시됩니다. UI 빌더에서 바인딩을 설정하려면 Add binding 창의 Type 목록에서 CurrentTimeBinding을 선택합니다.
이 바인딩에 해당하는 UXML은 다음과 같습니다.
<ui:Label text="Label">
<Bindings>
<CurrentTimeBinding property="text" />
</Bindings>
</ui:Label>
이 바인딩에 해당하는 C#은 다음과 같습니다.
var label = new Label();
label.SetBinding("text", new CurrentTimeBinding());
다음 팁과 베스트 프랙티스를 따라 성능을 최적화하십시오.
BindingUpdateTrigger.OnSourceChanged 사용: 소스에서 변경 사항이 감지될 때만 바인딩 유형을 업데이트해야 하는 경우 updateTrigger를 BindingUpdateTrigger.OnSourceChanged로 설정합니다. 이렇게 하면 필요한 경우에만 바인딩 유형이 업데이트되어 성능이 최적화됩니다.BindingUpdateTrigger.WhenDirty 사용: 바인딩 유형을 수동으로 업데이트하고 즉시 동기화할 필요가 없는 경우 updateTrigger를 BindingUpdateTrigger.WhenDirty로 설정합니다. 이렇게 하면 바인딩 유형이 업데이트되는 시점을 수동으로 제어하여 유연성을 제공하고 동기화를 제어할 수 있습니다.Update 콜백 대신 OnActivated, OnDeactivated, OnDataSourceChanged 콜백을 사용합니다. 이러한 콜백은 특정 수명 주기 이벤트에서 트리거되어 불필요한 업데이트를 줄이고 효율성을 높입니다. 적절한 콜백을 사용하면 바인딩 유형의 동작을 최적화하고 필요할 때 정확하게 업데이트를 수행할 수 있습니다.