Version: Unity 6.0 (6000.0)
언어 : 한국어
Unity UI(uGUI)에서 UI 툴킷으로 마이그레이션
Unity UI

즉시 모드 GUI(IMGUI)에서 UI 툴킷으로 마이그레이션

이 가이드는__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary
툴킷으로 마이그레이션하려는 IMGUI(즉시 모드 GUI)에 익숙한 개발자를 위한 것입니다. 이 가이드는 에디터 UI에 중점을 두지만 해당 정보는 런타임 UI에도 적용될 수 있습니다.

주요 차이점

코드 기반과 UI 기반 비교

IMGUI는 이를 구현하는 C# 스크립트의 OnGUI 함수 호출에 의해 코드 기반으로 구동됩니다. UI 툴킷은 에디터 UI 생성을 위한 추가 옵션을 제공합니다. UI 툴킷을 사용하면 C# 스크립트에서 동작을 정의할 수 있습니다. 그러나 C# 외에도 UI 요소와 스타일을 정의할 때 UI 빌더에서 UI 컨트롤을 시각적으로 정의하거나 직접 XML 같은 텍스트 파일(UXML이라고도 함)에 작성할 수 있습니다. 자세한 내용은 UI 툴킷 시작하기를 참고하십시오.

즉시 모드와 보류 모드 비교

IMGUI를 사용하면 OnGUI() 함수 내에서 UI가 리페인팅될 때 UI 트리를 설명합니다. 이벤트가 UI에 대해 발생하거나 UI를 리페인팅할 때 이 함수를 호출해야 합니다. 서로 다른 이벤트 간에는 UI 트리에 대한 지속적인 정보가 없습니다. 반면, UI 툴킷을 사용하여 시각적 트리라는 트리 구조에서 시각적 요소를 만들 수 있습니다. 시각적 트리의 정보는 지속적으로 보관됩니다.

불변과 상태 변화 비교

