Compare commits
4 Commits
57363d9e7f
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 63d845c910 | |||
| 6b19fe2d81 | |||
| 8a29b6eeb7 | |||
| baeb4098c9 |
@@ -4,3 +4,4 @@ bRouteInputThroughGenericInputSystem=True
|
|||||||
bBlockGameplayInputWhenUIFocused=True
|
bBlockGameplayInputWhenUIFocused=True
|
||||||
DefaultMoveInputProcessorClass="/Script/PHY.PHYInputProcessor_Move"
|
DefaultMoveInputProcessorClass="/Script/PHY.PHYInputProcessor_Move"
|
||||||
DefaultLookInputProcessorClass="/Script/PHY.PHYInputProcessor_Look"
|
DefaultLookInputProcessorClass="/Script/PHY.PHYInputProcessor_Look"
|
||||||
|
DefaultAttributeMenuInputProcessorClass="/Script/PHY.PHYInputProcessor_OpenAttributeMenu"
|
||||||
|
|||||||
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_AttributeBackplate.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_JadePanel.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_JadePanel.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_PaperPanel.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_PaperPanel.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.uasset
LFS
Normal file
Binary file not shown.
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset
LFS
Normal file
BIN
Content/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.uasset
LFS
Normal file
Binary file not shown.
@@ -15,4 +15,5 @@ namespace PHYGameplayTags
|
|||||||
UE_DEFINE_GAMEPLAY_TAG(Input_Aim, "Input.Aim");
|
UE_DEFINE_GAMEPLAY_TAG(Input_Aim, "Input.Aim");
|
||||||
UE_DEFINE_GAMEPLAY_TAG(Input_LockOn, "Input.LockOn");
|
UE_DEFINE_GAMEPLAY_TAG(Input_LockOn, "Input.LockOn");
|
||||||
UE_DEFINE_GAMEPLAY_TAG(Input_Inventory_Toggle, "Input.Inventory.Toggle");
|
UE_DEFINE_GAMEPLAY_TAG(Input_Inventory_Toggle, "Input.Inventory.Toggle");
|
||||||
|
UE_DEFINE_GAMEPLAY_TAG(Input_Menu_Attribute, "Input.Menu.Attribute");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "Input/PHYInputProcessor_OpenAttributeMenu.h"
|
||||||
|
|
||||||
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYInputProcessor_OpenAttributeMenu)
|
||||||
|
|
||||||
|
#include "Characters/PHYPlayerCharacter.h"
|
||||||
|
#include "GIPS_InputSystemComponent.h"
|
||||||
|
#include "PHYGameplayTags.h"
|
||||||
|
#include "Player/PHYPlayerController.h"
|
||||||
|
|
||||||
|
UPHYInputProcessor_OpenAttributeMenu::UPHYInputProcessor_OpenAttributeMenu()
|
||||||
|
{
|
||||||
|
InputTags.AddTag(PHYGameplayTags::Input_Menu_Attribute);
|
||||||
|
TriggerEvents = {
|
||||||
|
ETriggerEvent::Started
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UPHYInputProcessor_OpenAttributeMenu::CheckCanHandleInput_Implementation(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, const FGameplayTag InputTag, const ETriggerEvent TriggerEvent) const
|
||||||
|
{
|
||||||
|
(void)ActionData;
|
||||||
|
|
||||||
|
if (!IC || InputTag != PHYGameplayTags::Input_Menu_Attribute || TriggerEvent != ETriggerEvent::Started)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const APHYPlayerCharacter* PlayerCharacter = Cast<APHYPlayerCharacter>(IC->GetControlledPawn());
|
||||||
|
const APHYPlayerController* PlayerController = PlayerCharacter ? PlayerCharacter->GetController<APHYPlayerController>() : nullptr;
|
||||||
|
return PlayerController && PlayerController->IsLocalController();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPHYInputProcessor_OpenAttributeMenu::HandleInputStarted_Implementation(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, const FGameplayTag InputTag) const
|
||||||
|
{
|
||||||
|
(void)InputTag;
|
||||||
|
RouteOpenAttributeMenuInput(IC, ActionData, ETriggerEvent::Started);
|
||||||
|
}
|
||||||
|
|
||||||
|
FString UPHYInputProcessor_OpenAttributeMenu::GetEditorFriendlyName_Implementation() const
|
||||||
|
{
|
||||||
|
return TEXT("PHY Open Attribute Menu");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UPHYInputProcessor_OpenAttributeMenu::RouteOpenAttributeMenuInput(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent) const
|
||||||
|
{
|
||||||
|
if (!IC)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
APHYPlayerCharacter* PlayerCharacter = Cast<APHYPlayerCharacter>(IC->GetControlledPawn());
|
||||||
|
APHYPlayerController* PlayerController = PlayerCharacter ? PlayerCharacter->GetController<APHYPlayerController>() : nullptr;
|
||||||
|
return PlayerController ? PlayerController->RouteOpenAttributeMenuInputFromProcessor(ActionData, TriggerEvent) : false;
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "Characters/PHYPlayerCharacter.h"
|
#include "Characters/PHYPlayerCharacter.h"
|
||||||
#include "Characters/PHYCharacterSettings.h"
|
#include "Characters/PHYCharacterSettings.h"
|
||||||
#include "Components/SLSCharacterMovementComponent.h"
|
#include "Components/SLSCharacterMovementComponent.h"
|
||||||
|
#include "Game/PHYHUD.h"
|
||||||
#include "GIPS_InputSystemComponent.h"
|
#include "GIPS_InputSystemComponent.h"
|
||||||
#include "InputActionValue.h"
|
#include "InputActionValue.h"
|
||||||
#include "PHYGameplayTags.h"
|
#include "PHYGameplayTags.h"
|
||||||
@@ -115,6 +116,15 @@ void APHYPlayerController::OnReceivedInput(const FInputActionInstance& ActionDat
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (InputTag == PHYGameplayTags::Input_Menu_Attribute)
|
||||||
|
{
|
||||||
|
if (!ConsumeAttributeMenuProcessorGuard(TriggerEvent))
|
||||||
|
{
|
||||||
|
RouteOpenAttributeMenuInput(ActionData, TriggerEvent);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (APHYPlayerCharacter* PHYCharacter = GetPHYPlayerCharacter())
|
if (APHYPlayerCharacter* PHYCharacter = GetPHYPlayerCharacter())
|
||||||
{
|
{
|
||||||
PHYCharacter->HandleInputTag(InputTag, TriggerEvent);
|
PHYCharacter->HandleInputTag(InputTag, TriggerEvent);
|
||||||
@@ -145,6 +155,18 @@ bool APHYPlayerController::RouteLookInputFromProcessor(const FInputActionInstanc
|
|||||||
return RouteLookInput(ActionData, TriggerEvent);
|
return RouteLookInput(ActionData, TriggerEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool APHYPlayerController::RouteOpenAttributeMenuInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
||||||
|
{
|
||||||
|
return HandleOpenAttributeMenuInput(ActionData, TriggerEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool APHYPlayerController::RouteOpenAttributeMenuInputFromProcessor(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
||||||
|
{
|
||||||
|
bAttributeMenuInputHandledByProcessor = true;
|
||||||
|
LastAttributeMenuInputProcessorTriggerEvent = TriggerEvent;
|
||||||
|
return RouteOpenAttributeMenuInput(ActionData, TriggerEvent);
|
||||||
|
}
|
||||||
|
|
||||||
bool APHYPlayerController::HandleMoveInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
bool APHYPlayerController::HandleMoveInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
||||||
{
|
{
|
||||||
APHYPlayerCharacter* PHYCharacter = GetPHYPlayerCharacter();
|
APHYPlayerCharacter* PHYCharacter = GetPHYPlayerCharacter();
|
||||||
@@ -199,6 +221,33 @@ bool APHYPlayerController::ConsumeLookProcessorGuard(const ETriggerEvent Trigger
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool APHYPlayerController::ConsumeAttributeMenuProcessorGuard(const ETriggerEvent TriggerEvent)
|
||||||
|
{
|
||||||
|
if (bAttributeMenuInputHandledByProcessor && LastAttributeMenuInputProcessorTriggerEvent == TriggerEvent)
|
||||||
|
{
|
||||||
|
bAttributeMenuInputHandledByProcessor = false;
|
||||||
|
LastAttributeMenuInputProcessorTriggerEvent = ETriggerEvent::None;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bAttributeMenuInputHandledByProcessor = false;
|
||||||
|
LastAttributeMenuInputProcessorTriggerEvent = ETriggerEvent::None;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool APHYPlayerController::HandleOpenAttributeMenuInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
||||||
|
{
|
||||||
|
(void)ActionData;
|
||||||
|
|
||||||
|
if (TriggerEvent != ETriggerEvent::Started || !IsLocalController())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
APHYHUD* PHYHUD = GetHUD<APHYHUD>();
|
||||||
|
return PHYHUD && PHYHUD->OpenAttributeMenu(this);
|
||||||
|
}
|
||||||
|
|
||||||
bool APHYPlayerController::HandleLookInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
bool APHYPlayerController::HandleLookInput(const FInputActionInstance& ActionData, const ETriggerEvent TriggerEvent)
|
||||||
{
|
{
|
||||||
CachedLookInput = IsInputReleased(TriggerEvent) ? FVector2D::ZeroVector : ExtractAxis2D(ActionData.GetValue());
|
CachedLookInput = IsInputReleased(TriggerEvent) ? FVector2D::ZeroVector : ExtractAxis2D(ActionData.GetValue());
|
||||||
|
|||||||
@@ -9,11 +9,33 @@
|
|||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
#include "Components/VerticalBox.h"
|
#include "Components/VerticalBox.h"
|
||||||
#include "Components/VerticalBoxSlot.h"
|
#include "Components/VerticalBoxSlot.h"
|
||||||
|
#include "Engine/Texture2D.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
#include "Styling/CoreStyle.h"
|
#include "Styling/CoreStyle.h"
|
||||||
|
#include "Styling/SlateBrush.h"
|
||||||
#include "UI/PHYAttributeRowWidget.h"
|
#include "UI/PHYAttributeRowWidget.h"
|
||||||
#include "Widgets/SWidget.h"
|
#include "Widgets/SWidget.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const TCHAR* const AttributeGroupPaperTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_PaperPanel.T_PHY_UI_PaperPanel");
|
||||||
|
const TCHAR* const AttributeGroupGoldRuleTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.T_PHY_UI_GoldRule");
|
||||||
|
|
||||||
|
FSlateBrush MakeAttributeGroupBrush(const TCHAR* TexturePath, const FVector2D ImageSize, const FLinearColor Tint, const ESlateBrushDrawType::Type DrawAs = ESlateBrushDrawType::Box, const FMargin Margin = FMargin(0.08f))
|
||||||
|
{
|
||||||
|
FSlateBrush Brush;
|
||||||
|
Brush.DrawAs = DrawAs;
|
||||||
|
Brush.Margin = Margin;
|
||||||
|
Brush.ImageSize = ImageSize;
|
||||||
|
Brush.TintColor = FSlateColor(Tint);
|
||||||
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, TexturePath))
|
||||||
|
{
|
||||||
|
Brush.SetResourceObject(Texture);
|
||||||
|
}
|
||||||
|
return Brush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UPHYAttributeGroupWidget::UPHYAttributeGroupWidget(const FObjectInitializer& ObjectInitializer)
|
UPHYAttributeGroupWidget::UPHYAttributeGroupWidget(const FObjectInitializer& ObjectInitializer)
|
||||||
: Super(ObjectInitializer)
|
: Super(ObjectInitializer)
|
||||||
{
|
{
|
||||||
@@ -58,7 +80,7 @@ UPHYAttributeRowWidget* UPHYAttributeGroupWidget::AddRow(FText Label, FText Valu
|
|||||||
RowWidget->SetRow(MoveTemp(Label), MoveTemp(Value), bCanUpgrade);
|
RowWidget->SetRow(MoveTemp(Label), MoveTemp(Value), bCanUpgrade);
|
||||||
if (UVerticalBoxSlot* RowSlot = RowsBox->AddChildToVerticalBox(RowWidget))
|
if (UVerticalBoxSlot* RowSlot = RowsBox->AddChildToVerticalBox(RowWidget))
|
||||||
{
|
{
|
||||||
RowSlot->SetPadding(FMargin(0.0f, 1.0f));
|
RowSlot->SetPadding(FMargin(0.0f, 2.0f));
|
||||||
}
|
}
|
||||||
return RowWidget;
|
return RowWidget;
|
||||||
}
|
}
|
||||||
@@ -76,19 +98,26 @@ void UPHYAttributeGroupWidget::BuildNativeWidgetTree()
|
|||||||
}
|
}
|
||||||
|
|
||||||
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
||||||
RootBorder->SetBrushColor(FLinearColor(0.98f, 0.94f, 0.84f, 0.58f));
|
RootBorder->SetBrushColor(FLinearColor::Transparent);
|
||||||
RootBorder->SetPadding(FMargin(14.0f, 10.0f));
|
RootBorder->SetPadding(FMargin(14.0f, 8.0f));
|
||||||
WidgetTree->RootWidget = RootBorder;
|
WidgetTree->RootWidget = RootBorder;
|
||||||
|
|
||||||
UVerticalBox* RootBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RootBox"));
|
UVerticalBox* RootBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RootBox"));
|
||||||
RootBorder->SetContent(RootBox);
|
RootBorder->SetContent(RootBox);
|
||||||
|
|
||||||
TitleText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("TitleText"));
|
TitleText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("TitleText"));
|
||||||
TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 17));
|
TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 19));
|
||||||
TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.56f, 0.18f, 0.10f, 1.0f)));
|
TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.48f, 0.27f, 0.11f, 1.0f)));
|
||||||
if (UVerticalBoxSlot* TitleSlot = RootBox->AddChildToVerticalBox(TitleText))
|
if (UVerticalBoxSlot* TitleSlot = RootBox->AddChildToVerticalBox(TitleText))
|
||||||
{
|
{
|
||||||
TitleSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, 6.0f));
|
TitleSlot->SetPadding(FMargin(2.0f, 0.0f, 0.0f, 2.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
UBorder* HeaderRule = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("HeaderRule"));
|
||||||
|
HeaderRule->SetBrush(MakeAttributeGroupBrush(AttributeGroupGoldRuleTexturePath, FVector2D(512.0f, 24.0f), FLinearColor(0.87f, 0.69f, 0.34f, 0.72f), ESlateBrushDrawType::Image, FMargin(0.0f)));
|
||||||
|
if (UVerticalBoxSlot* RuleSlot = RootBox->AddChildToVerticalBox(HeaderRule))
|
||||||
|
{
|
||||||
|
RuleSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, 8.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
RowsBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RowsBox"));
|
RowsBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RowsBox"));
|
||||||
|
|||||||
@@ -11,18 +11,26 @@
|
|||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
#include "Components/Border.h"
|
#include "Components/Border.h"
|
||||||
#include "Components/Button.h"
|
#include "Components/Button.h"
|
||||||
|
#include "Components/CanvasPanel.h"
|
||||||
|
#include "Components/CanvasPanelSlot.h"
|
||||||
#include "Components/HorizontalBox.h"
|
#include "Components/HorizontalBox.h"
|
||||||
#include "Components/HorizontalBoxSlot.h"
|
#include "Components/HorizontalBoxSlot.h"
|
||||||
#include "Components/SafeZone.h"
|
#include "Components/SafeZone.h"
|
||||||
|
#include "Components/ScaleBox.h"
|
||||||
#include "Components/SizeBox.h"
|
#include "Components/SizeBox.h"
|
||||||
|
#include "Components/Spacer.h"
|
||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
#include "Components/VerticalBox.h"
|
#include "Components/VerticalBox.h"
|
||||||
#include "Components/VerticalBoxSlot.h"
|
#include "Components/VerticalBoxSlot.h"
|
||||||
#include "Components/WidgetSwitcher.h"
|
#include "Components/WidgetSwitcher.h"
|
||||||
|
#include "Engine/Texture2D.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
#include "GameFramework/PlayerController.h"
|
#include "GameFramework/PlayerController.h"
|
||||||
#include "Player/PHYPlayerState.h"
|
#include "Player/PHYPlayerState.h"
|
||||||
#include "Styling/CoreStyle.h"
|
#include "Styling/CoreStyle.h"
|
||||||
|
#include "Styling/SlateBrush.h"
|
||||||
|
#include "Styling/SlateTypes.h"
|
||||||
|
#include "UI/PHYAttributeResourceBarWidget.h"
|
||||||
#include "UI/PHYAttributeOverviewPageWidget.h"
|
#include "UI/PHYAttributeOverviewPageWidget.h"
|
||||||
#include "UI/PHYAttributeSummaryWidget.h"
|
#include "UI/PHYAttributeSummaryWidget.h"
|
||||||
#include "UI/PHYCombatDerivedAttributePageWidget.h"
|
#include "UI/PHYCombatDerivedAttributePageWidget.h"
|
||||||
@@ -31,6 +39,101 @@
|
|||||||
|
|
||||||
namespace
|
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");
|
||||||
|
const TCHAR* const AttributeGoldRuleTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_GoldRule.T_PHY_UI_GoldRule");
|
||||||
|
|
||||||
|
FSlateBrush MakeAttributeMenuBrush(const TCHAR* TexturePath, const FVector2D ImageSize, const FLinearColor Tint, const ESlateBrushDrawType::Type DrawAs = ESlateBrushDrawType::Box, const FMargin Margin = FMargin(0.08f))
|
||||||
|
{
|
||||||
|
FSlateBrush Brush;
|
||||||
|
Brush.DrawAs = DrawAs;
|
||||||
|
Brush.Margin = Margin;
|
||||||
|
Brush.ImageSize = ImageSize;
|
||||||
|
Brush.TintColor = FSlateColor(Tint);
|
||||||
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, TexturePath))
|
||||||
|
{
|
||||||
|
Brush.SetResourceObject(Texture);
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UCanvasPanelSlot* CanvasSlot = CanvasPanel->AddChildToCanvas(ChildWidget))
|
||||||
|
{
|
||||||
|
CanvasSlot->SetAutoSize(false);
|
||||||
|
CanvasSlot->SetPosition(Position);
|
||||||
|
CanvasSlot->SetSize(Size);
|
||||||
|
CanvasSlot->SetZOrder(ZOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UTextBlock* CreateAttributeMenuText(UWidgetTree* WidgetTree, const FName WidgetName, const FText Text, const int32 FontSize, const FLinearColor Color)
|
||||||
|
{
|
||||||
|
UTextBlock* TextBlock = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), WidgetName);
|
||||||
|
TextBlock->SetText(Text);
|
||||||
|
TextBlock->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), FontSize));
|
||||||
|
TextBlock->SetColorAndOpacity(FSlateColor(Color));
|
||||||
|
return TextBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
UButton* CreateAttributeNavButton(UWidgetTree* WidgetTree, const FName WidgetName, const FText Label, const bool bActive)
|
||||||
|
{
|
||||||
|
UButton* Button = WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), WidgetName);
|
||||||
|
|
||||||
|
FButtonStyle ButtonStyle;
|
||||||
|
const FSlateBrush TransparentBrush = MakeAttributeTransparentBrush();
|
||||||
|
ButtonStyle.SetNormal(TransparentBrush);
|
||||||
|
ButtonStyle.SetHovered(TransparentBrush);
|
||||||
|
ButtonStyle.SetPressed(TransparentBrush);
|
||||||
|
Button->SetStyle(ButtonStyle);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyAttributeSubTabStyle(UButton* Button, const bool bActive)
|
||||||
|
{
|
||||||
|
if (!Button)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FButtonStyle ButtonStyle;
|
||||||
|
const FLinearColor NormalTint = bActive ? FLinearColor(0.16f, 0.46f, 0.39f, 0.92f) : FLinearColor(0.90f, 0.83f, 0.66f, 0.76f);
|
||||||
|
const FLinearColor HoverTint = bActive ? FLinearColor(0.19f, 0.54f, 0.46f, 0.95f) : FLinearColor(0.96f, 0.89f, 0.72f, 0.90f);
|
||||||
|
ButtonStyle.SetNormal(MakeAttributeMenuBrush(bActive ? AttributeJadeTexturePath : AttributePaperTexturePath, FVector2D(210.0f, 54.0f), NormalTint));
|
||||||
|
ButtonStyle.SetHovered(MakeAttributeMenuBrush(bActive ? AttributeJadeTexturePath : AttributePaperTexturePath, FVector2D(210.0f, 54.0f), HoverTint));
|
||||||
|
ButtonStyle.SetPressed(MakeAttributeMenuBrush(AttributeCinnabarTexturePath, FVector2D(210.0f, 54.0f), FLinearColor(0.72f, 0.24f, 0.14f, 0.92f)));
|
||||||
|
Button->SetStyle(ButtonStyle);
|
||||||
|
Button->SetBackgroundColor(FLinearColor::White);
|
||||||
|
}
|
||||||
|
|
||||||
|
UBorder* CreateAttributeMenuLine(UWidgetTree* WidgetTree, const FName WidgetName)
|
||||||
|
{
|
||||||
|
UBorder* Line = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), WidgetName);
|
||||||
|
Line->SetBrush(MakeAttributeMenuBrush(AttributeGoldRuleTexturePath, FVector2D(512.0f, 24.0f), FLinearColor(1.0f, 0.86f, 0.44f, 0.80f), ESlateBrushDrawType::Image, FMargin(0.0f)));
|
||||||
|
return Line;
|
||||||
|
}
|
||||||
|
|
||||||
TArray<FGameplayAttribute> MakeTrackedAttributes()
|
TArray<FGameplayAttribute> MakeTrackedAttributes()
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
@@ -180,7 +283,7 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree()
|
|||||||
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WidgetTree->RootWidget && SummaryWidget && PageSwitcher && OverviewPage && CombatPage && ElementPage)
|
if (WidgetTree->RootWidget && SummaryWidget && PageSwitcher && OverviewPage && CombatPage && ElementPage && HeaderHealthBar && HeaderManaBar && HeaderStaminaBar)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -188,60 +291,108 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree()
|
|||||||
USafeZone* RootSafeZone = WidgetTree->ConstructWidget<USafeZone>(USafeZone::StaticClass(), TEXT("RootSafeZone"));
|
USafeZone* RootSafeZone = WidgetTree->ConstructWidget<USafeZone>(USafeZone::StaticClass(), TEXT("RootSafeZone"));
|
||||||
WidgetTree->RootWidget = RootSafeZone;
|
WidgetTree->RootWidget = RootSafeZone;
|
||||||
|
|
||||||
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
UBorder* RootWash = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootWash"));
|
||||||
RootBorder->SetBrushColor(FLinearColor(0.83f, 0.78f, 0.64f, 0.94f));
|
RootWash->SetBrushColor(FLinearColor(0.08f, 0.10f, 0.09f, 0.96f));
|
||||||
RootBorder->SetPadding(FMargin(28.0f));
|
RootSafeZone->SetContent(RootWash);
|
||||||
RootSafeZone->SetContent(RootBorder);
|
|
||||||
|
|
||||||
UHorizontalBox* MainBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("MainBox"));
|
UScaleBox* DesignScaleBox = WidgetTree->ConstructWidget<UScaleBox>(UScaleBox::StaticClass(), TEXT("DesignScaleBox"));
|
||||||
RootBorder->SetContent(MainBox);
|
DesignScaleBox->SetStretch(EStretch::ScaleToFit);
|
||||||
|
DesignScaleBox->SetStretchDirection(EStretchDirection::Both);
|
||||||
|
RootWash->SetContent(DesignScaleBox);
|
||||||
|
|
||||||
|
USizeBox* DesignSizeBox = WidgetTree->ConstructWidget<USizeBox>(USizeBox::StaticClass(), TEXT("DesignSizeBox"));
|
||||||
|
DesignSizeBox->SetWidthOverride(AttributeDesignWidth);
|
||||||
|
DesignSizeBox->SetHeightOverride(AttributeDesignHeight);
|
||||||
|
DesignScaleBox->AddChild(DesignSizeBox);
|
||||||
|
|
||||||
|
UCanvasPanel* DesignCanvas = WidgetTree->ConstructWidget<UCanvasPanel>(UCanvasPanel::StaticClass(), TEXT("DesignCanvas"));
|
||||||
|
DesignSizeBox->AddChild(DesignCanvas);
|
||||||
|
|
||||||
|
UBorder* BackgroundPanel = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("BackgroundPanel"));
|
||||||
|
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>(UBorder::StaticClass(), TEXT("TitlePlaque"));
|
||||||
|
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);
|
||||||
|
|
||||||
|
UTextBlock* TitleText = CreateAttributeMenuText(WidgetTree, TEXT("TitleText"), FText::FromString(TEXT("角色属性")), 31, FLinearColor(0.99f, 0.88f, 0.61f, 1.0f));
|
||||||
|
TitlePlaque->SetContent(TitleText);
|
||||||
|
|
||||||
|
UButton* AttributeNavButton = CreateAttributeNavButton(WidgetTree, TEXT("AttributeNavButton"), FText::FromString(TEXT("属性")), true);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, AttributeNavButton, FVector2D(552.0f, 9.0f), FVector2D(170.0f, 74.0f), 3);
|
||||||
|
UButton* EquipNavButton = CreateAttributeNavButton(WidgetTree, TEXT("EquipNavButton"), FText::FromString(TEXT("装备")), false);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, EquipNavButton, FVector2D(764.0f, 11.0f), FVector2D(155.0f, 70.0f), 3);
|
||||||
|
UButton* SkillNavButton = CreateAttributeNavButton(WidgetTree, TEXT("SkillNavButton"), FText::FromString(TEXT("技能")), false);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, SkillNavButton, FVector2D(978.0f, 11.0f), FVector2D(155.0f, 70.0f), 3);
|
||||||
|
UButton* BagNavButton = CreateAttributeNavButton(WidgetTree, TEXT("BagNavButton"), FText::FromString(TEXT("背包")), false);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, BagNavButton, FVector2D(1188.0f, 11.0f), FVector2D(155.0f, 70.0f), 3);
|
||||||
|
|
||||||
|
UBorder* HeaderRule = CreateAttributeMenuLine(WidgetTree, TEXT("HeaderRule"));
|
||||||
|
HeaderRule->SetBrushColor(FLinearColor::Transparent);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, HeaderRule, FVector2D(392.0f, 85.0f), FVector2D(1245.0f, 18.0f), 1);
|
||||||
|
|
||||||
SummaryWidget = WidgetTree->ConstructWidget<UPHYAttributeSummaryWidget>(UPHYAttributeSummaryWidget::StaticClass(), TEXT("SummaryWidget"));
|
SummaryWidget = WidgetTree->ConstructWidget<UPHYAttributeSummaryWidget>(UPHYAttributeSummaryWidget::StaticClass(), TEXT("SummaryWidget"));
|
||||||
USizeBox* SummarySizeBox = WidgetTree->ConstructWidget<USizeBox>(USizeBox::StaticClass(), TEXT("SummarySizeBox"));
|
UBorder* SummaryPanel = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("SummaryPanel"));
|
||||||
SummarySizeBox->SetWidthOverride(360.0f);
|
SummaryPanel->SetBrushColor(FLinearColor::Transparent);
|
||||||
SummarySizeBox->AddChild(SummaryWidget);
|
SummaryPanel->SetPadding(FMargin(27.0f, 24.0f, 27.0f, 22.0f));
|
||||||
if (UHorizontalBoxSlot* SummarySlot = MainBox->AddChildToHorizontalBox(SummarySizeBox))
|
SummaryPanel->SetContent(SummaryWidget);
|
||||||
{
|
AddAttributeMenuCanvasChild(DesignCanvas, SummaryPanel, FVector2D(35.0f, 103.0f), FVector2D(462.0f, 710.0f), 2);
|
||||||
SummarySlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
|
||||||
SummarySlot->SetPadding(FMargin(0.0f, 0.0f, 18.0f, 0.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
UBorder* PageBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("PageBorder"));
|
UBorder* PageBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("PageBorder"));
|
||||||
PageBorder->SetBrushColor(FLinearColor(0.96f, 0.92f, 0.82f, 0.72f));
|
PageBorder->SetBrushColor(FLinearColor::Transparent);
|
||||||
PageBorder->SetPadding(FMargin(22.0f));
|
PageBorder->SetPadding(FMargin(28.0f, 22.0f, 28.0f, 24.0f));
|
||||||
if (UHorizontalBoxSlot* PageSlot = MainBox->AddChildToHorizontalBox(PageBorder))
|
AddAttributeMenuCanvasChild(DesignCanvas, PageBorder, FVector2D(515.0f, 103.0f), FVector2D(1120.0f, 735.0f), 2);
|
||||||
{
|
|
||||||
PageSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
|
||||||
}
|
|
||||||
|
|
||||||
UVerticalBox* PageBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("PageBox"));
|
UVerticalBox* PageBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("PageBox"));
|
||||||
PageBorder->SetContent(PageBox);
|
PageBorder->SetContent(PageBox);
|
||||||
|
|
||||||
UTextBlock* HeaderText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("HeaderText"));
|
UTextBlock* ResourceTitleText = CreateAttributeMenuText(WidgetTree, TEXT("ResourceTitleText"), FText::FromString(TEXT("战斗资源")), 22, FLinearColor(0.39f, 0.22f, 0.10f, 1.0f));
|
||||||
HeaderText->SetText(FText::FromString(TEXT("角色属性")));
|
PageBox->AddChildToVerticalBox(ResourceTitleText);
|
||||||
HeaderText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 28));
|
|
||||||
HeaderText->SetColorAndOpacity(FSlateColor(FLinearColor(0.35f, 0.13f, 0.06f, 1.0f)));
|
UBorder* ResourceRule = CreateAttributeMenuLine(WidgetTree, TEXT("ResourceRule"));
|
||||||
PageBox->AddChildToVerticalBox(HeaderText);
|
if (UVerticalBoxSlot* ResourceRuleSlot = PageBox->AddChildToVerticalBox(ResourceRule))
|
||||||
|
{
|
||||||
|
ResourceRuleSlot->SetPadding(FMargin(0.0f, 4.0f, 0.0f, 8.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderHealthBar = WidgetTree->ConstructWidget<UPHYAttributeResourceBarWidget>(UPHYAttributeResourceBarWidget::StaticClass(), TEXT("HeaderHealthBar"));
|
||||||
|
HeaderManaBar = WidgetTree->ConstructWidget<UPHYAttributeResourceBarWidget>(UPHYAttributeResourceBarWidget::StaticClass(), TEXT("HeaderManaBar"));
|
||||||
|
HeaderStaminaBar = WidgetTree->ConstructWidget<UPHYAttributeResourceBarWidget>(UPHYAttributeResourceBarWidget::StaticClass(), TEXT("HeaderStaminaBar"));
|
||||||
|
|
||||||
|
if (UVerticalBoxSlot* HealthSlot = PageBox->AddChildToVerticalBox(HeaderHealthBar))
|
||||||
|
{
|
||||||
|
HealthSlot->SetPadding(FMargin(4.0f, 0.0f, 0.0f, 2.0f));
|
||||||
|
}
|
||||||
|
if (UVerticalBoxSlot* ManaSlot = PageBox->AddChildToVerticalBox(HeaderManaBar))
|
||||||
|
{
|
||||||
|
ManaSlot->SetPadding(FMargin(4.0f, 0.0f, 0.0f, 2.0f));
|
||||||
|
}
|
||||||
|
if (UVerticalBoxSlot* StaminaSlot = PageBox->AddChildToVerticalBox(HeaderStaminaBar))
|
||||||
|
{
|
||||||
|
StaminaSlot->SetPadding(FMargin(4.0f, 0.0f, 0.0f, 12.0f));
|
||||||
|
}
|
||||||
|
|
||||||
UHorizontalBox* TabBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("TabBox"));
|
UHorizontalBox* TabBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("TabBox"));
|
||||||
if (UVerticalBoxSlot* TabSlot = PageBox->AddChildToVerticalBox(TabBox))
|
if (UVerticalBoxSlot* TabSlot = PageBox->AddChildToVerticalBox(TabBox))
|
||||||
{
|
{
|
||||||
TabSlot->SetPadding(FMargin(0.0f, 12.0f, 0.0f, 16.0f));
|
TabSlot->SetPadding(FMargin(0.0f, 2.0f, 0.0f, 14.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
OverviewTabButton = CreateTabButton(TEXT("OverviewTabButton"), FText::FromString(TEXT("总览")));
|
OverviewTabButton = CreateTabButton(TEXT("OverviewTabButton"), FText::FromString(TEXT("核心属性")));
|
||||||
CombatTabButton = CreateTabButton(TEXT("CombatTabButton"), FText::FromString(TEXT("战斗衍生")));
|
CombatTabButton = CreateTabButton(TEXT("CombatTabButton"), FText::FromString(TEXT("战斗衍生")));
|
||||||
ElementTabButton = CreateTabButton(TEXT("ElementTabButton"), FText::FromString(TEXT("元素衍生")));
|
ElementTabButton = CreateTabButton(TEXT("ElementTabButton"), FText::FromString(TEXT("元素衍生")));
|
||||||
|
|
||||||
TabBox->AddChildToHorizontalBox(OverviewTabButton);
|
if (UHorizontalBoxSlot* OverviewTabSlot = TabBox->AddChildToHorizontalBox(OverviewTabButton))
|
||||||
|
{
|
||||||
|
OverviewTabSlot->SetPadding(FMargin(0.0f, 0.0f, 10.0f, 0.0f));
|
||||||
|
}
|
||||||
if (UHorizontalBoxSlot* CombatTabSlot = TabBox->AddChildToHorizontalBox(CombatTabButton))
|
if (UHorizontalBoxSlot* CombatTabSlot = TabBox->AddChildToHorizontalBox(CombatTabButton))
|
||||||
{
|
{
|
||||||
CombatTabSlot->SetPadding(FMargin(8.0f, 0.0f, 0.0f, 0.0f));
|
CombatTabSlot->SetPadding(FMargin(0.0f, 0.0f, 10.0f, 0.0f));
|
||||||
}
|
|
||||||
if (UHorizontalBoxSlot* ElementTabSlot = TabBox->AddChildToHorizontalBox(ElementTabButton))
|
|
||||||
{
|
|
||||||
ElementTabSlot->SetPadding(FMargin(8.0f, 0.0f, 0.0f, 0.0f));
|
|
||||||
}
|
}
|
||||||
|
TabBox->AddChildToHorizontalBox(ElementTabButton);
|
||||||
|
|
||||||
PageSwitcher = WidgetTree->ConstructWidget<UWidgetSwitcher>(UWidgetSwitcher::StaticClass(), TEXT("PageSwitcher"));
|
PageSwitcher = WidgetTree->ConstructWidget<UWidgetSwitcher>(UWidgetSwitcher::StaticClass(), TEXT("PageSwitcher"));
|
||||||
if (UVerticalBoxSlot* SwitcherSlot = PageBox->AddChildToVerticalBox(PageSwitcher))
|
if (UVerticalBoxSlot* SwitcherSlot = PageBox->AddChildToVerticalBox(PageSwitcher))
|
||||||
@@ -260,6 +411,13 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree()
|
|||||||
CombatTabButton->OnClicked.AddUniqueDynamic(this, &UPHYAttributeMenuWidget::HandleCombatTabClicked);
|
CombatTabButton->OnClicked.AddUniqueDynamic(this, &UPHYAttributeMenuWidget::HandleCombatTabClicked);
|
||||||
ElementTabButton->OnClicked.AddUniqueDynamic(this, &UPHYAttributeMenuWidget::HandleElementTabClicked);
|
ElementTabButton->OnClicked.AddUniqueDynamic(this, &UPHYAttributeMenuWidget::HandleElementTabClicked);
|
||||||
|
|
||||||
|
UButton* ConfirmButton = CreateAttributeNavButton(WidgetTree, TEXT("ConfirmButton"), FText::FromString(TEXT("确认")), true);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, ConfirmButton, FVector2D(484.0f, 865.0f), FVector2D(255.0f, 58.0f), 3);
|
||||||
|
UButton* BackButton = CreateAttributeNavButton(WidgetTree, TEXT("BackButton"), FText::FromString(TEXT("返回")), false);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, BackButton, FVector2D(774.0f, 865.0f), FVector2D(210.0f, 58.0f), 3);
|
||||||
|
UButton* ResetButton = CreateAttributeNavButton(WidgetTree, TEXT("ResetButton"), FText::FromString(TEXT("重置加点")), false);
|
||||||
|
AddAttributeMenuCanvasChild(DesignCanvas, ResetButton, FVector2D(1014.0f, 865.0f), FVector2D(260.0f, 58.0f), 3);
|
||||||
|
|
||||||
SetActivePage(ActivePageIndex);
|
SetActivePage(ActivePageIndex);
|
||||||
RefreshAttributePages();
|
RefreshAttributePages();
|
||||||
}
|
}
|
||||||
@@ -267,12 +425,12 @@ void UPHYAttributeMenuWidget::BuildNativeWidgetTree()
|
|||||||
UButton* UPHYAttributeMenuWidget::CreateTabButton(const FName ButtonName, const FText Label)
|
UButton* UPHYAttributeMenuWidget::CreateTabButton(const FName ButtonName, const FText Label)
|
||||||
{
|
{
|
||||||
UButton* TabButton = WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), ButtonName);
|
UButton* TabButton = WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), ButtonName);
|
||||||
TabButton->SetBackgroundColor(FLinearColor(0.25f, 0.48f, 0.42f, 0.78f));
|
ApplyAttributeSubTabStyle(TabButton, false);
|
||||||
|
|
||||||
UTextBlock* TabText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass());
|
UTextBlock* TabText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass());
|
||||||
TabText->SetText(Label);
|
TabText->SetText(Label);
|
||||||
TabText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 16));
|
TabText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 18));
|
||||||
TabText->SetColorAndOpacity(FSlateColor(FLinearColor(0.98f, 0.94f, 0.84f, 1.0f)));
|
TabText->SetColorAndOpacity(FSlateColor(FLinearColor(0.30f, 0.23f, 0.15f, 1.0f)));
|
||||||
TabButton->SetContent(TabText);
|
TabButton->SetContent(TabText);
|
||||||
return TabButton;
|
return TabButton;
|
||||||
}
|
}
|
||||||
@@ -289,21 +447,9 @@ void UPHYAttributeMenuWidget::SetActivePage(const int32 NewPageIndex)
|
|||||||
|
|
||||||
void UPHYAttributeMenuWidget::UpdateTabVisuals()
|
void UPHYAttributeMenuWidget::UpdateTabVisuals()
|
||||||
{
|
{
|
||||||
const FLinearColor ActiveColor(0.68f, 0.21f, 0.12f, 0.92f);
|
ApplyAttributeSubTabStyle(OverviewTabButton, ActivePageIndex == 0);
|
||||||
const FLinearColor InactiveColor(0.25f, 0.48f, 0.42f, 0.78f);
|
ApplyAttributeSubTabStyle(CombatTabButton, ActivePageIndex == 1);
|
||||||
|
ApplyAttributeSubTabStyle(ElementTabButton, ActivePageIndex == 2);
|
||||||
if (OverviewTabButton)
|
|
||||||
{
|
|
||||||
OverviewTabButton->SetBackgroundColor(ActivePageIndex == 0 ? ActiveColor : InactiveColor);
|
|
||||||
}
|
|
||||||
if (CombatTabButton)
|
|
||||||
{
|
|
||||||
CombatTabButton->SetBackgroundColor(ActivePageIndex == 1 ? ActiveColor : InactiveColor);
|
|
||||||
}
|
|
||||||
if (ElementTabButton)
|
|
||||||
{
|
|
||||||
ElementTabButton->SetBackgroundColor(ActivePageIndex == 2 ? ActiveColor : InactiveColor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPHYAttributeMenuWidget::BindToPlayerState(APHYPlayerState* NewPlayerState)
|
void UPHYAttributeMenuWidget::BindToPlayerState(APHYPlayerState* NewPlayerState)
|
||||||
@@ -391,6 +537,25 @@ void UPHYAttributeMenuWidget::RefreshAttributePages()
|
|||||||
GetAttributeValue(UPHYCombatAttributeSet::GetMaxStaminaAttribute()));
|
GetAttributeValue(UPHYCombatAttributeSet::GetMaxStaminaAttribute()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const float Health = GetAttributeValue(UPHYCombatAttributeSet::GetHealthAttribute());
|
||||||
|
const float MaxHealth = GetAttributeValue(UPHYCombatAttributeSet::GetMaxHealthAttribute());
|
||||||
|
const float Mana = GetAttributeValue(UPHYCombatAttributeSet::GetManaAttribute());
|
||||||
|
const float MaxMana = GetAttributeValue(UPHYCombatAttributeSet::GetMaxManaAttribute());
|
||||||
|
const float Stamina = GetAttributeValue(UPHYCombatAttributeSet::GetStaminaAttribute());
|
||||||
|
const float MaxStamina = GetAttributeValue(UPHYCombatAttributeSet::GetMaxStaminaAttribute());
|
||||||
|
if (HeaderHealthBar)
|
||||||
|
{
|
||||||
|
HeaderHealthBar->SetResource(FText::FromString(TEXT("生命值 (HP)")), Health, MaxHealth, FLinearColor(0.78f, 0.18f, 0.14f, 1.0f));
|
||||||
|
}
|
||||||
|
if (HeaderManaBar)
|
||||||
|
{
|
||||||
|
HeaderManaBar->SetResource(FText::FromString(TEXT("法力值 (MP)")), Mana, MaxMana, FLinearColor(0.12f, 0.45f, 0.88f, 1.0f));
|
||||||
|
}
|
||||||
|
if (HeaderStaminaBar)
|
||||||
|
{
|
||||||
|
HeaderStaminaBar->SetResource(FText::FromString(TEXT("耐力值 (ST)")), Stamina, MaxStamina, FLinearColor(0.12f, 0.67f, 0.58f, 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
UAbilitySystemComponent* AbilitySystemComponent = BoundAbilitySystemComponent.Get();
|
UAbilitySystemComponent* AbilitySystemComponent = BoundAbilitySystemComponent.Get();
|
||||||
if (OverviewPage)
|
if (OverviewPage)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,22 +11,22 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
float GetAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
float GetOverviewAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
||||||
{
|
{
|
||||||
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakeNumberText(const float Value)
|
FText MakeOverviewNumberText(const float Value)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("%.0f"), Value));
|
return FText::FromString(FString::Printf(TEXT("%.0f"), Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakePairText(const float CurrentValue, const float MaxValue)
|
FText MakeOverviewPairText(const float CurrentValue, const float MaxValue)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("%.0f / %.0f"), FMath::Max(0.0f, CurrentValue), FMath::Max(0.0f, MaxValue)));
|
return FText::FromString(FString::Printf(TEXT("%.0f / %.0f"), FMath::Max(0.0f, CurrentValue), FMath::Max(0.0f, MaxValue)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value, const bool bCanUpgrade = false)
|
void AddOverviewAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value, const bool bCanUpgrade = false)
|
||||||
{
|
{
|
||||||
if (GroupWidget)
|
if (GroupWidget)
|
||||||
{
|
{
|
||||||
@@ -37,19 +37,14 @@ namespace
|
|||||||
|
|
||||||
void UPHYAttributeOverviewPageWidget::RefreshAttributes(UAbilitySystemComponent* AbilitySystemComponent)
|
void UPHYAttributeOverviewPageWidget::RefreshAttributes(UAbilitySystemComponent* AbilitySystemComponent)
|
||||||
{
|
{
|
||||||
SetPageTitle(FText::FromString(TEXT("属性总览")));
|
SetPageTitle(FText::FromString(TEXT("核心属性")));
|
||||||
ClearGroups();
|
ClearGroups();
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* CoreGroup = AddGroup(FText::FromString(TEXT("核心属性")));
|
UPHYAttributeGroupWidget* CoreGroup = AddGroup(FText::FromString(TEXT("核心属性")));
|
||||||
AddAttributeRow(CoreGroup, TEXT("力量"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetStrengthAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("力量"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetStrengthAttribute())), true);
|
||||||
AddAttributeRow(CoreGroup, TEXT("敏捷"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetDexterityAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("敏捷"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetDexterityAttribute())), true);
|
||||||
AddAttributeRow(CoreGroup, TEXT("体质"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetVitalityAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("体质"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetVitalityAttribute())), true);
|
||||||
AddAttributeRow(CoreGroup, TEXT("智力"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetIntelligenceAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("智力"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetIntelligenceAttribute())), true);
|
||||||
AddAttributeRow(CoreGroup, TEXT("精神"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetSpiritAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("精神"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetSpiritAttribute())), true);
|
||||||
AddAttributeRow(CoreGroup, TEXT("感知"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetPerceptionAttribute())), true);
|
AddOverviewAttributeRow(CoreGroup, TEXT("感知"), MakeOverviewNumberText(GetOverviewAttributeValue(AbilitySystemComponent, UPHYCoreAttributeSet::GetPerceptionAttribute())), true);
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* ResourceGroup = AddGroup(FText::FromString(TEXT("战斗资源")));
|
|
||||||
AddAttributeRow(ResourceGroup, TEXT("生命值"), MakePairText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetHealthAttribute()), GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxHealthAttribute())));
|
|
||||||
AddAttributeRow(ResourceGroup, TEXT("法力值"), MakePairText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetManaAttribute()), GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxManaAttribute())));
|
|
||||||
AddAttributeRow(ResourceGroup, TEXT("耐力值"), MakePairText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetStaminaAttribute()), GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxStaminaAttribute())));
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,12 @@
|
|||||||
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributePageWidget)
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributePageWidget)
|
||||||
|
|
||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
|
#include "Components/Border.h"
|
||||||
#include "Components/ScrollBox.h"
|
#include "Components/ScrollBox.h"
|
||||||
#include "Components/ScrollBoxSlot.h"
|
#include "Components/ScrollBoxSlot.h"
|
||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
|
#include "Components/UniformGridPanel.h"
|
||||||
|
#include "Components/UniformGridSlot.h"
|
||||||
#include "Components/VerticalBox.h"
|
#include "Components/VerticalBox.h"
|
||||||
#include "Components/VerticalBoxSlot.h"
|
#include "Components/VerticalBoxSlot.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
@@ -40,9 +43,10 @@ void UPHYAttributePageWidget::SetPageTitle(FText InPageTitle)
|
|||||||
|
|
||||||
void UPHYAttributePageWidget::ClearGroups()
|
void UPHYAttributePageWidget::ClearGroups()
|
||||||
{
|
{
|
||||||
if (GroupsBox)
|
GroupCount = 0;
|
||||||
|
if (GroupsGrid)
|
||||||
{
|
{
|
||||||
GroupsBox->ClearChildren();
|
GroupsGrid->ClearChildren();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,16 +54,22 @@ UPHYAttributeGroupWidget* UPHYAttributePageWidget::AddGroup(FText GroupTitle)
|
|||||||
{
|
{
|
||||||
BuildNativeWidgetTree();
|
BuildNativeWidgetTree();
|
||||||
|
|
||||||
if (!GroupsBox || !WidgetTree)
|
if (!GroupsGrid || !WidgetTree)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* GroupWidget = WidgetTree->ConstructWidget<UPHYAttributeGroupWidget>(UPHYAttributeGroupWidget::StaticClass());
|
UPHYAttributeGroupWidget* GroupWidget = WidgetTree->ConstructWidget<UPHYAttributeGroupWidget>(UPHYAttributeGroupWidget::StaticClass());
|
||||||
GroupWidget->SetGroupTitle(MoveTemp(GroupTitle));
|
GroupWidget->SetGroupTitle(MoveTemp(GroupTitle));
|
||||||
if (UVerticalBoxSlot* GroupSlot = GroupsBox->AddChildToVerticalBox(GroupWidget))
|
UBorder* GroupPadding = WidgetTree->ConstructWidget<UBorder>(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;
|
return GroupWidget;
|
||||||
}
|
}
|
||||||
@@ -71,7 +81,7 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree()
|
|||||||
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WidgetTree->RootWidget && TitleText && GroupsScrollBox && GroupsBox)
|
if (WidgetTree->RootWidget && TitleText && GroupsScrollBox && GroupsGrid)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -80,11 +90,12 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree()
|
|||||||
WidgetTree->RootWidget = RootBox;
|
WidgetTree->RootWidget = RootBox;
|
||||||
|
|
||||||
TitleText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("TitleText"));
|
TitleText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("TitleText"));
|
||||||
TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 22));
|
TitleText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 12));
|
||||||
TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.42f, 0.18f, 0.08f, 1.0f)));
|
TitleText->SetColorAndOpacity(FSlateColor(FLinearColor(0.42f, 0.18f, 0.08f, 0.0f)));
|
||||||
|
TitleText->SetVisibility(ESlateVisibility::Collapsed);
|
||||||
if (UVerticalBoxSlot* TitleSlot = RootBox->AddChildToVerticalBox(TitleText))
|
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>(UScrollBox::StaticClass(), TEXT("GroupsScrollBox"));
|
GroupsScrollBox = WidgetTree->ConstructWidget<UScrollBox>(UScrollBox::StaticClass(), TEXT("GroupsScrollBox"));
|
||||||
@@ -93,8 +104,8 @@ void UPHYAttributePageWidget::BuildNativeWidgetTree()
|
|||||||
ScrollSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
ScrollSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupsBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("GroupsBox"));
|
GroupsGrid = WidgetTree->ConstructWidget<UUniformGridPanel>(UUniformGridPanel::StaticClass(), TEXT("GroupsGrid"));
|
||||||
if (UScrollBoxSlot* GroupsSlot = Cast<UScrollBoxSlot>(GroupsScrollBox->AddChild(GroupsBox)))
|
if (UScrollBoxSlot* GroupsSlot = Cast<UScrollBoxSlot>(GroupsScrollBox->AddChild(GroupsGrid)))
|
||||||
{
|
{
|
||||||
GroupsSlot->SetPadding(FMargin(0.0f));
|
GroupsSlot->SetPadding(FMargin(0.0f));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,22 +5,42 @@
|
|||||||
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributeResourceBarWidget)
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributeResourceBarWidget)
|
||||||
|
|
||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
|
#include "Components/Border.h"
|
||||||
#include "Components/HorizontalBox.h"
|
#include "Components/HorizontalBox.h"
|
||||||
#include "Components/HorizontalBoxSlot.h"
|
#include "Components/HorizontalBoxSlot.h"
|
||||||
#include "Components/ProgressBar.h"
|
#include "Components/ProgressBar.h"
|
||||||
|
#include "Components/SizeBox.h"
|
||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
#include "Components/VerticalBox.h"
|
#include "Components/VerticalBox.h"
|
||||||
#include "Components/VerticalBoxSlot.h"
|
#include "Components/VerticalBoxSlot.h"
|
||||||
|
#include "Engine/Texture2D.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
#include "Styling/CoreStyle.h"
|
#include "Styling/CoreStyle.h"
|
||||||
|
#include "Styling/SlateBrush.h"
|
||||||
#include "Widgets/SWidget.h"
|
#include "Widgets/SWidget.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
const TCHAR* const AttributeResourceRowTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.T_PHY_UI_RowStrip");
|
||||||
|
|
||||||
float MakePercent(const float CurrentValue, const float MaxValue)
|
float MakePercent(const float CurrentValue, const float MaxValue)
|
||||||
{
|
{
|
||||||
return MaxValue > UE_SMALL_NUMBER ? FMath::Clamp(CurrentValue / MaxValue, 0.0f, 1.0f) : 0.0f;
|
return MaxValue > UE_SMALL_NUMBER ? FMath::Clamp(CurrentValue / MaxValue, 0.0f, 1.0f) : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSlateBrush MakeAttributeResourceBrush()
|
||||||
|
{
|
||||||
|
FSlateBrush Brush;
|
||||||
|
Brush.DrawAs = ESlateBrushDrawType::Box;
|
||||||
|
Brush.Margin = FMargin(0.08f);
|
||||||
|
Brush.ImageSize = FVector2D(512.0f, 64.0f);
|
||||||
|
Brush.TintColor = FSlateColor(FLinearColor(1.0f, 0.98f, 0.90f, 0.24f));
|
||||||
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, AttributeResourceRowTexturePath))
|
||||||
|
{
|
||||||
|
Brush.SetResourceObject(Texture);
|
||||||
|
}
|
||||||
|
return Brush;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UPHYAttributeResourceBarWidget::UPHYAttributeResourceBarWidget(const FObjectInitializer& ObjectInitializer)
|
UPHYAttributeResourceBarWidget::UPHYAttributeResourceBarWidget(const FObjectInitializer& ObjectInitializer)
|
||||||
@@ -61,32 +81,43 @@ void UPHYAttributeResourceBarWidget::BuildNativeWidgetTree()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UVerticalBox* RootBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RootBox"));
|
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
||||||
WidgetTree->RootWidget = RootBox;
|
RootBorder->SetBrush(MakeAttributeResourceBrush());
|
||||||
|
RootBorder->SetPadding(FMargin(10.0f, 5.0f));
|
||||||
|
WidgetTree->RootWidget = RootBorder;
|
||||||
|
|
||||||
UHorizontalBox* HeaderBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("HeaderBox"));
|
UHorizontalBox* HeaderBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("HeaderBox"));
|
||||||
if (UVerticalBoxSlot* HeaderSlot = RootBox->AddChildToVerticalBox(HeaderBox))
|
RootBorder->SetContent(HeaderBox);
|
||||||
{
|
|
||||||
HeaderSlot->SetPadding(FMargin(0.0f, 2.0f, 0.0f, 2.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
LabelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LabelText"));
|
LabelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LabelText"));
|
||||||
LabelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 14));
|
LabelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 16));
|
||||||
LabelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.30f, 0.26f, 0.20f, 1.0f)));
|
LabelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.34f, 0.27f, 0.17f, 1.0f)));
|
||||||
if (UHorizontalBoxSlot* LabelSlot = HeaderBox->AddChildToHorizontalBox(LabelText))
|
if (UHorizontalBoxSlot* LabelSlot = HeaderBox->AddChildToHorizontalBox(LabelText))
|
||||||
{
|
{
|
||||||
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
||||||
|
LabelSlot->SetPadding(FMargin(0.0f, 0.0f, 18.0f, 0.0f));
|
||||||
|
LabelSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
USizeBox* BarSizeBox = WidgetTree->ConstructWidget<USizeBox>(USizeBox::StaticClass(), TEXT("BarSizeBox"));
|
||||||
|
BarSizeBox->SetHeightOverride(13.0f);
|
||||||
|
if (UHorizontalBoxSlot* BarOuterSlot = HeaderBox->AddChildToHorizontalBox(BarSizeBox))
|
||||||
|
{
|
||||||
|
BarOuterSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
||||||
|
BarOuterSlot->SetPadding(FMargin(0.0f, 2.0f, 18.0f, 0.0f));
|
||||||
|
BarOuterSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceBar = WidgetTree->ConstructWidget<UProgressBar>(UProgressBar::StaticClass(), TEXT("ResourceBar"));
|
||||||
|
BarSizeBox->AddChild(ResourceBar);
|
||||||
|
|
||||||
ValueText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("ValueText"));
|
ValueText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("ValueText"));
|
||||||
ValueText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 14));
|
ValueText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 14));
|
||||||
ValueText->SetColorAndOpacity(FSlateColor(FLinearColor(0.10f, 0.26f, 0.23f, 1.0f)));
|
ValueText->SetColorAndOpacity(FSlateColor(FLinearColor(0.23f, 0.20f, 0.16f, 1.0f)));
|
||||||
HeaderBox->AddChildToHorizontalBox(ValueText);
|
if (UHorizontalBoxSlot* ValueSlot = HeaderBox->AddChildToHorizontalBox(ValueText))
|
||||||
|
|
||||||
ResourceBar = WidgetTree->ConstructWidget<UProgressBar>(UProgressBar::StaticClass(), TEXT("ResourceBar"));
|
|
||||||
if (UVerticalBoxSlot* BarSlot = RootBox->AddChildToVerticalBox(ResourceBar))
|
|
||||||
{
|
{
|
||||||
BarSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, 7.0f));
|
ValueSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
||||||
|
ValueSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateResourceWidgets();
|
UpdateResourceWidgets();
|
||||||
|
|||||||
@@ -5,14 +5,38 @@
|
|||||||
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributeRowWidget)
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributeRowWidget)
|
||||||
|
|
||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
|
#include "Components/Border.h"
|
||||||
#include "Components/Button.h"
|
#include "Components/Button.h"
|
||||||
#include "Components/HorizontalBox.h"
|
#include "Components/HorizontalBox.h"
|
||||||
#include "Components/HorizontalBoxSlot.h"
|
#include "Components/HorizontalBoxSlot.h"
|
||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
|
#include "Engine/Texture2D.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
#include "Styling/CoreStyle.h"
|
#include "Styling/CoreStyle.h"
|
||||||
|
#include "Styling/SlateBrush.h"
|
||||||
|
#include "Styling/SlateTypes.h"
|
||||||
#include "Widgets/SWidget.h"
|
#include "Widgets/SWidget.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const TCHAR* const AttributeRowTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.T_PHY_UI_RowStrip");
|
||||||
|
const TCHAR* const AttributeRowCinnabarTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_CinnabarTab.T_PHY_UI_CinnabarTab");
|
||||||
|
|
||||||
|
FSlateBrush MakeAttributeRowBrush(const TCHAR* TexturePath, const FVector2D ImageSize, const FLinearColor Tint, const ESlateBrushDrawType::Type DrawAs = ESlateBrushDrawType::Box, const FMargin Margin = FMargin(0.08f))
|
||||||
|
{
|
||||||
|
FSlateBrush Brush;
|
||||||
|
Brush.DrawAs = DrawAs;
|
||||||
|
Brush.Margin = Margin;
|
||||||
|
Brush.ImageSize = ImageSize;
|
||||||
|
Brush.TintColor = FSlateColor(Tint);
|
||||||
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, TexturePath))
|
||||||
|
{
|
||||||
|
Brush.SetResourceObject(Texture);
|
||||||
|
}
|
||||||
|
return Brush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UPHYAttributeRowWidget::UPHYAttributeRowWidget(const FObjectInitializer& ObjectInitializer)
|
UPHYAttributeRowWidget::UPHYAttributeRowWidget(const FObjectInitializer& ObjectInitializer)
|
||||||
: Super(ObjectInitializer)
|
: Super(ObjectInitializer)
|
||||||
{
|
{
|
||||||
@@ -45,39 +69,48 @@ void UPHYAttributeRowWidget::BuildNativeWidgetTree()
|
|||||||
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WidgetTree->RootWidget && RowBox && LabelText && ValueText && UpgradeButton && UpgradeText)
|
if (WidgetTree->RootWidget && RowBorder && RowBox && LabelText && ValueText && UpgradeButton && UpgradeText)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RowBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RowBorder"));
|
||||||
|
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>(UHorizontalBox::StaticClass(), TEXT("RowBox"));
|
RowBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("RowBox"));
|
||||||
WidgetTree->RootWidget = RowBox;
|
RowBorder->SetContent(RowBox);
|
||||||
|
|
||||||
LabelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LabelText"));
|
LabelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LabelText"));
|
||||||
LabelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 15));
|
LabelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 16));
|
||||||
LabelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.28f, 0.25f, 0.20f, 1.0f)));
|
LabelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.31f, 0.25f, 0.16f, 1.0f)));
|
||||||
if (UHorizontalBoxSlot* LabelSlot = RowBox->AddChildToHorizontalBox(LabelText))
|
if (UHorizontalBoxSlot* LabelSlot = RowBox->AddChildToHorizontalBox(LabelText))
|
||||||
{
|
{
|
||||||
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
||||||
LabelSlot->SetPadding(FMargin(0.0f, 4.0f, 10.0f, 4.0f));
|
LabelSlot->SetPadding(FMargin(0.0f, 3.0f, 10.0f, 3.0f));
|
||||||
LabelSlot->SetVerticalAlignment(VAlign_Center);
|
LabelSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("ValueText"));
|
ValueText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("ValueText"));
|
||||||
ValueText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 15));
|
ValueText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 16));
|
||||||
ValueText->SetColorAndOpacity(FSlateColor(FLinearColor(0.08f, 0.24f, 0.22f, 1.0f)));
|
ValueText->SetColorAndOpacity(FSlateColor(FLinearColor(0.08f, 0.36f, 0.28f, 1.0f)));
|
||||||
if (UHorizontalBoxSlot* ValueSlot = RowBox->AddChildToHorizontalBox(ValueText))
|
if (UHorizontalBoxSlot* ValueSlot = RowBox->AddChildToHorizontalBox(ValueText))
|
||||||
{
|
{
|
||||||
ValueSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
ValueSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
||||||
ValueSlot->SetPadding(FMargin(0.0f, 4.0f, 8.0f, 4.0f));
|
ValueSlot->SetPadding(FMargin(0.0f, 3.0f, 12.0f, 3.0f));
|
||||||
ValueSlot->SetVerticalAlignment(VAlign_Center);
|
ValueSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpgradeButton = WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), TEXT("UpgradeButton"));
|
UpgradeButton = WidgetTree->ConstructWidget<UButton>(UButton::StaticClass(), TEXT("UpgradeButton"));
|
||||||
UpgradeButton->SetBackgroundColor(FLinearColor(0.67f, 0.16f, 0.10f, 0.85f));
|
FButtonStyle UpgradeButtonStyle;
|
||||||
|
UpgradeButtonStyle.SetNormal(MakeAttributeRowBrush(AttributeRowCinnabarTexturePath, FVector2D(34.0f, 34.0f), FLinearColor(0.20f, 0.35f, 0.31f, 0.96f)));
|
||||||
|
UpgradeButtonStyle.SetHovered(MakeAttributeRowBrush(AttributeRowCinnabarTexturePath, FVector2D(34.0f, 34.0f), FLinearColor(0.27f, 0.48f, 0.42f, 1.0f)));
|
||||||
|
UpgradeButtonStyle.SetPressed(MakeAttributeRowBrush(AttributeRowCinnabarTexturePath, FVector2D(34.0f, 34.0f), FLinearColor(0.74f, 0.24f, 0.13f, 1.0f)));
|
||||||
|
UpgradeButton->SetStyle(UpgradeButtonStyle);
|
||||||
UpgradeText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("UpgradeText"));
|
UpgradeText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("UpgradeText"));
|
||||||
UpgradeText->SetText(FText::FromString(TEXT("+")));
|
UpgradeText->SetText(FText::FromString(TEXT("+")));
|
||||||
UpgradeText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 14));
|
UpgradeText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 20));
|
||||||
UpgradeText->SetColorAndOpacity(FSlateColor(FLinearColor(0.98f, 0.92f, 0.78f, 1.0f)));
|
UpgradeText->SetColorAndOpacity(FSlateColor(FLinearColor(0.98f, 0.92f, 0.78f, 1.0f)));
|
||||||
UpgradeButton->SetContent(UpgradeText);
|
UpgradeButton->SetContent(UpgradeText);
|
||||||
if (UHorizontalBoxSlot* UpgradeSlot = RowBox->AddChildToHorizontalBox(UpgradeButton))
|
if (UHorizontalBoxSlot* UpgradeSlot = RowBox->AddChildToHorizontalBox(UpgradeButton))
|
||||||
|
|||||||
@@ -6,15 +6,50 @@
|
|||||||
|
|
||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
#include "Components/Border.h"
|
#include "Components/Border.h"
|
||||||
|
#include "Components/HorizontalBox.h"
|
||||||
|
#include "Components/HorizontalBoxSlot.h"
|
||||||
|
#include "Components/SizeBox.h"
|
||||||
#include "Components/Spacer.h"
|
#include "Components/Spacer.h"
|
||||||
#include "Components/TextBlock.h"
|
#include "Components/TextBlock.h"
|
||||||
#include "Components/VerticalBox.h"
|
#include "Components/VerticalBox.h"
|
||||||
#include "Components/VerticalBoxSlot.h"
|
#include "Components/VerticalBoxSlot.h"
|
||||||
|
#include "Engine/Texture2D.h"
|
||||||
#include "Fonts/SlateFontInfo.h"
|
#include "Fonts/SlateFontInfo.h"
|
||||||
#include "Styling/CoreStyle.h"
|
#include "Styling/CoreStyle.h"
|
||||||
|
#include "Styling/SlateBrush.h"
|
||||||
#include "UI/PHYAttributeResourceBarWidget.h"
|
#include "UI/PHYAttributeResourceBarWidget.h"
|
||||||
#include "Widgets/SWidget.h"
|
#include "Widgets/SWidget.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const TCHAR* const AttributeSummaryJadeTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_JadePanel.T_PHY_UI_JadePanel");
|
||||||
|
const TCHAR* const AttributeSummaryPortraitTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_PortraitFrame.T_PHY_UI_PortraitFrame");
|
||||||
|
|
||||||
|
FSlateBrush MakeAttributeSummaryBrush(const TCHAR* TexturePath, const FVector2D ImageSize, const FLinearColor Tint, const ESlateBrushDrawType::Type DrawAs = ESlateBrushDrawType::Box, const FMargin Margin = FMargin(0.08f))
|
||||||
|
{
|
||||||
|
FSlateBrush Brush;
|
||||||
|
Brush.DrawAs = DrawAs;
|
||||||
|
Brush.Margin = Margin;
|
||||||
|
Brush.ImageSize = ImageSize;
|
||||||
|
Brush.TintColor = FSlateColor(Tint);
|
||||||
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, TexturePath))
|
||||||
|
{
|
||||||
|
Brush.SetResourceObject(Texture);
|
||||||
|
}
|
||||||
|
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)
|
UPHYAttributeSummaryWidget::UPHYAttributeSummaryWidget(const FObjectInitializer& ObjectInitializer)
|
||||||
: Super(ObjectInitializer)
|
: Super(ObjectInitializer)
|
||||||
{
|
{
|
||||||
@@ -60,50 +95,72 @@ void UPHYAttributeSummaryWidget::BuildNativeWidgetTree()
|
|||||||
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WidgetTree->RootWidget && PlayerNameText && LevelText && CombatPowerText && ExperienceBar && HealthBar && ManaBar && StaminaBar)
|
if (WidgetTree->RootWidget && PlayerNameText && LevelText && CombatPowerText && ExperienceBar && ResourceBox)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
||||||
RootBorder->SetBrushColor(FLinearColor(0.92f, 0.86f, 0.70f, 0.55f));
|
RootBorder->SetBrushColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.0f));
|
||||||
RootBorder->SetPadding(FMargin(18.0f));
|
RootBorder->SetPadding(FMargin(0.0f));
|
||||||
WidgetTree->RootWidget = RootBorder;
|
WidgetTree->RootWidget = RootBorder;
|
||||||
|
|
||||||
UVerticalBox* RootBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RootBox"));
|
UVerticalBox* RootBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("RootBox"));
|
||||||
RootBorder->SetContent(RootBox);
|
RootBorder->SetContent(RootBox);
|
||||||
|
|
||||||
PlayerNameText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("PlayerNameText"));
|
UHorizontalBox* HeaderBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("HeaderBox"));
|
||||||
PlayerNameText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 24));
|
if (UVerticalBoxSlot* HeaderSlot = RootBox->AddChildToVerticalBox(HeaderBox))
|
||||||
PlayerNameText->SetColorAndOpacity(FSlateColor(FLinearColor(0.28f, 0.16f, 0.08f, 1.0f)));
|
{
|
||||||
RootBox->AddChildToVerticalBox(PlayerNameText);
|
HeaderSlot->SetPadding(FMargin(0.0f, 0.0f, 0.0f, 14.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
UBorder* LevelSeal = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("LevelSeal"));
|
||||||
|
LevelSeal->SetBrush(MakeAttributeSummaryBrush(AttributeSummaryJadeTexturePath, FVector2D(92.0f, 92.0f), FLinearColor(0.18f, 0.33f, 0.30f, 0.96f)));
|
||||||
|
LevelSeal->SetPadding(FMargin(10.0f));
|
||||||
|
if (UHorizontalBoxSlot* SealSlot = HeaderBox->AddChildToHorizontalBox(LevelSeal))
|
||||||
|
{
|
||||||
|
SealSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
||||||
|
SealSlot->SetPadding(FMargin(0.0f, 0.0f, 18.0f, 0.0f));
|
||||||
|
SealSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
|
}
|
||||||
|
|
||||||
LevelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LevelText"));
|
LevelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LevelText"));
|
||||||
LevelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 17));
|
LevelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 31));
|
||||||
LevelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.14f, 0.34f, 0.30f, 1.0f)));
|
LevelText->SetColorAndOpacity(FSlateColor(FLinearColor(1.0f, 0.86f, 0.55f, 1.0f)));
|
||||||
if (UVerticalBoxSlot* LevelSlot = RootBox->AddChildToVerticalBox(LevelText))
|
LevelSeal->SetContent(LevelText);
|
||||||
|
|
||||||
|
UVerticalBox* HeaderTextBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("HeaderTextBox"));
|
||||||
|
if (UHorizontalBoxSlot* HeaderTextSlot = HeaderBox->AddChildToHorizontalBox(HeaderTextBox))
|
||||||
{
|
{
|
||||||
LevelSlot->SetPadding(FMargin(0.0f, 8.0f, 0.0f, 0.0f));
|
HeaderTextSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
||||||
|
HeaderTextSlot->SetVerticalAlignment(VAlign_Center);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PlayerNameText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("PlayerNameText"));
|
||||||
|
PlayerNameText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 24));
|
||||||
|
PlayerNameText->SetColorAndOpacity(FSlateColor(FLinearColor(0.26f, 0.20f, 0.12f, 1.0f)));
|
||||||
|
HeaderTextBox->AddChildToVerticalBox(PlayerNameText);
|
||||||
|
|
||||||
CombatPowerText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("CombatPowerText"));
|
CombatPowerText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("CombatPowerText"));
|
||||||
CombatPowerText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 17));
|
CombatPowerText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 17));
|
||||||
CombatPowerText->SetColorAndOpacity(FSlateColor(FLinearColor(0.60f, 0.34f, 0.08f, 1.0f)));
|
CombatPowerText->SetColorAndOpacity(FSlateColor(FLinearColor(0.60f, 0.36f, 0.11f, 1.0f)));
|
||||||
if (UVerticalBoxSlot* PowerSlot = RootBox->AddChildToVerticalBox(CombatPowerText))
|
if (UVerticalBoxSlot* PowerSlot = HeaderTextBox->AddChildToVerticalBox(CombatPowerText))
|
||||||
{
|
{
|
||||||
PowerSlot->SetPadding(FMargin(0.0f, 4.0f, 0.0f, 14.0f));
|
PowerSlot->SetPadding(FMargin(0.0f, 8.0f, 0.0f, 0.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
UTextBlock* PortraitPlaceholder = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("PortraitPlaceholder"));
|
USizeBox* PortraitSizeBox = WidgetTree->ConstructWidget<USizeBox>(USizeBox::StaticClass(), TEXT("PortraitSizeBox"));
|
||||||
PortraitPlaceholder->SetText(FText::FromString(TEXT("云纹角色剪影")));
|
PortraitSizeBox->SetHeightOverride(438.0f);
|
||||||
PortraitPlaceholder->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 20));
|
if (UVerticalBoxSlot* PortraitSlot = RootBox->AddChildToVerticalBox(PortraitSizeBox))
|
||||||
PortraitPlaceholder->SetColorAndOpacity(FSlateColor(FLinearColor(0.38f, 0.45f, 0.38f, 0.85f)));
|
|
||||||
if (UVerticalBoxSlot* PortraitSlot = RootBox->AddChildToVerticalBox(PortraitPlaceholder))
|
|
||||||
{
|
{
|
||||||
PortraitSlot->SetPadding(FMargin(0.0f, 22.0f, 0.0f, 24.0f));
|
PortraitSlot->SetPadding(FMargin(0.0f, 2.0f, 0.0f, 18.0f));
|
||||||
PortraitSlot->SetHorizontalAlignment(HAlign_Center);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UBorder* PortraitBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("PortraitBorder"));
|
||||||
|
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>(UVerticalBox::StaticClass(), TEXT("ResourceBox"));
|
ResourceBox = WidgetTree->ConstructWidget<UVerticalBox>(UVerticalBox::StaticClass(), TEXT("ResourceBox"));
|
||||||
RootBox->AddChildToVerticalBox(ResourceBox);
|
RootBox->AddChildToVerticalBox(ResourceBox);
|
||||||
|
|
||||||
@@ -113,9 +170,6 @@ void UPHYAttributeSummaryWidget::BuildNativeWidgetTree()
|
|||||||
StaminaBar = WidgetTree->ConstructWidget<UPHYAttributeResourceBarWidget>(UPHYAttributeResourceBarWidget::StaticClass(), TEXT("StaminaBar"));
|
StaminaBar = WidgetTree->ConstructWidget<UPHYAttributeResourceBarWidget>(UPHYAttributeResourceBarWidget::StaticClass(), TEXT("StaminaBar"));
|
||||||
|
|
||||||
ResourceBox->AddChildToVerticalBox(ExperienceBar);
|
ResourceBox->AddChildToVerticalBox(ExperienceBar);
|
||||||
ResourceBox->AddChildToVerticalBox(HealthBar);
|
|
||||||
ResourceBox->AddChildToVerticalBox(ManaBar);
|
|
||||||
ResourceBox->AddChildToVerticalBox(StaminaBar);
|
|
||||||
|
|
||||||
UpdateSummaryWidgets();
|
UpdateSummaryWidgets();
|
||||||
}
|
}
|
||||||
@@ -124,15 +178,15 @@ void UPHYAttributeSummaryWidget::UpdateSummaryWidgets()
|
|||||||
{
|
{
|
||||||
if (PlayerNameText)
|
if (PlayerNameText)
|
||||||
{
|
{
|
||||||
PlayerNameText->SetText(PlayerName.IsEmpty() ? FText::FromString(TEXT("修行者")) : PlayerName);
|
PlayerNameText->SetText(MakeAttributeSummaryDisplayName(PlayerName));
|
||||||
}
|
}
|
||||||
if (LevelText)
|
if (LevelText)
|
||||||
{
|
{
|
||||||
LevelText->SetText(FText::FromString(FString::Printf(TEXT("等级 %d"), Level)));
|
LevelText->SetText(FText::FromString(FString::Printf(TEXT("%d"), Level)));
|
||||||
}
|
}
|
||||||
if (CombatPowerText)
|
if (CombatPowerText)
|
||||||
{
|
{
|
||||||
CombatPowerText->SetText(FText::FromString(FString::Printf(TEXT("战力 %d"), CombatPower)));
|
CombatPowerText->SetText(FText::FromString(FString::Printf(TEXT("战斗评分\n%d"), CombatPower)));
|
||||||
}
|
}
|
||||||
if (ExperienceBar)
|
if (ExperienceBar)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,27 +10,27 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
float GetAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
float GetCombatDerivedAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
||||||
{
|
{
|
||||||
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakeNumberText(const float Value)
|
FText MakeCombatNumberText(const float Value)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("%.0f"), Value));
|
return FText::FromString(FString::Printf(TEXT("%.0f"), Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakePercentText(const float Value)
|
FText MakeCombatPercentText(const float Value)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("%.1f%%"), Value * 100.0f));
|
return FText::FromString(FString::Printf(TEXT("%.1f%%"), Value * 100.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakeMultiplierText(const float Value)
|
FText MakeCombatMultiplierText(const float Value)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("x%.2f"), Value));
|
return FText::FromString(FString::Printf(TEXT("x%.2f"), Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value)
|
void AddCombatAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value)
|
||||||
{
|
{
|
||||||
if (GroupWidget)
|
if (GroupWidget)
|
||||||
{
|
{
|
||||||
@@ -45,28 +45,28 @@ void UPHYCombatDerivedAttributePageWidget::RefreshAttributes(UAbilitySystemCompo
|
|||||||
ClearGroups();
|
ClearGroups();
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* ResourceGroup = AddGroup(FText::FromString(TEXT("资源上限")));
|
UPHYAttributeGroupWidget* ResourceGroup = AddGroup(FText::FromString(TEXT("资源上限")));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("当前生命"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetHealthAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("当前生命"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetHealthAttribute())));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("生命上限"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxHealthAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("生命上限"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxHealthAttribute())));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("当前法力"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetManaAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("当前法力"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetManaAttribute())));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("法力上限"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxManaAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("法力上限"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxManaAttribute())));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("当前耐力"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetStaminaAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("当前耐力"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetStaminaAttribute())));
|
||||||
AddAttributeRow(ResourceGroup, TEXT("耐力上限"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxStaminaAttribute())));
|
AddCombatAttributeRow(ResourceGroup, TEXT("耐力上限"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMaxStaminaAttribute())));
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* AttackGroup = AddGroup(FText::FromString(TEXT("攻击能力")));
|
UPHYAttributeGroupWidget* AttackGroup = AddGroup(FText::FromString(TEXT("攻击能力")));
|
||||||
AddAttributeRow(AttackGroup, TEXT("物理攻击"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPhysicalAttackPowerAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("物理攻击"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPhysicalAttackPowerAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("法术强度"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetSpellPowerAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("法术强度"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetSpellPowerAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("命中率"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetAccuracyAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("命中率"), MakeCombatPercentText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetAccuracyAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("暴击率"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCriticalChanceAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("暴击率"), MakeCombatPercentText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCriticalChanceAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("暴击伤害"), MakeMultiplierText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCriticalDamageAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("暴击伤害"), MakeCombatMultiplierText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCriticalDamageAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("攻击速度"), MakeMultiplierText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetAttackSpeedAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("攻击速度"), MakeCombatMultiplierText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetAttackSpeedAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("冷却缩减"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCooldownReductionAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("冷却缩减"), MakeCombatPercentText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetCooldownReductionAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("破防强度"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetGuardBreakPowerAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("破防强度"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetGuardBreakPowerAttribute())));
|
||||||
AddAttributeRow(AttackGroup, TEXT("韧性伤害"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPoiseDamageAttribute())));
|
AddCombatAttributeRow(AttackGroup, TEXT("韧性伤害"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPoiseDamageAttribute())));
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* DefenseGroup = AddGroup(FText::FromString(TEXT("防御能力")));
|
UPHYAttributeGroupWidget* DefenseGroup = AddGroup(FText::FromString(TEXT("防御能力")));
|
||||||
AddAttributeRow(DefenseGroup, TEXT("护甲"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetArmorAttribute())));
|
AddCombatAttributeRow(DefenseGroup, TEXT("护甲"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetArmorAttribute())));
|
||||||
AddAttributeRow(DefenseGroup, TEXT("魔法抗性"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMagicResistanceAttribute())));
|
AddCombatAttributeRow(DefenseGroup, TEXT("魔法抗性"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetMagicResistanceAttribute())));
|
||||||
AddAttributeRow(DefenseGroup, TEXT("闪避率"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetEvasionAttribute())));
|
AddCombatAttributeRow(DefenseGroup, TEXT("闪避率"), MakeCombatPercentText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetEvasionAttribute())));
|
||||||
AddAttributeRow(DefenseGroup, TEXT("格挡强度"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetBlockPowerAttribute())));
|
AddCombatAttributeRow(DefenseGroup, TEXT("格挡强度"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetBlockPowerAttribute())));
|
||||||
AddAttributeRow(DefenseGroup, TEXT("韧性"), MakeNumberText(GetAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPoiseAttribute())));
|
AddCombatAttributeRow(DefenseGroup, TEXT("韧性"), MakeCombatNumberText(GetCombatDerivedAttributeValue(AbilitySystemComponent, UPHYCombatAttributeSet::GetPoiseAttribute())));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,17 +10,17 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
float GetAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
float GetElementDerivedAttributeValue(const UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute)
|
||||||
{
|
{
|
||||||
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
return AbilitySystemComponent ? AbilitySystemComponent->GetNumericAttribute(Attribute) : 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
FText MakePercentText(const float Value)
|
FText MakeElementPercentText(const float Value)
|
||||||
{
|
{
|
||||||
return FText::FromString(FString::Printf(TEXT("%.1f%%"), Value * 100.0f));
|
return FText::FromString(FString::Printf(TEXT("%.1f%%"), Value * 100.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value)
|
void AddElementAttributeRow(UPHYAttributeGroupWidget* GroupWidget, const TCHAR* Label, const FText& Value)
|
||||||
{
|
{
|
||||||
if (GroupWidget)
|
if (GroupWidget)
|
||||||
{
|
{
|
||||||
@@ -35,23 +35,23 @@ void UPHYElementDerivedAttributePageWidget::RefreshAttributes(UAbilitySystemComp
|
|||||||
ClearGroups();
|
ClearGroups();
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* BonusGroup = AddGroup(FText::FromString(TEXT("元素伤害加成")));
|
UPHYAttributeGroupWidget* BonusGroup = AddGroup(FText::FromString(TEXT("元素伤害加成")));
|
||||||
AddAttributeRow(BonusGroup, TEXT("火伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetFireDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("火伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetFireDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("水伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWaterDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("水伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWaterDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("冰伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetIceDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("冰伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetIceDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("雷伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightningDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("雷伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightningDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("地伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetEarthDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("地伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetEarthDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("风伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWindDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("风伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWindDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("光伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("光伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("暗伤加成"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetDarkDamageBonusAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("暗伤加成"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetDarkDamageBonusAttribute())));
|
||||||
AddAttributeRow(BonusGroup, TEXT("元素穿透"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetElementPenetrationAttribute())));
|
AddElementAttributeRow(BonusGroup, TEXT("元素穿透"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetElementPenetrationAttribute())));
|
||||||
|
|
||||||
UPHYAttributeGroupWidget* ResistanceGroup = AddGroup(FText::FromString(TEXT("元素抗性")));
|
UPHYAttributeGroupWidget* ResistanceGroup = AddGroup(FText::FromString(TEXT("元素抗性")));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("火抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetFireResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("火抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetFireResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("水抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWaterResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("水抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWaterResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("冰抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetIceResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("冰抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetIceResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("雷抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightningResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("雷抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightningResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("地抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetEarthResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("地抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetEarthResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("风抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWindResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("风抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetWindResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("光抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("光抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetLightResistanceAttribute())));
|
||||||
AddAttributeRow(ResistanceGroup, TEXT("暗抗"), MakePercentText(GetAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetDarkResistanceAttribute())));
|
AddElementAttributeRow(ResistanceGroup, TEXT("暗抗"), MakeElementPercentText(GetElementDerivedAttributeValue(AbilitySystemComponent, UPHYElementAttributeSet::GetDarkResistanceAttribute())));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,4 +38,7 @@ namespace PHYGameplayTags
|
|||||||
|
|
||||||
/** @brief 背包开关输入。 */
|
/** @brief 背包开关输入。 */
|
||||||
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Inventory_Toggle);
|
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Inventory_Toggle);
|
||||||
|
|
||||||
|
/** @brief 角色属性菜单开关输入。 */
|
||||||
|
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Input_Menu_Attribute);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GIPS_InputProcessor.h"
|
||||||
|
#include "PHYInputProcessor_OpenAttributeMenu.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PHY 角色属性菜单输入处理器。
|
||||||
|
*
|
||||||
|
* 该处理器处理 `Input.Menu.Attribute`,并把本地输入路由到玩家控制器打开 Generic UI Menu 层。
|
||||||
|
*/
|
||||||
|
UCLASS(BlueprintType, Blueprintable, EditInlineNew, DefaultToInstanced)
|
||||||
|
class PHY_API UPHYInputProcessor_OpenAttributeMenu : public UGIPS_InputProcessor
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
/** @brief 构造默认响应的输入 Tag 和触发事件。 */
|
||||||
|
UPHYInputProcessor_OpenAttributeMenu();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** @brief 检查当前输入组件是否能处理角色属性菜单输入。 */
|
||||||
|
virtual bool CheckCanHandleInput_Implementation(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, FGameplayTag InputTag, ETriggerEvent TriggerEvent) const override;
|
||||||
|
|
||||||
|
/** @brief 处理 Started 菜单输入。 */
|
||||||
|
virtual void HandleInputStarted_Implementation(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, FGameplayTag InputTag) const override;
|
||||||
|
|
||||||
|
/** @brief 返回编辑器里显示的处理器名称。 */
|
||||||
|
virtual FString GetEditorFriendlyName_Implementation() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** @brief 将菜单输入发送给玩家控制器。 */
|
||||||
|
bool RouteOpenAttributeMenuInput(UGIPS_InputSystemComponent* IC, const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent) const;
|
||||||
|
};
|
||||||
@@ -66,6 +66,10 @@ public:
|
|||||||
/** @brief 默认视角输入处理器类,用于创建 GenericInputSystem 控制配置。 */
|
/** @brief 默认视角输入处理器类,用于创建 GenericInputSystem 控制配置。 */
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
TSoftClassPtr<UGIPS_InputProcessor> DefaultLookInputProcessorClass;
|
TSoftClassPtr<UGIPS_InputProcessor> DefaultLookInputProcessorClass;
|
||||||
|
|
||||||
|
/** @brief 默认角色属性菜单输入处理器类,用于推入 UI Menu 层。 */
|
||||||
|
UPROPERTY(Config)
|
||||||
|
TSoftClassPtr<UGIPS_InputProcessor> DefaultAttributeMenuInputProcessorClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ public:
|
|||||||
/** @brief 从 GenericInputSystem 处理器路由视角输入,并阻止同一事件被 fallback 重复执行。 */
|
/** @brief 从 GenericInputSystem 处理器路由视角输入,并阻止同一事件被 fallback 重复执行。 */
|
||||||
bool RouteLookInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
bool RouteLookInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
|
/** @brief 路由角色属性菜单输入。 */
|
||||||
|
bool RouteOpenAttributeMenuInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
|
/** @brief 从 GenericInputSystem 处理器路由角色属性菜单输入,并阻止同一事件被 fallback 重复执行。 */
|
||||||
|
bool RouteOpenAttributeMenuInputFromProcessor(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** @brief 绑定玩家角色身上的 GenericInputSystem 输入委托。 */
|
/** @brief 绑定玩家角色身上的 GenericInputSystem 输入委托。 */
|
||||||
virtual void BindInputEvents();
|
virtual void BindInputEvents();
|
||||||
@@ -73,12 +79,18 @@ protected:
|
|||||||
/** @brief 处理视角输入。 */
|
/** @brief 处理视角输入。 */
|
||||||
virtual bool HandleLookInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
virtual bool HandleLookInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
|
/** @brief 处理角色属性菜单输入,本地推入 Generic UI Menu 层。 */
|
||||||
|
virtual bool HandleOpenAttributeMenuInput(const FInputActionInstance& ActionData, ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
/** @brief 查询并消费移动处理器留下的重复执行保护。 */
|
/** @brief 查询并消费移动处理器留下的重复执行保护。 */
|
||||||
virtual bool ConsumeMoveProcessorGuard(ETriggerEvent TriggerEvent);
|
virtual bool ConsumeMoveProcessorGuard(ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
/** @brief 查询并消费视角处理器留下的重复执行保护。 */
|
/** @brief 查询并消费视角处理器留下的重复执行保护。 */
|
||||||
virtual bool ConsumeLookProcessorGuard(ETriggerEvent TriggerEvent);
|
virtual bool ConsumeLookProcessorGuard(ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
|
/** @brief 查询并消费属性菜单处理器留下的重复执行保护。 */
|
||||||
|
virtual bool ConsumeAttributeMenuProcessorGuard(ETriggerEvent TriggerEvent);
|
||||||
|
|
||||||
/** @brief 当前已经绑定输入委托的角色输入组件。 */
|
/** @brief 当前已经绑定输入委托的角色输入组件。 */
|
||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
TObjectPtr<UGIPS_InputSystemComponent> BoundInputSystemComponent;
|
TObjectPtr<UGIPS_InputSystemComponent> BoundInputSystemComponent;
|
||||||
@@ -110,4 +122,12 @@ protected:
|
|||||||
/** @brief 最近一次由输入处理器处理的 Look 触发事件。 */
|
/** @brief 最近一次由输入处理器处理的 Look 触发事件。 */
|
||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
ETriggerEvent LastLookInputProcessorTriggerEvent = ETriggerEvent::None;
|
ETriggerEvent LastLookInputProcessorTriggerEvent = ETriggerEvent::None;
|
||||||
|
|
||||||
|
/** @brief 输入处理器是否已经处理了最近一次属性菜单输入。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
|
bool bAttributeMenuInputHandledByProcessor = false;
|
||||||
|
|
||||||
|
/** @brief 最近一次由输入处理器处理的属性菜单触发事件。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
|
ETriggerEvent LastAttributeMenuInputProcessorTriggerEvent = ETriggerEvent::None;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class APlayerController;
|
|||||||
class APHYPlayerState;
|
class APHYPlayerState;
|
||||||
class UAbilitySystemComponent;
|
class UAbilitySystemComponent;
|
||||||
class UButton;
|
class UButton;
|
||||||
|
class UPHYAttributeResourceBarWidget;
|
||||||
class UHorizontalBox;
|
class UHorizontalBox;
|
||||||
class UPHYAttributeOverviewPageWidget;
|
class UPHYAttributeOverviewPageWidget;
|
||||||
class UPHYCombatDerivedAttributePageWidget;
|
class UPHYCombatDerivedAttributePageWidget;
|
||||||
@@ -138,6 +139,18 @@ protected:
|
|||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
TObjectPtr<UWidgetSwitcher> PageSwitcher;
|
TObjectPtr<UWidgetSwitcher> PageSwitcher;
|
||||||
|
|
||||||
|
/** @brief 设计稿右侧顶部生命资源条。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
|
TObjectPtr<UPHYAttributeResourceBarWidget> HeaderHealthBar;
|
||||||
|
|
||||||
|
/** @brief 设计稿右侧顶部法力资源条。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
|
TObjectPtr<UPHYAttributeResourceBarWidget> HeaderManaBar;
|
||||||
|
|
||||||
|
/** @brief 设计稿右侧顶部耐力资源条。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
|
TObjectPtr<UPHYAttributeResourceBarWidget> HeaderStaminaBar;
|
||||||
|
|
||||||
/** @brief 总览分页。 */
|
/** @brief 总览分页。 */
|
||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
TObjectPtr<UPHYAttributeOverviewPageWidget> OverviewPage;
|
TObjectPtr<UPHYAttributeOverviewPageWidget> OverviewPage;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
class UPHYAttributeGroupWidget;
|
class UPHYAttributeGroupWidget;
|
||||||
class UScrollBox;
|
class UScrollBox;
|
||||||
class UTextBlock;
|
class UTextBlock;
|
||||||
|
class UUniformGridPanel;
|
||||||
class UVerticalBox;
|
class UVerticalBox;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,5 +65,8 @@ protected:
|
|||||||
|
|
||||||
/** @brief 分组容器。 */
|
/** @brief 分组容器。 */
|
||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
TObjectPtr<UVerticalBox> GroupsBox;
|
TObjectPtr<UUniformGridPanel> GroupsGrid;
|
||||||
|
|
||||||
|
/** @brief 当前分页分组数量,用于双列排版。 */
|
||||||
|
int32 GroupCount = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "PHYAttributeRowWidget.generated.h"
|
#include "PHYAttributeRowWidget.generated.h"
|
||||||
|
|
||||||
class UButton;
|
class UButton;
|
||||||
|
class UBorder;
|
||||||
class UHorizontalBox;
|
class UHorizontalBox;
|
||||||
class UTextBlock;
|
class UTextBlock;
|
||||||
|
|
||||||
@@ -55,6 +56,10 @@ protected:
|
|||||||
|
|
||||||
/** @brief 行根容器。 */
|
/** @brief 行根容器。 */
|
||||||
UPROPERTY(Transient)
|
UPROPERTY(Transient)
|
||||||
|
TObjectPtr<UBorder> RowBorder;
|
||||||
|
|
||||||
|
/** @brief 行水平容器。 */
|
||||||
|
UPROPERTY(Transient)
|
||||||
TObjectPtr<UHorizontalBox> RowBox;
|
TObjectPtr<UHorizontalBox> RowBox;
|
||||||
|
|
||||||
/** @brief 属性名称文本。 */
|
/** @brief 属性名称文本。 */
|
||||||
|
|||||||
Reference in New Issue
Block a user