이 가이드는__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary 툴킷으로 마이그레이션하려는 IMGUI(즉시 모드 GUI)에 익숙한 개발자를 위한 것입니다. 이 가이드는 에디터 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 툴킷 시작하기를 참조하십시오.
IMGUIContainer를 사용하여 IMGUI 코드를 VisualElement 안에 배치합니다. OnGUI() 내부에서 수행할 수 있는 모든 작업이 지원됩니다.
여러 IMGUIContainer를 배열하고 GUILayout과 UI 툴킷 레이아웃을 혼합하여 배치할 수 있습니다. IMGUIContainer 안에 VisualElement 인스턴스를 추가할 수는 없습니다.
IMGUIContainer 예시다음 표에는 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.position을 Position.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.position을 Absolute로 설정합니다. 위치를 정의하려면 style.top 및 style.left를 설정합니다. 크기를 정의하려면 style.width 및 style.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 |
direction이 Horizontal로 설정된 Scroller
|
HorizontalSlider() |
GUI, GUILayout |
direction이 Horizontal로 설정된 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 |
isSelectable 및 focusable이 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.whiteSpace가 Normal로, ScrollView.verticalScrollerVisibility가 Auto로 설정된 TextField
|
TextField() |
EditorGUI, EditorGUILayout, GUI, GUILayout |
multiline이 true로 설정되고 style.whiteSpace가 NoWrap으로 설정된 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 |
direction이 Vertical로 설정된 Scroller
|
VerticalSlider() |
GUI, GUILayout |
direction이 Vertical로 설정된 Slider
|
Width() |
GUILayout | VisualElement.style.width |
Window() |
GUI, GUILayout | 해당 없음 |