IMGUI는 OnGUI()function that runs at least once every frame. You define the look and the behaviors of the UI for every possible frame. The body ofOnGUI()`를 기반으로 하며 여러 조건과 서로 다른 상태를 포함할 수 있습니다.

UI 툴킷은 이벤트 기반 시스템에서 작동합니다. 기본 상태에서 UI의 모습을 정의하고 이벤트에 대한 응답으로 UI의 동작을 정의합니다. UI 툴킷을 변경하면 UI 상태가 지속적으로 변경됩니다.

예를 들어 IMGUI의 버튼 선언은 다음과 같습니다.

if (GUILayout.Button("Click me!"))
{
    //Code runs here in frames where the user clicks the button.

    //Code makes changes to the UI for frames where the user has just clicked the button.
}
else
{
    //Code specifies what happens in all other frames.
}

위의 예시는 UI 툴킷에서 다음과 같이 작성되어야 합니다

UIDocument document = GetComponent<UIDocument>();

//Create button.
Button button = new Button();
button.text = "Click me!";

//Set up event handler.
button.RegisterCallback<ClickEvent>((ClickEvent evt) =>
{
    //Code runs here after button receives ClickEvent.
});

//Add button to UI.
document.rootVisualElement.Add(button);

UI 툴킷을 사용하여 커스텀 에디터 창을 만드는 방법에 대한 완전한 예시는 UI 툴킷 시작하기를 참조하십시오.

IMGUI 지원

IMGUIContainer를 사용하여 IMGUI 코드를 VisualElement 안에 배치합니다. OnGUI() 내부에서 수행할 수 있는 모든 작업이 지원됩니다.

여러 IMGUIContainer를 배열하고 GUILayout과 UI 툴킷 레이아웃을 혼합하여 배치할 수 있습니다. IMGUIContainer 안에 VisualElement 인스턴스를 추가할 수는 없습니다.

IMGUIContainer 예시
IMGUIContainer 예시

IMGUI에서 UI 툴킷으로 전환

다음 표에는 IMGUI와 UI 툴킷 간에 대응하는 함수가 나열되어 있습니다.

Action IMGUI UI 툴킷
에디터 창 생성 EditorWindow.OnGUI() EditorWindow.CreateGUI()
프로퍼티 드로어 또는 프로퍼티 속성 생성 PropertyDrawer.OnGUI() PropertyDrawer.CreatePropertyGUI()
인스펙터용 커스텀 에디터 생성 Editor.OnInspectorGUI() Editor.CreateInspectorGUI()

다음 표에는 IMGUI와 UI 툴킷 간에 대응하는 메서드, 클래스, 속성이 나열되어 있습니다.

IMGUI IMGUI 네임스페이스 UI 툴킷
AddCursorRect() EditorGUIUtility VisualElement.style.cursor를 설정하거나 UI 빌더 또는 USS에서 시각적 요소의 커서 텍스처를 설정합니다. 더 자세한 상호 작용성을 위해서는 C# 이벤트를 사용하십시오.
AreaScope GUILayout 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginArea()를 참조하십시오.
BeginArea() GUILayout 영역 자체를 정의하려면 시각적 요소를 생성하고 style.positionPosition.Absolute로 설정합니다. 영역의 자식을 생성하려면 해당 영역 아래에 자식 시각적 요소를 생성합니다.
BeginBuildTargetSelectionGrouping() EditorGUILayout 해당 없음
BeginChangeCheck() EditorGUI 변경 확인 범위에서 각 요소에 대한 콜백을 등록합니다. 커스텀 인스팩터에서 직렬화된 필드의 스탠드인으로 PropertyField를 사용하는 경우에는 PropertyField.RegisterCallback<SerializedPropertyChangeEvent>() 또는 PropertyField.RegisterValueChangeCallback()을 사용합니다. 다른 모든 경우에는 VisualElement.RegisterCallback<ChangeEvent<T>>() 또는 VisualElement.RegisterValueChangedCallback<T>()을 사용하십시오.
BeginDisabledGroup() EditorGUI VisualElement.SetEnabled(false)
BeginFoldoutHeaderGroup() EditorGUI, EditorGUILayout Foldout()를 참조하십시오.
BeginGroup() GUI BeginArea()를 참조하십시오.
BeginHorizontal() EditorGUILayout, GUILayout BeginArea()를 참조하십시오.
BeginProperty() EditorGUI 간단한 컨트롤을 직렬화된 프로퍼티에 바인딩하기 위해 BeginProperty()/EndProperty()를 사용하는 경우 UI 툴킷에서 BindProperty()를 호출하거나, bindingPath를 설정하거나, binding-path UXML 속성을 설정하여 이 작업을 수행할 수 있습니다. 복잡한 커스텀 UI에서 단일 프로퍼티를 만들기 위해 BeginProperty()/EndProperty()를 사용하는 경우 이는 UI 툴킷에서 잘 지원되지 않습니다.
BeginScrollView() EditorGUILayout, GUI, GUILayout UnityEngine.UIElements.ScrollView
BeginToggleGroup() EditorGUILayout 해당 없음
BeginVertical() EditorGUILayout, GUILayout BeginArea()를 참조하십시오.
BoundsField() EditorGUI, EditorGUILayout BoundsField
BoundsIntField() EditorGUI, EditorGUILayout BoundsIntField
Box() GUI, GUILayout Box
BringWindowToBack() GUI Window()를 참조하십시오.
BringWindowToFront() GUI Window()를 참조하십시오.
Button() GUI, GUILayout Button
CanCacheInspectorGUI() EditorGUI 보류 모드에서는 필요하지 않습니다.
ChangeCheckScope EditorGUI 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginChangeCheck()를 참조하십시오.
ColorField() EditorGUI, EditorGUILayout ColorField
CommandEvent() EditorGUIUtility 보류 모드에서는 일반적으로 필요하지 않습니다. C# 콜백을 사용하여 이벤트를 처리합니다.
CurveField() EditorGUI, EditorGUILayout CurveField
DelayedDoubleField() EditorGUI, EditorGUILayout isDelayed가 true로 설정된 DoubleField
DelayedFloatField() EditorGUI, EditorGUILayout isDelayed가 true로 설정된 FloatField
DelayedIntField() EditorGUI, EditorGUILayout isDelayed가 true로 설정된 IntegerField
DelayedTextField() EditorGUI, EditorGUILayout isDelayed가 true로 설정된 TextField
DisabledScope EditorGUI 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginDisabledGroup()를 참조하십시오.
DoubleField() EditorGUI, EditorGUILayout DoubleField
DragWindow() GUI Window()를 참조하십시오.
DrawPreviewTexture() EditorGUI 해당 없음
DrawRect() EditorGUI VisualElement를 사용합니다. style.positionAbsolute로 설정합니다. 위치를 정의하려면 style.topstyle.left를 설정합니다. 크기를 정의하려면 style.widthstyle.height를 설정합니다. 컬러를 설정하려면 style.backgroundColor를 설정합니다.
DrawTexture() GUI Image. color 대신 tintColor를 설정합니다. false alphaBlend에 대응하는 것은 없습니다. borderWidth, borderWidths, borderRadius 또는 borderRadiuses에 대응하는 것도 없습니다.
DrawTextureAlpha() EditorGUI 해당 없음
DrawTextureWithTexCoords() GUI Image. texCoords 대신 uv를 설정합니다. false alphaBlend에 대응하는 것은 없습니다.
DropdownButton() EditorGUI, EditorGUILayout 정확히 동일한 대응 항목이 없습니다. 단순한 DropdownButton() 대신 완전한 DropdownField를 사용하십시오.
DropShadowLabel() EditorGUI style.textShadow에서 그림자 값이 설정된 Label
EditorToolbar() EditorGUILayout 각 툴에 한 개의 ToolbarButton이 있는 Toolbar를 만듭니다. 각 ToolbarButton에 대해 클릭 시 콜백을 등록하여 ToolManager.SetActiveTool() 또는 ToolManager.RestorePreviousTool()을 호출해서 해당 버튼이 각각 툴을 활성화하거나 비활성화하도록 할 수 있습니다.
EndArea() GUILayout BeginArea()를 참조하십시오.
EndBuildTargetSelectionGrouping() EditorGUILayout BeginBuildTargetSelectionGrouping()를 참조하십시오.
EndChangeCheck() EditorGUI BeginChangeCheck()를 참조하십시오.
EndDisabledGroup() EditorGUI BeginDisabledGroup()를 참조하십시오.
EndFoldoutHeaderGroup() EditorGUI, EditorGUILayout Foldout()를 참조하십시오.
EndGroup() GUI BeginArea()를 참조하십시오.
EndHorizontal() EditorGUILayout, GUILayout BeginArea()를 참조하십시오.
EndProperty() EditorGUI BeginProperty()를 참조하십시오.
EndScrollView() EditorGUILayout, GUI, GUILayout BeginScrollView()를 참조하십시오.
EndToggleGroup() EditorGUILayout BeginToggleGroup()를 참조하십시오.
EndVertical() EditorGUILayout, GUILayout BeginArea()를 참조하십시오.
EnumFlagsField() EditorGUI, EditorGUILayout EnumFlagsField
EnumPopup() EditorGUI, EditorGUILayout EnumField
ExpandHeight() GUILayout 해당 없음
ExpandWidth() GUILayout 해당 없음
FlexibleSpace() GUILayout Space()를 참조하십시오.
FloatField() EditorGUI, EditorGUILayout FloatField
FocusControl() GUI VisualElement.Focus()
FocusTextInControl() EditorGUI TextField.Focus()
FocusWindow() GUI Window()를 참조하십시오.
Foldout() EditorGUI, EditorGUILayout Foldout
GetControlRect() EditorGUILayout EditorGUILayout에서 EditorGUI로 전환하는 데만 필요합니다. UI 툴킷에서는 필요하지 않습니다.
GetNameOfFocusedControl() GUI VisualElement.focusController.focusedElement
GetPropertyHeight() EditorGUI PropertyField.layout.height
GradientField() EditorGUI, EditorGUILayout GradientField
GroupScope GUI 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginArea()를 참조하십시오.
Height() GUILayout VisualElement.style.height
HelpBox() EditorGUI, EditorGUILayout HelpBox
HorizontalScope EditorGUILayout, GUILayout 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginArea()를 참조하십시오.
HorizontalScrollbar() GUI, GUILayout directionHorizontal로 설정된 Scroller
HorizontalSlider() GUI, GUILayout directionHorizontal로 설정된 Slider
InspectorTitlebar() EditorGUI, EditorGUILayout 해당 없음
IntField() EditorGUI, EditorGUILayout IntegerField
IntPopup() EditorGUI, EditorGUILayout 해당 없음
IntSlider() EditorGUI, EditorGUILayout SliderInt
Label() GUI, GUILayout Label
LabelField() EditorGUI, EditorGUILayout isReadOnly가 true로 설정된 TextField
LayerField() EditorGUI, EditorGUILayout LayerField
LinkButton() EditorGUI, EditorGUILayout 해당 없음
Load() EditorGUIUtility C#을 사용하는 경우 이 함수를 그대로 사용하고 반환 값을 원하는 VisualElement.style 프로퍼티에 할당할 수 있습니다. USS를 사용하는 경우 Load()에 부여하는 것과 동일한 인자로 resource() 함수를 사용합니다.
LongField() EditorGUI, EditorGUILayout LongField
MaskField() EditorGUI, EditorGUILayout MaskField
MaxHeight() GUILayout VisualElement.style.maxHeight
MaxWidth() GUILayout VisualElement.style.maxWidth
MinHeight() GUILayout VisualElement.style.minHeight
MinMaxSlider() EditorGUI, EditorGUILayout MinMaxSlider
MinWidth() GUILayout VisualElement.style.minWidth
ModalWindow() GUI Window()를 참조하십시오.
[NonReorderable] 속성
ListView.reorderable이 false인지 확인합니다.
ObjectField() EditorGUI, EditorGUILayout ObjectField
PasswordField() EditorGUI, EditorGUILayout, GUI, GUILayout isPasswordField가 true로 설정된 TextField
PixelsToPoints() EditorGUIUtility UI 툴킷과 사용 가능.
PointsToPixels() EditorGUIUtility UI 툴킷과 사용 가능.
Popup() EditorGUI, EditorGUILayout PopupField<T0>
ProgressBar() EditorGUI ProgressBar
PropertyField() EditorGUI, EditorGUILayout PropertyField
PropertyScope EditorGUI 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginProperty()를 참조하십시오.
RectField() EditorGUI, EditorGUILayout RectField
RectIntField() EditorGUI, EditorGUILayout RectIntField
RepeatButton() GUI, GUILayout RepeatButton
ScrollTo() GUI ScrollView.ScrollTo() 또는 ScrollView.scrollOffset
ScrollViewScope EditorGUILayout, GUI, GUILayout 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginScrollView()를 참조하십시오.
SelectableLabel() EditorGUI, EditorGUILayout isSelectablefocusable이 true로 설정된 Label
SelectionGrid() GUI, GUILayout RadioButton
SetNextControlName() GUI VisualElement.name
singleLineHeight EditorGUIUtility USS 변수 --unity-metrics-single_line-height를 사용합니다.
Slider() EditorGUI, EditorGUILayout Slider
Space() EditorGUILayout, GUILayout flex 프로퍼티를 사용하여 시각적 요소 사이의 간격을 설정합니다.
TagField() EditorGUI, EditorGUILayout TagField
TextArea() EditorGUI, EditorGUILayout, GUI, GUILayout multiline이 true로, style.whiteSpaceNormal로, ScrollView.verticalScrollerVisibilityAuto로 설정된 TextField
TextField() EditorGUI, EditorGUILayout, GUI, GUILayout multiline이 true로 설정되고 style.whiteSpaceNoWrap으로 설정된 TextField
Toggle() EditorGUI, EditorGUILayout, GUI, GUILayout Toggle
ToggleGroupScope EditorGUILayout 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginToggleGroup()를 참조하십시오.
ToggleLeft() EditorGUI, EditorGUILayout Toggle(하지만 label 설정 대신 text 설정)
Toolbar() GUI, GUILayout 해당 없음
UnfocusWindow() GUI Window()를 참조하십시오.
Vector2Field() EditorGUI, EditorGUILayout Vector2Field
Vector2IntField() EditorGUI, EditorGUILayout Vector2IntField
Vector3Field() EditorGUI, EditorGUILayout Vector3Field
Vector3IntField() EditorGUI, EditorGUILayout Vector3IntField
Vector4Field() EditorGUI, EditorGUILayout Vector4Field
VerticalScope EditorGUILayout, GUILayout 일반적으로 UI 툴킷에서는 범위가 필요하지 않습니다. BeginArea()를 참조하십시오.
VerticalScrollbar() GUI, GUILayout directionVertical로 설정된 Scroller
VerticalSlider() GUI, GUILayout directionVertical로 설정된 Slider
Width() GUILayout VisualElement.style.width
Window() GUI, GUILayout 해당 없음

추가 리소스

Unity UI(uGUI)에서 UI 툴킷으로 마이그레이션
Unity UI