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

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

IMGUIC容器示例
IMGUIContainer

从 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-pathBeginProperty()EndProperty()
BeginScrollView()编辑器GUILayout, GUI, GUILayoutUnityEngine.UIElements.ScrollView
BeginToggleGroup()编辑器图形设计没有等价物。
BeginVertical()编辑GUILayout, GUILayout看。BeginArea()
BoundsField()EditorGUI, EditorGUILayoutBoundsField
BoundsIntField()EditorGUI, EditorGUILayoutBoundsIntField
Box()GUI, GUILayoutBox
BringWindowToBack()图形用户界面看。Window()
BringWindowToFront()图形用户界面看。Window()
Button()GUI, GUILayoutButton
CanCacheInspectorGUI()编辑器图形用户界面在保留模式下不需要。
ChangeCheckScope编辑器图形用户界面UI 工具包中通常不需要范围。看。BeginChangeCheck()
ColorField()EditorGUI, EditorGUILayoutColorField
CommandEvent()编辑器图形用户界面在保留模式下通常不需要。使用 C# 回调来处理事件。
CurveField()EditorGUI, EditorGUILayoutCurveField
DelayedDoubleField()EditorGUI, EditorGUILayout isDelay 设置为 true 的 DoubleField
DelayedFloatField()EditorGUI, EditorGUILayoutFloatField with isDelay 设置为 true。
DelayedIntField()EditorGUI, EditorGUILayoutIntegerField with isDelay 设置为真。
DelayedTextField()EditorGUI, EditorGUILayout将 isDelay 设置为 true 的文本字段
DisabledScopeEditorGUIScopes are generally not needed in UI Toolkit. See .BeginDisabledGroup()
DoubleField()EditorGUI, EditorGUILayoutDoubleField
DragWindow()GUISee .Window()
DrawPreviewTexture()EditorGUINo equivalent.
DrawRect()EditorGUIUse 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()GUIImage. Set tintColor in place of . There is no equivalent for a false . There are no equivalents for , , , or .coloralphaBlendborderWidthborderWidthsborderRadiusborderRadiuses
DrawTextureAlpha()EditorGUINo equivalent.
DrawTextureWithTexCoords()GUIImage. Set uv in place of . There is no equivalent for a false .texCoordsalphaBlend
DropdownButton()EditorGUI, EditorGUILayoutNo exact equivalent. Use fully-fledged DropdownFields instead of just a .DropdownButton()
DropShadowLabel()EditorGUILabel 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, EditorGUILayoutEnumFlagsField
EnumPopup()EditorGUI, EditorGUILayoutEnumField
ExpandHeight()桂冠没有等价物。
ExpandWidth()桂冠没有等价物。
FlexibleSpace()桂冠看。Space()
FloatField()EditorGUI, EditorGUILayoutFloatField
FocusControl()图形用户界面VisualElement.Focus()
FocusTextInControl()编辑器图形用户界面TextField.Focus()
FocusWindow()图形用户界面看。Window()
Foldout()EditorGUI, EditorGUILayoutFoldout
GetControlRect()编辑器图形设计只需要从 EditorGUILayout 转换为 EditorGUI。在 UI 工具包中不需要。
GetNameOfFocusedControl()图形用户界面VisualElement.focusController.focusedElement
GetPropertyHeight()编辑器图形用户界面PropertyField.layout.height
GradientField()EditorGUI, EditorGUILayoutGradientField
GroupScope图形用户界面UI 工具包中通常不需要范围。看。BeginArea()
Height()桂冠VisualElement.style.height
HelpBox()EditorGUI, EditorGUILayoutHelpBox
HorizontalScope编辑GUILayout, GUILayoutUI 工具包中通常不需要范围。看。BeginArea()
HorizontalScrollbar()GUI, GUILayout方向设置为水平滚动条
HorizontalSlider()GUI, GUILayout方向设置为“水平”滑块
InspectorTitlebar()EditorGUI, EditorGUILayout没有等价物。
IntField()EditorGUI, EditorGUILayoutIntegerField
IntPopup()EditorGUI, EditorGUILayout没有等价物。
IntSlider()EditorGUI, EditorGUILayoutSliderInt
Label()GUI, GUILayoutLabel
LabelField()EditorGUI, EditorGUILayout isReadOnly 设置为 true 的文本字段。
LayerField()EditorGUI, EditorGUILayoutLayerField
LinkButton()EditorGUI, EditorGUILayout没有等价物。
Load()编辑器图形用户界面如果使用 C#,则可以按原样使用此函数,并将其返回值分配给所需的属性。如果使用 USS,请使用与 相同的参数的函数。VisualElement.styleresource()Load()
LongField()EditorGUI, EditorGUILayoutLongField
MaskField()EditorGUI, EditorGUILayoutMaskField
MaxHeight()桂冠VisualElement.style.maxHeight
MaxWidth()桂冠VisualElement.style.maxWidth
MinHeight()桂冠VisualElement.style.minHeight
MinMaxSlider()EditorGUI, EditorGUILayoutMinMaxSlider
MinWidth()桂冠VisualElement.style.minWidth
ModalWindow()图形用户界面看。Window()
[不可重新排序] 属性确保 ListView.reorderable 为 false。
ObjectField()EditorGUI, EditorGUILayoutObjectField
PasswordField()EditorGUI, EditorGUILayout, GUI, GUILayout将 isPasswordField 设置为 true 的文本字段
PixelsToPoints()编辑器图形用户界面适用于 UI 工具包。
PointsToPixels()编辑器图形用户界面适用于 UI 工具包。
Popup()EditorGUI, EditorGUILayoutPopupField<T0>
ProgressBar()编辑器图形用户界面ProgressBar
PropertyField()EditorGUI, EditorGUILayoutPropertyField
PropertyScope编辑器图形用户界面UI 工具包中通常不需要范围。看。BeginProperty()
RectField()EditorGUI, EditorGUILayoutRectField
RectIntField()EditorGUI, EditorGUILayoutRectIntField
RepeatButton()GUI, GUILayoutRepeatButton
ScrollTo()图形用户界面ScrollView.ScrollTo() 或 ScrollView.scrollOffset
ScrollViewScope编辑器GUILayout, GUI, GUILayoutUI 工具包中通常不需要范围。看。BeginScrollView()
SelectableLabel()EditorGUI, EditorGUILayout没有等价物。
SelectionGrid()GUI, GUILayoutRadioButton
SetNextControlName()图形用户界面VisualElement.name
singleLineHeight编辑器图形用户界面使用 USS 变量 。--unity-metrics-single_line-height
Slider()EditorGUI, EditorGUILayoutSlider
Space()编辑GUILayout, GUILayout使用属性配置可视元素之间的间距。flex
TagField()EditorGUI, EditorGUILayoutTagField
TextArea()EditorGUI, EditorGUILayout, GUI, GUILayout多行设置为 true 的文本字段style.whiteSpace 设置为“正常”,ScrollView.verticalScrollerVisibility 设置为“自动”。
TextField()EditorGUI, EditorGUILayout, GUI, GUILayout多行设置为 true 且 style.whiteSpace 设置为 NoWrap  TextField
Toggle()EditorGUI, EditorGUILayout, GUI, GUILayoutToggle
ToggleGroupScope编辑器图形设计UI 工具包中通常不需要范围。看。BeginToggleGroup()
ToggleLeft()EditorGUI, EditorGUILayout切换,但不设置标签,而是设置文本
Toolbar()GUI, GUILayout没有等价物。
UnfocusWindow()图形用户界面看。Window()
Vector2Field()EditorGUI, EditorGUILayoutVector2Field
Vector2IntField()EditorGUI, EditorGUILayoutVector2IntField
Vector3Field()EditorGUI, EditorGUILayoutVector3Field
Vector3IntField()EditorGUI, EditorGUILayoutVector3IntField
Vector4Field()EditorGUI, EditorGUILayoutVector4Field
VerticalScope编辑GUILayout, GUILayoutUI 工具包中通常不需要范围。看。BeginArea()
VerticalScrollbar()GUI, GUILayout方向设置为“垂直”滚动条
VerticalSlider()GUI, GUILayout方向设置为“垂直”滑块
Width()桂冠VisualElement.style.width
Window()GUI, GUILayout没有等价物。

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :从 Unity UI (uGUI) 迁移到 UI 工具包 (mvrlink.com)

下一篇:Unity3D :画布组件之画布 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号