From 6b19fe2d81c43a8408f68b8ce55d84c873535620 Mon Sep 17 00:00:00 2001 From: cit110 <840418418@qq.com> Date: Sun, 26 Apr 2026 21:51:08 +0800 Subject: [PATCH] Use attribute menu design backplate --- .../T_PHY_UI_AttributeBackplate.uasset | 3 ++ .../Textures/T_PHY_UI_CinnabarTab.uasset | 4 +-- .../Textures/T_PHY_UI_GoldRule.uasset | 4 +-- .../Textures/T_PHY_UI_PortraitFrame.uasset | 4 +-- .../Textures/T_PHY_UI_RowStrip.uasset | 4 +-- .../Private/UI/PHYAttributeGroupWidget.cpp | 4 +-- .../PHY/Private/UI/PHYAttributeMenuWidget.cpp | 31 ++++++++++------- .../PHY/Private/UI/PHYAttributePageWidget.cpp | 33 ++++++++++++------- .../UI/PHYAttributeResourceBarWidget.cpp | 2 +- .../PHY/Private/UI/PHYAttributeRowWidget.cpp | 4 +-- .../Private/UI/PHYAttributeSummaryWidget.cpp | 16 +++++++-- Source/PHY/Public/UI/PHYAttributePageWidget.h | 6 +++- 12 files changed, 76 insertions(+), 39 deletions(-) create mode 100644 Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset diff --git a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset new file mode 100644 index 0000000..bcee20c --- /dev/null +++ b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a479d88bff1170beb8f415fb01e6ae2ce1483f6ca1e1fdf46a984b2ef26c4112 +size 1385162 diff --git a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset index 4bbb5ee..9f7918d 100644 --- a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset +++ b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:860f59a61b6e462f5fefb161d959adc496bc04fec6b92daa7c2016d014e9ea2d -size 61917 +oid sha256:eb842f02120fb8d40a4560b33bfef1986d1082260aff6b7ddbb7f31bff8f4a0c +size 66299 diff --git a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset index d6866de..ecfc1d1 100644 --- a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset +++ b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7fb6d42554088755838fbe0ec2f8ad077d96fb5a82e6431d65ba66f0441499f -size 6355 +oid sha256:c21b7ae8d324735fe33abe17667dc167809a803966a55595e81417cbd2190533 +size 6479 diff --git a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset index b31a519..ae11aa8 100644 --- a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset +++ b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd743d1c73ccdb2e40fd8083b1fcc810aab89e6c53cb989a98e41c2aa628f919 -size 85437 +oid sha256:92d41618388e86f976830600e86f6f5d734b914037b11417b7c5bb1e0dfcdd64 +size 244348 diff --git a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset index fc80a1c..02c3283 100644 --- a/Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset +++ b/Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1bf7b3fc64a5d3bbc66d1387fc88fd701084d03d02650374773b839e74ed8d79 -size 11058 +oid sha256:9bcf0ffcc438a43805e7d5578f329d4c7c84e7f53b649834b8f397370a6e77c7 +size 34857 diff --git a/Source/PHY/Private/UI/PHYAttributeGroupWidget.cpp b/Source/PHY/Private/UI/PHYAttributeGroupWidget.cpp index a34debc..9cd5005 100644 --- a/Source/PHY/Private/UI/PHYAttributeGroupWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributeGroupWidget.cpp @@ -98,8 +98,8 @@ void UPHYAttributeGroupWidget::BuildNativeWidgetTree() } UBorder* RootBorder = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("RootBorder")); - RootBorder->SetBrush(MakeAttributeGroupBrush(AttributeGroupPaperTexturePath, FVector2D(500.0f, 260.0f), FLinearColor(0.99f, 0.97f, 0.89f, 0.76f), ESlateBrushDrawType::Box, FMargin(0.045f))); - RootBorder->SetPadding(FMargin(14.0f, 10.0f)); + RootBorder->SetBrushColor(FLinearColor::Transparent); + RootBorder->SetPadding(FMargin(14.0f, 8.0f)); WidgetTree->RootWidget = RootBorder; UVerticalBox* RootBox = WidgetTree->ConstructWidget(UVerticalBox::StaticClass(), TEXT("RootBox")); diff --git a/Source/PHY/Private/UI/PHYAttributeMenuWidget.cpp b/Source/PHY/Private/UI/PHYAttributeMenuWidget.cpp index 9c43833..8d10fc3 100644 --- a/Source/PHY/Private/UI/PHYAttributeMenuWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributeMenuWidget.cpp @@ -41,6 +41,7 @@ namespace { constexpr float AttributeDesignWidth = 1693.0f; constexpr float AttributeDesignHeight = 942.0f; + const TCHAR* const AttributeBackplateTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.T_PHY_UI_AttributeBackplate"); const TCHAR* const AttributePaperTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_PaperPanel.T_PHY_UI_PaperPanel"); const TCHAR* const AttributeJadeTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_JadePanel.T_PHY_UI_JadePanel"); const TCHAR* const AttributeCinnabarTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.T_PHY_UI_CinnabarTab"); @@ -60,6 +61,14 @@ namespace return Brush; } + FSlateBrush MakeAttributeTransparentBrush() + { + FSlateBrush Brush; + Brush.DrawAs = ESlateBrushDrawType::NoDrawType; + Brush.TintColor = FSlateColor(FLinearColor::Transparent); + return Brush; + } + void AddAttributeMenuCanvasChild(UCanvasPanel* CanvasPanel, UWidget* ChildWidget, const FVector2D Position, const FVector2D Size, const int32 ZOrder = 0) { if (!CanvasPanel || !ChildWidget) @@ -88,16 +97,15 @@ namespace UButton* CreateAttributeNavButton(UWidgetTree* WidgetTree, const FName WidgetName, const FText Label, const bool bActive) { UButton* Button = WidgetTree->ConstructWidget(UButton::StaticClass(), WidgetName); - const FLinearColor NormalTint = bActive ? FLinearColor(1.0f, 0.95f, 0.82f, 0.98f) : FLinearColor(0.95f, 0.91f, 0.80f, 0.30f); - const FLinearColor HoverTint = bActive ? FLinearColor(1.0f, 0.98f, 0.88f, 1.0f) : FLinearColor(0.40f, 0.58f, 0.50f, 0.42f); FButtonStyle ButtonStyle; - ButtonStyle.SetNormal(MakeAttributeMenuBrush(AttributePaperTexturePath, FVector2D(180.0f, 72.0f), NormalTint)); - ButtonStyle.SetHovered(MakeAttributeMenuBrush(AttributePaperTexturePath, FVector2D(180.0f, 72.0f), HoverTint)); - ButtonStyle.SetPressed(MakeAttributeMenuBrush(AttributeCinnabarTexturePath, FVector2D(180.0f, 72.0f), FLinearColor(0.72f, 0.25f, 0.14f, 0.95f))); + const FSlateBrush TransparentBrush = MakeAttributeTransparentBrush(); + ButtonStyle.SetNormal(TransparentBrush); + ButtonStyle.SetHovered(TransparentBrush); + ButtonStyle.SetPressed(TransparentBrush); Button->SetStyle(ButtonStyle); - UTextBlock* ButtonText = CreateAttributeMenuText(WidgetTree, NAME_None, Label, 24, bActive ? FLinearColor(0.04f, 0.44f, 0.38f, 1.0f) : FLinearColor(0.30f, 0.28f, 0.22f, 1.0f)); + UTextBlock* ButtonText = CreateAttributeMenuText(WidgetTree, NAME_None, Label, 25, bActive ? FLinearColor(0.04f, 0.72f, 0.66f, 1.0f) : FLinearColor(0.34f, 0.32f, 0.26f, 0.62f)); Button->SetContent(ButtonText); return Button; } @@ -301,11 +309,11 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree() DesignSizeBox->AddChild(DesignCanvas); UBorder* BackgroundPanel = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("BackgroundPanel")); - BackgroundPanel->SetBrush(MakeAttributeMenuBrush(AttributePaperTexturePath, FVector2D(AttributeDesignWidth, AttributeDesignHeight), FLinearColor(0.96f, 0.93f, 0.84f, 1.0f), ESlateBrushDrawType::Box, FMargin(0.035f))); + BackgroundPanel->SetBrush(MakeAttributeMenuBrush(AttributeBackplateTexturePath, FVector2D(AttributeDesignWidth, AttributeDesignHeight), FLinearColor::White, ESlateBrushDrawType::Image, FMargin(0.0f))); AddAttributeMenuCanvasChild(DesignCanvas, BackgroundPanel, FVector2D(0.0f, 0.0f), FVector2D(AttributeDesignWidth, AttributeDesignHeight), 0); UBorder* TitlePlaque = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("TitlePlaque")); - TitlePlaque->SetBrush(MakeAttributeMenuBrush(AttributeJadeTexturePath, FVector2D(390.0f, 88.0f), FLinearColor(0.18f, 0.34f, 0.30f, 0.98f))); + TitlePlaque->SetBrushColor(FLinearColor::Transparent); TitlePlaque->SetPadding(FMargin(78.0f, 0.0f, 0.0f, 4.0f)); AddAttributeMenuCanvasChild(DesignCanvas, TitlePlaque, FVector2D(0.0f, 7.0f), FVector2D(402.0f, 88.0f), 3); @@ -322,17 +330,18 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree() AddAttributeMenuCanvasChild(DesignCanvas, BagNavButton, FVector2D(1188.0f, 11.0f), FVector2D(155.0f, 70.0f), 3); UBorder* HeaderRule = CreateAttributeMenuLine(WidgetTree, TEXT("HeaderRule")); - AddAttributeMenuCanvasChild(DesignCanvas, HeaderRule, FVector2D(392.0f, 85.0f), FVector2D(1245.0f, 18.0f), 2); + HeaderRule->SetBrushColor(FLinearColor::Transparent); + AddAttributeMenuCanvasChild(DesignCanvas, HeaderRule, FVector2D(392.0f, 85.0f), FVector2D(1245.0f, 18.0f), 1); SummaryWidget = WidgetTree->ConstructWidget(UPHYAttributeSummaryWidget::StaticClass(), TEXT("SummaryWidget")); UBorder* SummaryPanel = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("SummaryPanel")); - SummaryPanel->SetBrush(MakeAttributeMenuBrush(AttributePaperTexturePath, FVector2D(462.0f, 710.0f), FLinearColor(0.98f, 0.96f, 0.88f, 0.96f), ESlateBrushDrawType::Box, FMargin(0.085f))); + SummaryPanel->SetBrushColor(FLinearColor::Transparent); SummaryPanel->SetPadding(FMargin(27.0f, 24.0f, 27.0f, 22.0f)); SummaryPanel->SetContent(SummaryWidget); AddAttributeMenuCanvasChild(DesignCanvas, SummaryPanel, FVector2D(35.0f, 103.0f), FVector2D(462.0f, 710.0f), 2); UBorder* PageBorder = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("PageBorder")); - PageBorder->SetBrush(MakeAttributeMenuBrush(AttributePaperTexturePath, FVector2D(1120.0f, 735.0f), FLinearColor(0.98f, 0.96f, 0.88f, 0.92f), ESlateBrushDrawType::Box, FMargin(0.055f))); + PageBorder->SetBrushColor(FLinearColor::Transparent); PageBorder->SetPadding(FMargin(28.0f, 22.0f, 28.0f, 24.0f)); AddAttributeMenuCanvasChild(DesignCanvas, PageBorder, FVector2D(515.0f, 103.0f), FVector2D(1120.0f, 735.0f), 2); diff --git a/Source/PHY/Private/UI/PHYAttributePageWidget.cpp b/Source/PHY/Private/UI/PHYAttributePageWidget.cpp index ffb3c90..94e6fb4 100644 --- a/Source/PHY/Private/UI/PHYAttributePageWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributePageWidget.cpp @@ -5,9 +5,12 @@ #include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributePageWidget) #include "Blueprint/WidgetTree.h" +#include "Components/Border.h" #include "Components/ScrollBox.h" #include "Components/ScrollBoxSlot.h" #include "Components/TextBlock.h" +#include "Components/UniformGridPanel.h" +#include "Components/UniformGridSlot.h" #include "Components/VerticalBox.h" #include "Components/VerticalBoxSlot.h" #include "Fonts/SlateFontInfo.h" @@ -40,9 +43,10 @@ void UPHYAttributePageWidget::SetPageTitle(FText InPageTitle) void UPHYAttributePageWidget::ClearGroups() { - if (GroupsBox) + GroupCount = 0; + if (GroupsGrid) { - GroupsBox->ClearChildren(); + GroupsGrid->ClearChildren(); } } @@ -50,16 +54,22 @@ UPHYAttributeGroupWidget* UPHYAttributePageWidget::AddGroup(FText GroupTitle) { BuildNativeWidgetTree(); - if (!GroupsBox || !WidgetTree) + if (!GroupsGrid || !WidgetTree) { return nullptr; } UPHYAttributeGroupWidget* GroupWidget = WidgetTree->ConstructWidget(UPHYAttributeGroupWidget::StaticClass()); GroupWidget->SetGroupTitle(MoveTemp(GroupTitle)); - if (UVerticalBoxSlot* GroupSlot = GroupsBox->AddChildToVerticalBox(GroupWidget)) + UBorder* GroupPadding = WidgetTree->ConstructWidget(UBorder::StaticClass()); + GroupPadding->SetBrushColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.0f)); + GroupPadding->SetPadding(FMargin(0.0f, 0.0f, 14.0f, 14.0f)); + GroupPadding->SetContent(GroupWidget); + const int32 GroupIndex = GroupCount++; + if (UUniformGridSlot* GroupSlot = GroupsGrid->AddChildToUniformGrid(GroupPadding, GroupIndex / 2, GroupIndex % 2)) { - GroupSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, 12.0f)); + GroupSlot->SetHorizontalAlignment(HAlign_Fill); + GroupSlot->SetVerticalAlignment(VAlign_Top); } return GroupWidget; } @@ -71,7 +81,7 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree() WidgetTree = NewObject(this, TEXT("WidgetTree"), RF_Transient); } - if (WidgetTree->RootWidget && TitleText && GroupsScrollBox && GroupsBox) + if (WidgetTree->RootWidget && TitleText && GroupsScrollBox && GroupsGrid) { return; } @@ -80,11 +90,12 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree() WidgetTree->RootWidget = RootBox; TitleText = WidgetTree->ConstructWidget(UTextBlock::StaticClass(), TEXT("TitleText")); - TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 22)); - TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.42f, 0.18f, 0.08f, 1.0f))); + TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 12)); + TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.42f, 0.18f, 0.08f, 0.0f))); + TitleText->SetVisibility(ESlateVisibility::Collapsed); if (UVerticalBoxSlot* TitleSlot = RootBox->AddChildToVerticalBox(TitleText)) { - TitleSlot->SetPadding(FMargin(2.0f, 0.0f, 0.0f, 12.0f)); + TitleSlot->SetPadding(FMargin(0.0f)); } GroupsScrollBox = WidgetTree->ConstructWidget(UScrollBox::StaticClass(), TEXT("GroupsScrollBox")); @@ -93,8 +104,8 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree() ScrollSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill)); } - GroupsBox = WidgetTree->ConstructWidget(UVerticalBox::StaticClass(), TEXT("GroupsBox")); - if (UScrollBoxSlot* GroupsSlot = Cast(GroupsScrollBox->AddChild(GroupsBox))) + GroupsGrid = WidgetTree->ConstructWidget(UUniformGridPanel::StaticClass(), TEXT("GroupsGrid")); + if (UScrollBoxSlot* GroupsSlot = Cast(GroupsScrollBox->AddChild(GroupsGrid))) { GroupsSlot->SetPadding(FMargin(0.0f)); } diff --git a/Source/PHY/Private/UI/PHYAttributeResourceBarWidget.cpp b/Source/PHY/Private/UI/PHYAttributeResourceBarWidget.cpp index d5c760b..ef13da0 100644 --- a/Source/PHY/Private/UI/PHYAttributeResourceBarWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributeResourceBarWidget.cpp @@ -34,7 +34,7 @@ namespace Brush.DrawAs = ESlateBrushDrawType::Box; Brush.Margin = FMargin(0.08f); Brush.ImageSize = FVector2D(512.0f, 64.0f); - Brush.TintColor = FSlateColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.88f)); + Brush.TintColor = FSlateColor(FLinearColor(1.0f, 0.98f, 0.90f, 0.24f)); if (UTexture2D* Texture = LoadObject(nullptr, AttributeResourceRowTexturePath)) { Brush.SetResourceObject(Texture); diff --git a/Source/PHY/Private/UI/PHYAttributeRowWidget.cpp b/Source/PHY/Private/UI/PHYAttributeRowWidget.cpp index 23baa5f..314b276 100644 --- a/Source/PHY/Private/UI/PHYAttributeRowWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributeRowWidget.cpp @@ -75,8 +75,8 @@ void UPHYAttributeRowWidget::BuildNativeWidgetTree() } RowBorder = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("RowBorder")); - RowBorder->SetBrush(MakeAttributeRowBrush(AttributeRowTexturePath, FVector2D(512.0f, 64.0f), FLinearColor(1.0f, 0.98f, 0.90f, 0.78f))); - RowBorder->SetPadding(FMargin(11.0f, 5.0f)); + RowBorder->SetBrush(MakeAttributeRowBrush(AttributeRowTexturePath, FVector2D(512.0f, 64.0f), FLinearColor(1.0f, 0.98f, 0.90f, 0.42f))); + RowBorder->SetPadding(FMargin(9.0f, 3.0f)); WidgetTree->RootWidget = RowBorder; RowBox = WidgetTree->ConstructWidget(UHorizontalBox::StaticClass(), TEXT("RowBox")); diff --git a/Source/PHY/Private/UI/PHYAttributeSummaryWidget.cpp b/Source/PHY/Private/UI/PHYAttributeSummaryWidget.cpp index 8a99afd..d31f02f 100644 --- a/Source/PHY/Private/UI/PHYAttributeSummaryWidget.cpp +++ b/Source/PHY/Private/UI/PHYAttributeSummaryWidget.cpp @@ -38,6 +38,16 @@ namespace } return Brush; } + + FText MakeAttributeSummaryDisplayName(const FText& SourceName) + { + FString NameString = SourceName.IsEmpty() ? FString(TEXT("修行者")) : SourceName.ToString(); + if (NameString.Len() > 10) + { + NameString = NameString.Left(10) + TEXT("..."); + } + return FText::FromString(NameString); + } } UPHYAttributeSummaryWidget::UPHYAttributeSummaryWidget(const FObjectInitializer& ObjectInitializer) @@ -147,8 +157,8 @@ void UPHYAttributeSummaryWidget::BuildNativeWidgetTree() } UBorder* PortraitBorder = WidgetTree->ConstructWidget(UBorder::StaticClass(), TEXT("PortraitBorder")); - PortraitBorder->SetBrush(MakeAttributeSummaryBrush(AttributeSummaryPortraitTexturePath, FVector2D(380.0f, 438.0f), FLinearColor(0.97f, 0.98f, 0.94f, 0.96f), ESlateBrushDrawType::Box, FMargin(0.075f))); - PortraitBorder->SetPadding(FMargin(10.0f)); + PortraitBorder->SetBrush(MakeAttributeSummaryBrush(AttributeSummaryPortraitTexturePath, FVector2D(380.0f, 438.0f), FLinearColor(1.0f, 1.0f, 1.0f, 0.98f), ESlateBrushDrawType::Image, FMargin(0.0f))); + PortraitBorder->SetPadding(FMargin(0.0f)); PortraitSizeBox->AddChild(PortraitBorder); ResourceBox = WidgetTree->ConstructWidget(UVerticalBox::StaticClass(), TEXT("ResourceBox")); @@ -168,7 +178,7 @@ void UPHYAttributeSummaryWidget::UpdateSummaryWidgets() { if (PlayerNameText) { - PlayerNameText->SetText(PlayerName.IsEmpty() ? FText::FromString(TEXT("修行者")) : PlayerName); + PlayerNameText->SetText(MakeAttributeSummaryDisplayName(PlayerName)); } if (LevelText) { diff --git a/Source/PHY/Public/UI/PHYAttributePageWidget.h b/Source/PHY/Public/UI/PHYAttributePageWidget.h index 0da457c..5e18f07 100644 --- a/Source/PHY/Public/UI/PHYAttributePageWidget.h +++ b/Source/PHY/Public/UI/PHYAttributePageWidget.h @@ -9,6 +9,7 @@ class UPHYAttributeGroupWidget; class UScrollBox; class UTextBlock; +class UUniformGridPanel; class UVerticalBox; /** @@ -64,5 +65,8 @@ protected: /** @brief 分组容器。 */ UPROPERTY(Transient) - TObjectPtr GroupsBox; + TObjectPtr GroupsGrid; + + /** @brief 当前分页分组数量,用于双列排版。 */ + int32 GroupCount = 0; };