包含此页的版本:
不含此页的版本:
本指南适用于对即时模式GUI(IMGUI)有经验的开发人员,以迁移到UI Toolkit。本指南重点介绍编辑器UI,但其信息也适用于运行时UI。
IMGUI 由调用OnGUI函数。UI Toolkit为编辑器UI创建提供了更多选项。使用UI Toolkit,你可以在C#中定义行为脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表. 但是,在定义 UI 元素和样式时,除了 C# 之外,还可以在 UI Builder 中直观地定义 UI 控件,或者直接编写类似 XML 的文本文件(称为 UXML)。有关详细信息,请参阅 UI 工具包入门。
使用 IMGUI,您可以在OnGUI()功能。 当事件进入 UI 或重新绘制 UI 时,您必须调用此函数。不同事件之间没有与 UI 树相关的持久信息。而您创建视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表在名为可视化树由轻量级节点组成的对象图,用于保存窗口或面板中的所有元素。它定义了使用 UI 工具包构建的每个 UI。
请参阅术语表. 可视化树中的信息将永久保留。
IMGUI 基于OnGUI()每帧至少运行一次的函数。您可以为每个可能的帧定义界面的外观和行为。的正文OnGUI()可能包含许多条件和不同的状态。
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 Toolkit 中如下所示:
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 Toolkit创建自定义编辑器窗口的完整示例,请参阅UI Toolkit入门。
使用IMGUIContainer将 IMGUI 代码放置在VisualElement.您可以在内部执行的一切OnGUI()被支持。
您可以安排多个IMGUIContainers 并通过混合来布置它们GUILayout和 UI 工具包布局。请注意,无法添加VisualElement实例IMGUIContainer.
IMGUIContainer例下表列出了 IMGUI 和 UI 工具包之间的等效功能:
| 行动 | IMGUI的 | UI 工具包 |
|---|---|---|
| 创建编辑器窗口 | EditorWindow.OnGUI() |
EditorWindow.CreateGUI() |
| 创建一个属性抽屉一种 Unity 功能,允许你使用脚本上的属性,或通过控制特定 Serializable 类的外观来自定义检查器窗口中某些控件的外观 更多信息 请参阅术语表或属性属性 |
PropertyDrawer.OnGUI() |
PropertyDrawer.CreatePropertyGUI() |
| 为检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息 请参阅术语表 |
Editor.OnInspectorGUI() |
Editor.CreateInspectorGUI() |
下表列出了 IMGUI 和 UI Toolkit 之间的等效方法、类和属性:
| IMGUI的 | IMGUI 命名空间 | UI 工具包 |
|---|---|---|
AddCursorRect() |
编辑器GUIUtility | 设置VisualElement.style.cursor,或在 UI Builder 或 USS 中设置视觉元素的光标纹理。如需更详细的交互性,请使用 C# 事件。 |
AreaScope |
GUI系列 | UI Toolkit 中通常不需要作用域。看BeginArea(). |
BeginArea() |
GUI系列 | 要定义区域本身,请创建一个视觉元素并将style.position自Position.Absolute.若要为该区域创建子元素,请在其下创建子视觉元素。 |
BeginBuildTargetSelectionGrouping() |
EditorGUI选择 | 没有等价物。 |
BeginChangeCheck() |
编辑器GUI | 在变更检查范围内的每个元素上注册回调。如果使用PropertyField作为自定义检查器中序列化字段的替代,请使用PropertyField.RegisterCallback<SerializedPropertyChangeEvent>()或PropertyField.RegisterValueChangeCallback().在所有其他情况下,使用VisualElement.RegisterCallback<ChangeEvent<T>>()或VisualElement.RegisterValueChangedCallback<T>(). |
BeginDisabledGroup() |
编辑器GUI | VisualElement.SetEnabled(false) |
BeginFoldoutHeaderGroup() |
EditorGUI、EditorGUILayout | 看Foldout(). |
BeginGroup() |
图形用户界面 | 看BeginArea(). |
BeginHorizontal() |
编辑GUILayout, GUILayout | 看BeginArea(). |
BeginProperty() |
编辑器GUI | 如果您使用BeginProperty()/EndProperty()若要将简单控件绑定到序列化属性,可以在 UI 工具包中调用BindProperty(),通过设置bindingPath,或通过将binding-pathUXML 属性。如果您使用BeginProperty()/EndProperty()从复杂的自定义 UI 中创建单个属性,这在 UI 工具包中不受很好的支持。 |
BeginScrollView() |
EditorGUI系列,GUI,GUI系列 | UnityEngine.UIElements.ScrollView |
BeginToggleGroup() |
EditorGUI选择 | 没有等价物。 |
BeginVertical() |
编辑GUILayout, GUILayout | 看BeginArea(). |
BoundsField() |
EditorGUI、EditorGUILayout | BoundsField |
BoundsIntField() |
EditorGUI、EditorGUILayout | BoundsIntField |
Box() |
GUI, GUI退出 | Box |
BringWindowToBack() |
图形用户界面 | 看Window(). |
BringWindowToFront() |
图形用户界面 | 看Window(). |
Button() |
GUI, GUI退出 | Button |
CanCacheInspectorGUI() |
编辑器GUI | 在保留模式下不需要。 |
ChangeCheckScope |
编辑器GUI | UI Toolkit 中通常不需要作用域。看BeginChangeCheck(). |
ColorField() |
EditorGUI、EditorGUILayout | ColorField |
CommandEvent() |
编辑器GUIUtility | 在保留模式下通常不需要。使用 C# 回调来处理事件。 |
CurveField() |
EditorGUI、EditorGUILayout | CurveField |
DelayedDoubleField() |
EditorGUI、EditorGUILayout |
DoubleField跟isDelayed设置为 true。 |
DelayedFloatField() |
EditorGUI、EditorGUILayout |
FloatField跟isDelayed设置为 true。 |
DelayedIntField() |
EditorGUI、EditorGUILayout |
IntegerField跟isDelayed设置为 true。 |
DelayedTextField() |
EditorGUI、EditorGUILayout |
TextField跟isDelayed设置为 true。 |
DisabledScope |
编辑器GUI | UI Toolkit 中通常不需要作用域。看BeginDisabledGroup(). |
DoubleField() |
EditorGUI、EditorGUILayout | DoubleField |
DragWindow() |
图形用户界面 | 看Window(). |
DrawPreviewTexture() |
编辑器GUI | 没有等价物。 |
DrawRect() |
编辑器GUI | 用VisualElement.设置style.position自Absolute.设置style.top和style.left以定义位置。设置style.width和style.height以定义大小。设置style.backgroundColor以设置颜色。 |
DrawTexture() |
图形用户界面 |
Image.设置tintColor代替color.false 没有等价物alphaBlend.没有等效项borderWidth,borderWidths,borderRadius或borderRadiuses. |
DrawTextureAlpha() |
编辑器GUI | 没有等价物。 |
DrawTextureWithTexCoords() |
图形用户界面 |
Image.设置uv代替texCoords.false 没有等价物alphaBlend. |
DropdownButton() |
EditorGUI、EditorGUILayout | 没有完全等价的。使用成熟的DropdownFields 而不仅仅是DropdownButton(). |
DropShadowLabel() |
编辑器GUI |
Label阴影值设置在style.textShadow. |
EditorToolbar() |
EditorGUI选择 | 创建一个Toolbar与一个ToolbarButton对于每个工具。对于每个ToolbarButton,点击调用时注册回调ToolManager.SetActiveTool()或ToolManager.RestorePreviousTool()使该按钮分别激活或停用它。 |
EndArea() |
GUI系列 | 看BeginArea(). |
EndBuildTargetSelectionGrouping() |
EditorGUI选择 | 看BeginBuildTargetSelectionGrouping(). |
EndChangeCheck() |
编辑器GUI | 看BeginChangeCheck(). |
EndDisabledGroup() |
编辑器GUI | 看BeginDisabledGroup(). |
EndFoldoutHeaderGroup() |
EditorGUI、EditorGUILayout | 看Foldout(). |
EndGroup() |
图形用户界面 | 看BeginArea(). |
EndHorizontal() |
编辑GUILayout, GUILayout | 看BeginArea(). |
EndProperty() |
编辑器GUI | 看BeginProperty(). |
EndScrollView() |
EditorGUI系列,GUI,GUI系列 | 看BeginScrollView(). |
EndToggleGroup() |
EditorGUI选择 | 看BeginToggleGroup(). |
EndVertical() |
编辑GUILayout, GUILayout | 看BeginArea(). |
EnumFlagsField() |
EditorGUI、EditorGUILayout | EnumFlagsField |
EnumPopup() |
EditorGUI、EditorGUILayout | EnumField |
ExpandHeight() |
GUI系列 | 没有等价物。 |
ExpandWidth() |
GUI系列 | 没有等价物。 |
FlexibleSpace() |
GUI系列 | 看Space(). |
FloatField() |
EditorGUI、EditorGUILayout | FloatField |
FocusControl() |
图形用户界面 | VisualElement.Focus() |
FocusTextInControl() |
编辑器GUI | TextField.Focus() |
FocusWindow() |
图形用户界面 | 看Window(). |
Foldout() |
EditorGUI、EditorGUILayout | Foldout |
GetControlRect() |
EditorGUI选择 | 只需从 EditorGUILayout 转换为 EditorGUI。UI Toolkit 中不需要。 |
GetNameOfFocusedControl() |
图形用户界面 | VisualElement.focusController.focusedElement |
GetPropertyHeight() |
编辑器GUI | PropertyField.layout.height |
GradientField() |
EditorGUI、EditorGUILayout | GradientField |
GroupScope |
图形用户界面 | UI Toolkit 中通常不需要作用域。看BeginArea(). |
Height() |
GUI系列 | VisualElement.style.height |
HelpBox() |
EditorGUI、EditorGUILayout | HelpBox |
HorizontalScope |
编辑GUILayout, GUILayout | UI Toolkit 中通常不需要作用域。看BeginArea(). |
HorizontalScrollbar() |
GUI, GUI退出 |
Scroller跟direction设置为Horizontal. |
HorizontalSlider() |
GUI, GUI退出 |
Slider跟direction设置为Horizontal
|
InspectorTitlebar() |
EditorGUI、EditorGUILayout | 没有等价物。 |
IntField() |
EditorGUI、EditorGUILayout | IntegerField |
IntPopup() |
EditorGUI、EditorGUILayout | 没有等价物。 |
IntSlider() |
EditorGUI、EditorGUILayout | SliderInt |
Label() |
GUI, GUI退出 | Label |
LabelField() |
EditorGUI、EditorGUILayout |
TextField跟isReadOnly设置为 true。 |
LayerField() |
EditorGUI、EditorGUILayout | LayerField |
LinkButton() |
EditorGUI、EditorGUILayout | 没有等价物。 |
Load() |
编辑器GUIUtility | 如果使用 C#,您可以按原样使用此函数,并将其返回值分配给VisualElement.style你想要的财产。如果使用 USS,请使用函数resource()用同样的论点,你会给Load(). |
LongField() |
EditorGUI、EditorGUILayout | LongField |
MaskField() |
EditorGUI、EditorGUILayout | MaskField |
MaxHeight() |
GUI系列 | VisualElement.style.maxHeight |
MaxWidth() |
GUI系列 | VisualElement.style.maxWidth |
MinHeight() |
GUI系列 | VisualElement.style.minHeight |
MinMaxSlider() |
EditorGUI、EditorGUILayout | MinMaxSlider |
MinWidth() |
GUI系列 | VisualElement.style.minWidth |
ModalWindow() |
图形用户界面 | 看Window(). |
[NonReorderable]属性 |
确保ListView.reorderable是错误的。 |
|
ObjectField() |
EditorGUI、EditorGUILayout | ObjectField |
PasswordField() |
EditorGUI, EditorGUI选项, GUI, GUI选项输出 |
TextField跟isPasswordField设置为 true |
PixelsToPoints() |
编辑器GUIUtility | 适用于 UI 工具包。 |
PointsToPixels() |
编辑器GUIUtility | 适用于 UI 工具包。 |
Popup() |
EditorGUI、EditorGUILayout | PopupField<T0> |
ProgressBar() |
编辑器GUI | ProgressBar |
PropertyField() |
EditorGUI、EditorGUILayout | PropertyField |
PropertyScope |
编辑器GUI | UI Toolkit 中通常不需要作用域。看BeginProperty(). |
RectField() |
EditorGUI、EditorGUILayout | RectField |
RectIntField() |
EditorGUI、EditorGUILayout | RectIntField |
RepeatButton() |
GUI, GUI退出 | RepeatButton |
ScrollTo() |
图形用户界面 |
ScrollView.ScrollTo()或ScrollView.scrollOffset
|
ScrollViewScope |
EditorGUI系列,GUI,GUI系列 | UI Toolkit 中通常不需要作用域。看BeginScrollView(). |
SelectableLabel() |
EditorGUI、EditorGUILayout |
Label跟isSelectable和focusable设置为 true。 |
SelectionGrid() |
GUI, GUI退出 | RadioButton |
SetNextControlName() |
图形用户界面 | VisualElement.name |
singleLineHeight |
编辑器GUIUtility | 使用 USS 变量--unity-metrics-single_line-height. |
Slider() |
EditorGUI、EditorGUILayout | Slider |
Space() |
编辑GUILayout, GUILayout | 用flex属性来配置视觉元素之间的间距。 |
TagField() |
EditorGUI、EditorGUILayout | TagField |
TextArea() |
EditorGUI, EditorGUI选项, GUI, GUI选项输出 |
TextField跟multiline设置为 true,style.whiteSpace设置为Normal和ScrollView.verticalScrollerVisibility设置为Auto. |
TextField() |
EditorGUI, EditorGUI选项, GUI, GUI选项输出 |
TextField跟multiline设置为 true 和style.whiteSpace设置为NoWrap. |
Toggle() |
EditorGUI, EditorGUI选项, GUI, GUI选项输出 | Toggle |
ToggleGroupScope |
EditorGUI选择 | UI Toolkit 中通常不需要作用域。看BeginToggleGroup(). |
ToggleLeft() |
EditorGUI、EditorGUILayout |
Toggle,但不是将label设置text. |
Toolbar() |
GUI, GUI退出 | 没有等价物。 |
UnfocusWindow() |
图形用户界面 | 看Window(). |
Vector2Field() |
EditorGUI、EditorGUILayout | Vector2Field |
Vector2IntField() |
EditorGUI、EditorGUILayout | Vector2IntField |
Vector3Field() |
EditorGUI、EditorGUILayout | Vector3Field |
Vector3IntField() |
EditorGUI、EditorGUILayout | Vector3IntField |
Vector4Field() |
EditorGUI、EditorGUILayout | Vector4Field |
VerticalScope |
编辑GUILayout, GUILayout | UI Toolkit 中通常不需要作用域。看BeginArea(). |
VerticalScrollbar() |
GUI, GUI退出 |
Scroller跟direction设置为Vertical. |
VerticalSlider() |
GUI, GUI退出 |
Slider跟direction设置为Vertical. |
Width() |
GUI系列 | VisualElement.style.width |
Window() |
GUI, GUI退出 | 没有等价物。 |