커스텀 컨트롤은 추상적이고 독립적이며 반복적인 것이 좋습니다.
슬라이드 토글은 다음과 같은 면에서 커스텀 컨트롤의 좋은 예입니다.
애플리케이션의 메뉴바는 커스텀 컨트롤의 좋은 예가 아닙니다.
커스텀 컨트롤을 생성한 후에는 USS로 스타일을 지정하고 C#에서 이벤트를 처리할 로직을 추가할 수 있습니다.
커스텀 컨트롤을 생성하려면 다음을 수행합니다.
UxmlElement 속성을 추가합니다.VisualElement 또는 그 파생 클래스 중 하나로부터 상속합니다.예시:
using UnityEngine;
using UnityEngine.UIElements;
[UxmlElement]
public partial class ExampleElement : VisualElement {}
커스텀 컨트롤을 생성한 후 UXML 및__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary 빌더에서 사용할 수 있습니다.
다음 예시 UXML 문서에서는 커스텀 컨트롤을 사용합니다.
<ui:UXML xmlns:ui="UnityEngine.UIElements">
<ExampleElement />
</ui:UXML>
기본적으로 커스텀 컨트롤은 UI 빌더의 Library 탭에 나타납니다. Library 탭에서 숨기려면 HideInInspector 속성을 추가합니다.
커스텀 컨트롤은 VisualElement에서 상속됩니다. VisualElement는 게임 오브젝트의 수명에 바인딩되지 않으며 다음 콜백을 수신하지 않습니다.
Awake()OnEnable()OnDisable()OnDestroy()커스텀 컨트롤을 생성자에서 초기화할 수 있습니다. 하지만 애플리케이션에 필요한 경우 UI에 커스텀 컨트롤이 추가될 때까지 초기화를 지연할 수 있습니다. 이렇게 하려면 AttachToPanelEvent에 대한 콜백을 등록하십시오. UI에서 커스텀 컨트롤이 제거되었음을 감지하려면 DetachFromPanelEvent 콜백을 사용합니다.
public CustomControl()
{
var myCustomElement = rootVisualElement.Q(className: "my-custom-element");
myCustomElement.RegisterCallback<AttachToPanelEvent>(e =>
{ /* do something here when element is added to UI */ });
myCustomElement.RegisterCallback<DetachFromPanelEvent>(e =>
{ /* do something here when element is removed from UI */ });
}
UI 툴킷은 모든 요소에 대해 이 두 이벤트를 디스패치하며, 커스텀 VisualElement 서브 클래스가 필요하지 않습니다. 자세한 내용은 패널 이벤트를 참조하십시오.
USS를 사용하여 빌트인 컨트롤과 동일한 방식으로 커스텀 컨트롤을 커스터마이즈합니다. 또한 USS 커스텀 프로퍼티를 생성하여 커스텀 컨트롤의 스타일을 지정할 수도 있습니다.
참고: UI 빌더의 인스펙터 창에 USS 커스텀 프로퍼티가 표시되지 않습니다. USS 커스텀 프로퍼티를 편집하려면 텍스트 에디터를 사용하여 USS 파일을 직접 편집합니다.
C#의 커스텀 컨트롤에 대한 커스텀 USS 프로퍼티와 상호 작용하려면 CustomStyleProperty 구조와 CustomStylesResolvedEvent 이벤트를 사용합니다.
CustomStyleProperty는 스타일시트에서 읽은 프로퍼티의 이름과 유형을 설명합니다.
UI 툴킷은 커스텀 USS 프로퍼티를 직접 수신하는 요소에 대한 CustomStylesResolvedEvent를 디스패치합니다. 또한 규칙에 커스텀 프로퍼티 값이 포함된 선택자에 대해 선택자와 일치하는 모든 요소에 대한 이벤트를 디스패치합니다. UI 툴킷은 값을 상속하는 요소에 대한 이벤트를 디스패치하지 않습니다. 이벤트는 ICustomStyle 오브젝트브젝트에 대한 레퍼런스를 포함합니다. 해당 TryGetValue() 메서드를 사용하여 CustomStyleProperty의 실제 값을 읽어야 합니다. 이 메서드는 다양한 유형의 CustomStyleProperty에 대한 오버로드를 포함합니다.
커스텀 컨트롤 예시가 포함된 커스텀 스타일은 커스텀 컨트롤에 대한 커스텀 스타일 생성을 참조하시빗오.
참고: 커스텀 스타일 프로퍼티에 대한 전환을 정의할 수 없습니다.
커스텀 컨트롤의 이벤트 처리 방법에 대한 자세한 내용은 이벤트 처리를 참조하십시오.
참고:
focus와 관련된 프로퍼티를 설정합니다.커스텀 컨트롤이 나타내는 프로퍼티 및 동작의 기타 기능적 측면을 UXML 프로퍼티로 노출하고, 커스텀 컨트롤의 모양에 영향을 주는 프로퍼티를 USS 프로퍼티로 노출합니다.
다른 요소와의 이름 충돌을 피하려면 고유하고 짧고 읽기 쉬운 네임스페이스를 사용하십시오.
UXML 속성을 기본으로 유지합니다. UXML에서 지정할 수 있는 데이터는 일부 기본 데이터 형식으로 제한됩니다. UXML은 복잡한 데이터 구조 또는 컬렉션을 지원하지 않습니다. 복잡한 데이터를 UXML이 아닌 C# 스크립트 또는 데이터 바인딩을 통해 런타임 시 커스텀 컨트롤에 전달합니다.
C#에서 USS 클래스 또는 이름을 상수로 노출합니다. 이렇게 하면 UQuery를 사용하여 클래스나 이름으로 요소를 찾을 수 있습니다.
USS 클래스에 BEM 표준을 채택합니다. 이를 통해 클래스 목록 선택자를 사용하여 모든 요소를 지정할 수 있습니다.
메모리 사용량을 줄이려면 정적 콜백을 사용하십시오. 콜백으로 사용할 인스턴스 메서드를 등록하면 불필요한 할당을 생성할 수 있습니다. 할당을 피하려면 일반 C# 정적 메서드로 호출하는 익명의 정적 lambda 함수를 사용하십시오. 현재 요소의 컨텍스트는 EventBase.currentTarget 프로퍼티를 통해 검색할 수 있습니다.
커스텀 컨트롤에 대한 generateVisualContent 콜백을 통해 커스텀 지오메트리를 렌더링합니다. 부분적으로 채워진 원을 렌더링하는 사용 예시는 RadialProgress 예시를 참조하십시오.
커스텀 컨트롤은 편리합니다. 그러나 다음과 같은 방법으로도 동일한 결과를 얻을 수 있습니다.
MonoBehaviour를 사용하여 UI가 포함된 특정 UI 문서와 관련된 로직을 추가합니다. UI 문서에서 MonoBehaviour를 사용하여 UI를 제어하는 방법은 첫 번째 런타임 UI 만들기를 참조하십시오. 캡슐화를 구현하려면 UQuery로 VisualElement를 내부적으로 가져오고 해당 프로퍼티를 조작하는 프로퍼티와 메서드를 MonoBehaviour 내에 생성하십시오.