Unity3D :从即时模式 GUI (IMGUI) 迁移到 UI 工具包
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
从即时模式 GUI (IMGUI) 迁移到 UI 工具包
本指南适用于具有即时模式 GUI (IMGUI) 经验的开发人员,可迁移到用户界面
工具箱。本指南重点介绍编辑器 UI,但其信息也适用于运行时 UI。
主要区别
代码驱动与 UI 驱动
IMGUI 是由代码驱动的,由在实现它的 C# 脚本中调用函数来驱动。UI 工具包为编辑器 UI 创建提供了更多选项。使用 UI 工具包,可以在 C# 中定义行为OnGUI
脚本
.但是,在定义 UI 元素和样式时,除了 C# 之外,您还可以在 UI 生成器中直观地定义 UI 控件,或者直接编写类似 XML 的文本文件(称为 UXML)。有关详细信息,请参阅简单 UI 工具包工作流。
即时模式与保留模式
使用 IMGUI,您可以在 OnGUI()
函数中重新绘制 UI 时描述 UI 树。当事件进入 UI 或重新绘制 UI 时,必须调用此函数。不同事件之间没有关于 UI 树的持久信息。而,您创建视觉元素在名为可视化树.可视化树中的信息将永久保留。
常量与状态变化
IMGUI基于每帧至少运行一次的功能。您可以为每个可能的帧定义 UI 的外观和行为。可能包含许多条件和不同的状态。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 工具包中如下所示:
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 支持
使用 将 IMGUI 代码放在 .支持您在内部可以执行的所有操作。IMGUIContainerVisualElementOnGUI()
您可以通过混合和 UI 工具包布局来排列多个 s 并对其进行布局。请注意,无法在 .IMGUIContainerGUILayoutVisualElementIMGUIContainer
从 IMGUI 到 UI 工具包转换
下表列出了 IMGUI 和 UI 工具包之间的等效函数:
行动 | 伊姆吉 | 用户界面工具包 |
---|---|---|
创建编辑器窗口 | EditorWindow.OnGUI() | EditorWindow.CreateGUI() |
创建一个物业抽屉或属性属性 | PropertyDrawer.OnGUI() | PropertyDrawer.CreatePropertyGUI() |
为检查员 | Editor.OnInspectorGUI() | Editor.CreateInspectorGUI() |
下表列出了IMGUI和UI工具包之间的等效方法,类和属性:
伊姆吉 | IMGUI 命名空间 | 用户界面工具包 |
---|---|---|
AddCursorRect() | 编辑器图形用户界面 | 设置 VisualElement.style.cursor ,或在 UI Builder 或 USS 中设置可视元素的光标纹理。有关更详细的交互性,请使用 C# 事件。 |
AreaScope | 桂冠 | UI 工具包中通常不需要范围。看。BeginArea() |
BeginArea() | 桂冠 | 若要定义区域本身,请创建一个可视元素并将 style.position 设置为 Position.Absolute 。若要为该区域创建子项,请在该区域下创建子视觉元素。 |
BeginBuildTargetSelectionGrouping() | 编辑器图形设计 | 没有等价物。 |
BeginChangeCheck() | 编辑器图形用户界面 | 对更改检查范围中的每个元素注册回调。如果使用 PropertyField 作为自定检查器中序列化字段的替身,请使用 PropertyField.RegisterCallback<SerializedPropertyChangeEvent>() 或 PropertyField.RegisterValueChangeCallback( )。 在所有其他情况下,请使用 VisualElement.RegisterCallback<ChangeEvent<T>>() 或 VisualElement.RegisterValueChangedCallback<T >()。 |
BeginDisabledGroup() | 编辑器图形用户界面 | VisualElement.SetEnabled(false) |
BeginFoldoutHeaderGroup() | EditorGUI, EditorGUILayout | 看。Foldout() |
BeginGroup() | 图形用户界面 | 看。BeginArea() |
BeginHorizontal() | 编辑GUILayout, GUILayout | 看。BeginArea() |
BeginProperty() | 编辑器图形用户界面 | 如果使用 / 将简单控件绑定到序列化属性,则可以在 UI 工具包中通过调用 BindProperty()、 设置 bindingPath 或设置 UXML 属性来执行此操作。如果使用 / 从复杂的自定义 UI 中创建单个属性,则在 UI 工具包中不支持该属性。BeginProperty() EndProperty() binding-path BeginProperty() EndProperty() |
BeginScrollView() | 编辑器GUILayout, GUI, GUILayout | UnityEngine.UIElements.ScrollView |
BeginToggleGroup() | 编辑器图形设计 | 没有等价物。 |
BeginVertical() | 编辑GUILayout, GUILayout | 看。BeginArea() |
BoundsField() | EditorGUI, EditorGUILayout | BoundsField |
BoundsIntField() | EditorGUI, EditorGUILayout | BoundsIntField |
Box() | GUI, GUILayout | Box |
BringWindowToBack() | 图形用户界面 | 看。Window() |
BringWindowToFront() | 图形用户界面 | 看。Window() |
Button() | GUI, GUILayout | Button |
CanCacheInspectorGUI() | 编辑器图形用户界面 | 在保留模式下不需要。 |
ChangeCheckScope | 编辑器图形用户界面 | UI 工具包中通常不需要范围。看。BeginChangeCheck() |
ColorField() | EditorGUI, EditorGUILayout | ColorField |
CommandEvent() | 编辑器图形用户界面 | 在保留模式下通常不需要。使用 C# 回调来处理事件。 |
CurveField() | EditorGUI, EditorGUILayout | CurveField |
DelayedDoubleField() | EditorGUI, EditorGUILayout | 将 isDelay 设置为 true 的 DoubleField 。 |
DelayedFloatField() | EditorGUI, EditorGUILayout | FloatField with isDelay 设置为 true。 |
DelayedIntField() | EditorGUI, EditorGUILayout | IntegerField with isDelay 设置为真。 |
DelayedTextField() | EditorGUI, EditorGUILayout | 将 isDelay 设置为 true 的文本字段 。 |
DisabledScope | EditorGUI | Scopes are generally not needed in UI Toolkit. See .BeginDisabledGroup() |
DoubleField() | EditorGUI, EditorGUILayout | DoubleField |
DragWindow() | GUI | See .Window() |
DrawPreviewTexture() | EditorGUI | No equivalent. |
DrawRect() | EditorGUI | Use VisualElement . Set style.position to Absolute . Set style.top and style.left to define the position. Set style.width and style.height to define the size. Set style.backgroundColor to set the color. |
DrawTexture() | GUI | Image . Set tintColor in place of . There is no equivalent for a false . There are no equivalents for , , , or .color alphaBlend borderWidth borderWidths borderRadius borderRadiuses |
DrawTextureAlpha() | EditorGUI | No equivalent. |
DrawTextureWithTexCoords() | GUI | Image . Set uv in place of . There is no equivalent for a false .texCoords alphaBlend |
DropdownButton() | EditorGUI, EditorGUILayout | No exact equivalent. Use fully-fledged DropdownField s instead of just a .DropdownButton() |
DropShadowLabel() | EditorGUI | Label with shadow values set in style.textShadow . |
EditorToolbar() | 编辑器图形设计 | 为每个工具 创建一个工具栏,其中包含一个工具栏按钮 。对于每个 ,在单击以调用 ToolManager.SetActiveTool() 或 ToolManager.RestorePreviousTool() 时注册一个回调,以使该按钮分别激活或停用该工具。
ToolbarButton |
EndArea() | 桂冠 | 看。BeginArea() |
EndBuildTargetSelectionGrouping() | 编辑器图形设计 | 看。BeginBuildTargetSelectionGrouping() |
EndChangeCheck() | 编辑器图形用户界面 | 看。BeginChangeCheck() |
EndDisabledGroup() | 编辑器图形用户界面 | 看。BeginDisabledGroup() |
EndFoldoutHeaderGroup() | EditorGUI, EditorGUILayout | 看。Foldout() |
EndGroup() | 图形用户界面 | 看。BeginArea() |
EndHorizontal() | 编辑GUILayout, GUILayout | 看。BeginArea() |
EndProperty() | 编辑器图形用户界面 | 看。BeginProperty() |
EndScrollView() | 编辑器GUILayout, GUI, GUILayout | 看。BeginScrollView() |
EndToggleGroup() | 编辑器图形设计 | 看。BeginToggleGroup() |
EndVertical() | 编辑GUILayout, GUILayout | 看。BeginArea() |
EnumFlagsField() | EditorGUI, EditorGUILayout | EnumFlagsField |
EnumPopup() | EditorGUI, EditorGUILayout | EnumField |
ExpandHeight() | 桂冠 | 没有等价物。 |
ExpandWidth() | 桂冠 | 没有等价物。 |
FlexibleSpace() | 桂冠 | 看。Space() |
FloatField() | EditorGUI, EditorGUILayout | FloatField |
FocusControl() | 图形用户界面 | VisualElement.Focus() |
FocusTextInControl() | 编辑器图形用户界面 | TextField.Focus() |
FocusWindow() | 图形用户界面 | 看。Window() |
Foldout() | EditorGUI, EditorGUILayout | Foldout |
GetControlRect() | 编辑器图形设计 | 只需要从 EditorGUILayout 转换为 EditorGUI。在 UI 工具包中不需要。 |
GetNameOfFocusedControl() | 图形用户界面 | VisualElement.focusController.focusedElement |
GetPropertyHeight() | 编辑器图形用户界面 | PropertyField.layout.height |
GradientField() | EditorGUI, EditorGUILayout | GradientField |
GroupScope | 图形用户界面 | UI 工具包中通常不需要范围。看。BeginArea() |
Height() | 桂冠 | VisualElement.style.height |
HelpBox() | EditorGUI, EditorGUILayout | HelpBox |
HorizontalScope | 编辑GUILayout, GUILayout | UI 工具包中通常不需要范围。看。BeginArea() |
HorizontalScrollbar() | GUI, GUILayout | 方向 设置为水平 的滚动条 。 |
HorizontalSlider() | GUI, GUILayout | 方向 设置为“水平” 的滑块 |
InspectorTitlebar() | EditorGUI, EditorGUILayout | 没有等价物。 |
IntField() | EditorGUI, EditorGUILayout | IntegerField |
IntPopup() | EditorGUI, EditorGUILayout | 没有等价物。 |
IntSlider() | EditorGUI, EditorGUILayout | SliderInt |
Label() | GUI, GUILayout | Label |
LabelField() | EditorGUI, EditorGUILayout | 将 isReadOnly 设置为 true 的文本字段。 |
LayerField() | EditorGUI, EditorGUILayout | LayerField |
LinkButton() | EditorGUI, EditorGUILayout | 没有等价物。 |
Load() | 编辑器图形用户界面 | 如果使用 C#,则可以按原样使用此函数,并将其返回值分配给所需的属性。如果使用 USS,请使用与 相同的参数的函数。VisualElement.style resource() Load() |
LongField() | EditorGUI, EditorGUILayout | LongField |
MaskField() | EditorGUI, EditorGUILayout | MaskField |
MaxHeight() | 桂冠 | VisualElement.style.maxHeight |
MaxWidth() | 桂冠 | VisualElement.style.maxWidth |
MinHeight() | 桂冠 | VisualElement.style.minHeight |
MinMaxSlider() | EditorGUI, EditorGUILayout | MinMaxSlider |
MinWidth() | 桂冠 | VisualElement.style.minWidth |
ModalWindow() | 图形用户界面 | 看。Window() |
[不可重新排序] 属性 | 确保 ListView.reorderable 为 false。 | |
ObjectField() | EditorGUI, EditorGUILayout | ObjectField |
PasswordField() | EditorGUI, EditorGUILayout, GUI, GUILayout | 将 isPasswordField 设置为 true 的文本字段 |
PixelsToPoints() | 编辑器图形用户界面 | 适用于 UI 工具包。 |
PointsToPixels() | 编辑器图形用户界面 | 适用于 UI 工具包。 |
Popup() | EditorGUI, EditorGUILayout | PopupField<T0> |
ProgressBar() | 编辑器图形用户界面 | ProgressBar |
PropertyField() | EditorGUI, EditorGUILayout | PropertyField |
PropertyScope | 编辑器图形用户界面 | UI 工具包中通常不需要范围。看。BeginProperty() |
RectField() | EditorGUI, EditorGUILayout | RectField |
RectIntField() | EditorGUI, EditorGUILayout | RectIntField |
RepeatButton() | GUI, GUILayout | RepeatButton |
ScrollTo() | 图形用户界面 | ScrollView.ScrollTo() 或 ScrollView.scrollOffset
|
ScrollViewScope | 编辑器GUILayout, GUI, GUILayout | UI 工具包中通常不需要范围。看。BeginScrollView() |
SelectableLabel() | EditorGUI, EditorGUILayout | 没有等价物。 |
SelectionGrid() | GUI, GUILayout | RadioButton |
SetNextControlName() | 图形用户界面 | VisualElement.name |
singleLineHeight | 编辑器图形用户界面 | 使用 USS 变量 。--unity-metrics-single_line-height |
Slider() | EditorGUI, EditorGUILayout | Slider |
Space() | 编辑GUILayout, GUILayout | 使用属性配置可视元素之间的间距。flex |
TagField() | EditorGUI, EditorGUILayout | TagField |
TextArea() | EditorGUI, EditorGUILayout, GUI, GUILayout | 多行 设置为 true 的文本字段 ,style.whiteSpace 设置为“正常 ”,ScrollView.verticalScrollerVisibility 设置为“自动 ”。 |
TextField() | EditorGUI, EditorGUILayout, GUI, GUILayout | 多行 设置为 true 且 style.whiteSpace 设置为 NoWrap 的 TextField 。 |
Toggle() | EditorGUI, EditorGUILayout, GUI, GUILayout | Toggle |
ToggleGroupScope | 编辑器图形设计 | UI 工具包中通常不需要范围。看。BeginToggleGroup() |
ToggleLeft() | EditorGUI, EditorGUILayout | 切换 ,但不设置标签 ,而是设置文本 。 |
Toolbar() | GUI, GUILayout | 没有等价物。 |
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 工具包中通常不需要范围。看。BeginArea() |
VerticalScrollbar() | GUI, GUILayout | 方向 设置为“垂直” 的滚动条 。 |
VerticalSlider() | GUI, GUILayout | 方向 设置为“垂直” 的滑块 。 |
Width() | 桂冠 | VisualElement.style.width |
Window() | GUI, GUILayout | 没有等价物。 |
由3D建模学习工作室整理翻译,转载请注明出处!