Version: 6000.3
语言: 中文
从 uGUI 迁移到 UI Toolkit
Unity 用户界面

从即时模式 GUI (IMGUI) 迁移到 UI 工具包

本指南适用于对即时模式GUI(IMGUI)有经验的开发人员,以迁移到UI Toolkit。本指南重点介绍编辑器UI,但其信息也适用于运行时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入门

IMGUI 支持

使用IMGUIContainer将 IMGUI 代码放置在VisualElement.您可以在内部执行的一切OnGUI()被支持。

您可以安排多个IMGUIContainers 并通过混合来布置它们GUILayout和 UI 工具包布局。请注意,无法添加VisualElement实例IMGUIContainer.

IMGUIContainer 示例
IMGUIContainer

从 IMGUI 到 UI Toolkit 的转换

下表列出了 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.positionPosition.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 DoubleFieldisDelayed设置为 true。
DelayedFloatField() EditorGUI、EditorGUILayout FloatFieldisDelayed设置为 true。
DelayedIntField() EditorGUI、EditorGUILayout IntegerFieldisDelayed设置为 true。
DelayedTextField() EditorGUI、EditorGUILayout TextFieldisDelayed设置为 true。
DisabledScope 编辑器GUI UI Toolkit 中通常不需要作用域。看BeginDisabledGroup().
DoubleField() EditorGUI、EditorGUILayout DoubleField
DragWindow() 图形用户界面 Window().
DrawPreviewTexture() 编辑器GUI 没有等价物。
DrawRect() 编辑器GUI VisualElement.设置style.positionAbsolute.设置style.topstyle.left以定义位置。设置style.widthstyle.height以定义大小。设置style.backgroundColor以设置颜色。
DrawTexture() 图形用户界面 Image.设置tintColor代替color.false 没有等价物alphaBlend.没有等效项borderWidth,borderWidths,borderRadiusborderRadiuses.
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退出 Scrollerdirection设置为Horizontal.
HorizontalSlider() GUI, GUI退出 Sliderdirection设置为Horizontal
InspectorTitlebar() EditorGUI、EditorGUILayout 没有等价物。
IntField() EditorGUI、EditorGUILayout IntegerField
IntPopup() EditorGUI、EditorGUILayout 没有等价物。
IntSlider() EditorGUI、EditorGUILayout SliderInt
Label() GUI, GUI退出 Label
LabelField() EditorGUI、EditorGUILayout TextFieldisReadOnly设置为 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选项输出 TextFieldisPasswordField设置为 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 LabelisSelectablefocusable设置为 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选项输出 TextFieldmultiline设置为 true,style.whiteSpace设置为NormalScrollView.verticalScrollerVisibility设置为Auto.
TextField() EditorGUI, EditorGUI选项, GUI, GUI选项输出 TextFieldmultiline设置为 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退出 Scrollerdirection设置为Vertical.
VerticalSlider() GUI, GUI退出 Sliderdirection设置为Vertical.
Width() GUI系列 VisualElement.style.width
Window() GUI, GUI退出 没有等价物。

其他资源

从 uGUI 迁移到 UI Toolkit
Unity 用户界面