From 6d0fb2c92840b1a50619b23c90864e5888e7e670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E6=98=8E=E4=B8=8D=E6=83=91?= Date: Tue, 3 Mar 2026 23:01:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0overlap=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Config/DefaultGame.ini | 3 +- .../UI/Menu/Overlap/WBP_Menu_Overlap.uasset | Bin 25756 -> 26456 bytes .../Overlap/Widget/WBP_CharacterInfo.uasset | Bin 0 -> 32248 bytes .../UI/Synty/WBP_Synty_ProgressBarBase.uasset | Bin 0 -> 41028 bytes .../Private/Character/PHYPlayerCharacter.cpp | 20 ++--- Source/PHY/Private/GameplayTags/UITags.cpp | 3 + Source/PHY/Private/GameplayTags/UITags.h | 3 + .../Private/UI/GameUIExtensionPointWidget.cpp | 14 ++++ .../Private/UI/GameUIExtensionPointWidget.h | 20 +++++ Source/PHY/Private/UI/HUD/PHYGameHUD.cpp | 44 ++++++++--- Source/PHY/Private/UI/HUD/PHYGameHUD.h | 9 ++- Source/PHY/Private/UI/Menu/Menu_Overlap.cpp | 74 ++++++++++++++++++ Source/PHY/Private/UI/Menu/Menu_Overlap.h | 25 ++++++ Source/PHY/Private/UI/PHYGameUILayout.cpp | 37 --------- Source/PHY/Private/UI/PHYGameUILayout.h | 47 ----------- Source/PHY/Private/UI/PHYGameUIPolicy.h | 20 ----- .../UI/Widget/Widget_CharacterInfo.cpp | 63 +++++++++++++++ .../Private/UI/Widget/Widget_CharacterInfo.h | 42 ++++++++++ 18 files changed, 295 insertions(+), 129 deletions(-) create mode 100644 Content/AGame/UI/Menu/Overlap/Widget/WBP_CharacterInfo.uasset create mode 100644 Content/AGame/UI/Synty/WBP_Synty_ProgressBarBase.uasset create mode 100644 Source/PHY/Private/UI/GameUIExtensionPointWidget.cpp create mode 100644 Source/PHY/Private/UI/GameUIExtensionPointWidget.h delete mode 100644 Source/PHY/Private/UI/PHYGameUILayout.cpp delete mode 100644 Source/PHY/Private/UI/PHYGameUILayout.h delete mode 100644 Source/PHY/Private/UI/PHYGameUIPolicy.h create mode 100644 Source/PHY/Private/UI/Widget/Widget_CharacterInfo.cpp create mode 100644 Source/PHY/Private/UI/Widget/Widget_CharacterInfo.h diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini index 5107308..aeba32e 100644 --- a/Config/DefaultGame.ini +++ b/Config/DefaultGame.ini @@ -8,4 +8,5 @@ CopyrightNotice= [/Script/GenericUISystem.GUIS_GenericUISystemSettings] ; Set this in editor to a BP subclass of UPHYGameUIPolicy (recommended), e.g. ; /Game/AGame/UI/BP_PHYGameUIPolicy.BP_PHYGameUIPolicy_C -GameUIPolicyClass= +GameUIPolicyClass=/Game/AGame/UI/GameUIPolicy.GameUIPolicy_C + diff --git a/Content/AGame/UI/Menu/Overlap/WBP_Menu_Overlap.uasset b/Content/AGame/UI/Menu/Overlap/WBP_Menu_Overlap.uasset index ca7828b1b3594293ce5dd71a1a32ecd0cc955272..689d1fade44e28970a25c9de038aaddd204a1dd5 100644 GIT binary patch delta 6671 zcmc&&3s98T6}~?%;L2-}U0&fK4@p#9e8yCxg1k{+mzN*}_<;o%ahJzJeZ>upRbw;} zu9{?0T~@H2)Sj7t z&%Nh-=iGD8xsU(fADoiT{z2Lq8GhlC&s#pP?7jNusG6^T`sS=xH}$7}JY?!KeyZO? z2#NC{L<_tugpdT_w4-(sT_|ZE4~EVM@r1+xZ+!%QfG$nG$9r^2Ujk8U3L%~F{BSzm zAjSEj=^naIDxDH)BqX^-F%rLbfrd<)*0HM#rt zx=+mvpQK2^X%S49Jh{g2C-l7bXbC2w zJl~jCo@I24pA?oJEQ~;9mog#u;K=U5_A8kGii|dEi>;35Bk0WQFAr>+AWPC*8t*eH zh9x0w`4Ur|yYsA@8}`u40XLGc;5e`He0Tp!`pBRQImq~tgYT;?x z9h4*4=r4m}rApct8z$M=uZ^Y!Cry|EhK#VA3NR2-XRtP^lFK!~%dCy7c$ZYtqrovt zgccWpsne2aw{yBi&tSzL+Y3FBtIzyV+(u*{hQg3ZDTFe%>#>#A99w2&BjJmQL!Nf%F?BDK(yksl@Fdc*-nGa869BuLVe zG(9|A*belD>!p}cjW&k7>*Io3C-(VBMRae}9Ottz8qzh`Vq29aDc~F#&JanB+pdU4 z#a#t|FN}?Ik}mH+cZDD+1ifb;!g7yalMnJ;QB0aEiGaCXJ~$CRfJ7F?a)_H6X)N6L6xirE93MA4k~fEaii&&zC7I3Jqv0+C z?s+dbF@~r=u7%BjWAj%#6j6(XcO8J#i$j5H=eo}UC)#R%{{%UQkN{{r$2)lXo*)Dd zJVJ&{w4>rt`bKP0%54=M@7PubAO!Jeczd&%!yhpYanT)>8Ll8aqL8E63|_J2CCn@? zZgx1TaRH&aim#9@6-@mCSECfw9Xxe^s^aRTlz*rO!x#(UiRbX;z>&;#t{6)d2^m(I z;q8Ejiii?MLFjcyst82Qg>s|EuTq_wuIZ zCH>;avA^$^EZyS{M{X~3m^AxVzItcfJO8?2-TwQFsriczeP~Yi)tjC8^M8D*|96AO z(}HOWG@Dc4>t#n!BK`5S2)~!6!--@XI63Wb;!6C2Np72>!Fu4sNNnw;LI9i{El{z$ z`COYEW_W?lrq^pCmQ6v8 zSnb&yh76ahYn2ISRVV~fhsoxH=nxD|*(He#b?<1vF23xOQNAg}7ziWN*e@aKxh%q1m9f7p0FD-F@e2(JBSI&#If*8g z78t(mI>su)xL$l%9oZndJg%D0IWo33PebFO6*;WjU{DtsPj@5@HJ67;%I|1}jOF>C zMKu*Vz)KZj(wMah|JL_QlM?lRl;{0$06nxkw^h1tCRS+(8gJa4m4oAKi9R_8vOYfe zn%s2Jn{2ciG>JVh1ucJ;{9$hY2geJyWnBAh>+#-CyvfF_5c70#!N%dqq&jPF)RBpM zTM|y7Cr?=x+m|a=WF$TXS|qWWF2XifB>dO4RhjeP{>(*{yEF2hf7bsuPwY5oN9Ufh z?1=OrC*Y^!}1Mmm8LXqsS_5@g59}P?C@dmvUzo3vtBn!W0@K0W(5f>Cj zx00#E*X_ucK^7T?j*s&G=MKi4vTccuV2cnE1kXln0Cg&ibaURrxr6hyoUh^hY0fur zzK-+toPU?|F3uM+4r@hyaHvb01TSw9G_XNyNaiMLZ8g5OI&n*}d6s*DBybtdpYJ^; zK?7!ly$U8G#LGr~<{hyt=Wvi`k^BgL1?q4eD+vzeKy{?btK5V}gZnONzmHFLQfbj8 ztG?Tjd5hW`4)wTs5QwMWh~4k<2TDP% Tq>kl2+~r@GA}^p%H7))(C_DV- delta 5719 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 Q@<}^GZ))d}nHv`U2i?^2=l}o! diff --git a/Content/AGame/UI/Menu/Overlap/Widget/WBP_CharacterInfo.uasset b/Content/AGame/UI/Menu/Overlap/Widget/WBP_CharacterInfo.uasset new file mode 100644 index 0000000000000000000000000000000000000000..62465c6d70a14af8fc2dd29abe634ed09b9f5990 GIT binary patch literal 32248 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 %0=u; zlv-sm_)B=?GV`b0ioJ>YM;bY=&*ouh89w}}e6UB3gG^5dTSq_Rjx`(@EK?RF~m?6{XPmO z0dL#m#~dQ@(^BxoRTF(!JH%+vQmtbZd>4j)WECI&Hh(@9A3!Ks&pwcdk9~{cq>naO z(IedZd=B%WPYYD^ki^SAjet)oh@Tv#&q!E*!SFP=a`m1DwIQb2qphq|Bibp?D4024m$Um^vuEAcTEv9~U) ztOQL^hCSD?slHNGYue(tcNM|gQggn~?8ksXH3H-aUsI62I*|_7 zn4}C*&XI7mIZUOQs8@o9R1v6b7x>%|J|TpuO#k?PLKSp_uQ*geHyHh^pc@QARnQH} zy$ZTP^C{7dFBD*s+FrC+M6DVX##1DoM6s(f+PedOK_LJjjsamt&3*tY;J8son97(@ zN3k46bul4+FLsW;Af-q8-U`J6kGIi;0RmH*-ti3^Ol2zK#d28CT2c=@#dm0wxf3Sr z$low^ys4eBc5(F~j`6Mu8>ZU6(avb&<3NtYH%xOKe|F}>z75lMjTN#R6&-thX}>4q zY=DIX)|*ti6?*peO9u*Dro_gMTh`<&7neaxxxBC+^jAz6Q|#k36X!Wp@3S%CWWvbt zXX{uiOQz7`4}Av>BNtxETC*By@2rRr)FW4yxv&x^v}+DmI&ATBo+G`Z=G{9#`B-@T zoW1X+OO*Sw;Xm*1jtozFG&Me$#9kjB@V=PnDY?O6}|w5sa$r-tq|MMUkvYA zbk1iv=wNjePX3Pvle$Bv{`38Np;0r| zHVhs!@8la?m?$G2NAZ2e+Cx2uO{{x6_Wk;M4GWten_{i(C4vdpC8DitdM=|xdhg6R z(%=32&9QT?IsNv2&G22;%Knps$=~HzDy9K$3(xOZ%VhuO9qYpU$A>>t7DUYrjZduQ z{d5=?Cd!ruAINcWb-e$px5u?ItF>k`pcHa(YPA-(%&+-UNl z`+>*>?ic%~hh(0#R`#FlSV-^r*S_)o!rw7;$%*@}lUjYz&std@i3F*TaJFO>CO7sBUXj!zDgrir;YxcRFb&p403;V}B=eMiv^$W08MrXUM zy_x^hKyD13m*6Z#4ZJHr7M3}RCT~Z6jpCG~ouk(bt67XvaEN!yHNYGOpH{Au{Poxa zGba@+862_Tu0Z86kYNa9d6|q0s!WBX0A0+-%ZIue<~%)@Twu;6rcS&$Lh0Lmk}fn#W;+~O67vEbgY3?Mmo4@hFh?hO5?K{8SD`f zTfv{AD?xP&tbiol`3M(_=+KSQ;|T>+V~X3YZdY2z_SkUDwkILudcFwTH$z^GZIs%J zu?>G{?&aA=mYsiZ0dvZ6J=2*`%BTkY>&0k^}&$(Pv=eQ3T3GO zcvTYdj?sN;1Flp*}vM~68l6&j-F z&pmZDxrbY-0f8Znerv{WU0>N4^KlE=rX!svyM&3wM5v$Sx%=}436q1ObBof`wisD? zN6nn1EgS2^e>OX7%8b_nrgUfJQ(Q8~yz4P4W_!I2`T7s$FOOyAn{RYlccIpm@YRds zH$8pm(BoBBE{zI)tPJVI2@+3bq5=vEQ?8gqr(|Y8Dl{2>R(^xRPofpoLW+@7)SS-Y&IUJazz*1`&f|WSNjldH~IL%#)M^ zx-uNZYRZTLXBRkI#w69f6tE*!VhBRuMsT13;K+d+b$Ck>BPLD|Q5@)sQuL%;)Bsp{ y)CgQUp{DT32UI0@MJeh%@HgBS-d#P;tLwgFNHUTpO$BFz`q~}d)t*Nfg#RD6A2tmD literal 0 HcmV?d00001 diff --git a/Content/AGame/UI/Synty/WBP_Synty_ProgressBarBase.uasset b/Content/AGame/UI/Synty/WBP_Synty_ProgressBarBase.uasset new file mode 100644 index 0000000000000000000000000000000000000000..1ba9e6a793013fd06043c8cb3353572f39aa594b GIT binary patch literal 41028 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 eQxDGy8}!nC)PZc;RQ}0;%(}1c>LEiB@c$o(); + if (!PS) return; + UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent(); + if (!ASC) return; if (const APlayerController* PC = Cast(GetController())) { if (APHYGameHUD* GameHUD = Cast(PC->GetHUD())) { - GameHUD->InitializeHUD(); + GameHUD->InitializeHUD(ASC, PS); } } } @@ -179,19 +183,7 @@ void APHYPlayerCharacter::InitializeGAS() GetWorldTimerManager().SetTimer(RegenTimerHandle, this, &APHYPlayerCharacter::RegenTick, RegenInterval, true); } } - - // Push MoveSpeed to CharacterMovement (both sides, will converge via replication) - if (UCharacterMovementComponent* MoveComp = GetCharacterMovement()) - { - if (const UPHYAttributeSet* AS = PS->GetAttributeSet()) - { - const float DesiredSpeed = AS->GetMoveSpeed(); - if (DesiredSpeed > 0.f) - { - MoveComp->MaxWalkSpeed = DesiredSpeed; - } - } - } + } void APHYPlayerCharacter::StopRegen() diff --git a/Source/PHY/Private/GameplayTags/UITags.cpp b/Source/PHY/Private/GameplayTags/UITags.cpp index ee6a4f6..5dbd924 100644 --- a/Source/PHY/Private/GameplayTags/UITags.cpp +++ b/Source/PHY/Private/GameplayTags/UITags.cpp @@ -10,4 +10,7 @@ namespace UITags UE_DEFINE_GAMEPLAY_TAG(Tag__UI_Layer_GameMenu, "UI.Layer.GameMenu"); UE_DEFINE_GAMEPLAY_TAG(Tag__UI_Layer_Menu, "UI.Layer.Menu"); UE_DEFINE_GAMEPLAY_TAG(Tag__UI_Layer_Modal, "UI.Layer.Modal"); + + // 拓展点 + UE_DEFINE_GAMEPLAY_TAG(Tag__UI_HUD_CharacterInfo, "UI.HUD.CharacterInfo"); } diff --git a/Source/PHY/Private/GameplayTags/UITags.h b/Source/PHY/Private/GameplayTags/UITags.h index c5198f3..a6ba153 100644 --- a/Source/PHY/Private/GameplayTags/UITags.h +++ b/Source/PHY/Private/GameplayTags/UITags.h @@ -14,4 +14,7 @@ namespace UITags UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag__UI_Layer_GameMenu); UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag__UI_Layer_Menu); UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag__UI_Layer_Modal); + + // 拓展点 + UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag__UI_HUD_CharacterInfo); }; diff --git a/Source/PHY/Private/UI/GameUIExtensionPointWidget.cpp b/Source/PHY/Private/UI/GameUIExtensionPointWidget.cpp new file mode 100644 index 0000000..eebc84b --- /dev/null +++ b/Source/PHY/Private/UI/GameUIExtensionPointWidget.cpp @@ -0,0 +1,14 @@ +// + + +#include "GameUIExtensionPointWidget.h" + +UUserWidget* UGameUIExtensionPointWidget::FindExtensionWidgetByHandle(const FGUIS_GameUIExtHandle& Handle) const +{ + return ExtensionMapping.FindRef(Handle); +} + +void UGameUIExtensionPointWidget::SetExtensionTag(const FGameplayTag& InExtensionPointTag) +{ + ExtensionPointTag = InExtensionPointTag; +} diff --git a/Source/PHY/Private/UI/GameUIExtensionPointWidget.h b/Source/PHY/Private/UI/GameUIExtensionPointWidget.h new file mode 100644 index 0000000..ed7350d --- /dev/null +++ b/Source/PHY/Private/UI/GameUIExtensionPointWidget.h @@ -0,0 +1,20 @@ +// + +#pragma once + +#include "CoreMinimal.h" +#include "UIExtension/GUIS_GameUIExtensionPointWidget.h" +#include "GameUIExtensionPointWidget.generated.h" + +/** + * + */ +UCLASS() +class PHY_API UGameUIExtensionPointWidget : public UGUIS_GameUIExtensionPointWidget +{ + GENERATED_BODY() + +public: + UUserWidget* FindExtensionWidgetByHandle(const FGUIS_GameUIExtHandle& Handle) const; + void SetExtensionTag(const FGameplayTag& InExtensionPointTag); +}; diff --git a/Source/PHY/Private/UI/HUD/PHYGameHUD.cpp b/Source/PHY/Private/UI/HUD/PHYGameHUD.cpp index 41b6694..1c7aaa5 100644 --- a/Source/PHY/Private/UI/HUD/PHYGameHUD.cpp +++ b/Source/PHY/Private/UI/HUD/PHYGameHUD.cpp @@ -3,8 +3,12 @@ #include "PHYGameHUD.h" +#include "AbilitySystemBlueprintLibrary.h" +#include "Gameplay/Player/PHYPlayerState.h" #include "GameplayTags/UITags.h" #include "UI/Actions/GUIS_AsyncAction_PushContentToUILayer.h" +#include "UI/Menu/Menu_Overlap.h" + UGUIS_GameUISubsystem* APHYGameHUD::GetUISubsystem() const { @@ -15,15 +19,7 @@ UGUIS_GameUISubsystem* APHYGameHUD::GetUISubsystem() const return nullptr; } -void APHYGameHUD::OnBeforePushOverlapWidget(UCommonActivatableWidget* UserWidget) -{ -} - -void APHYGameHUD::OnAfterPushOverlapWidget(UCommonActivatableWidget* UserWidget) -{ -} - -void APHYGameHUD::InitializeHUD() +void APHYGameHUD::InitializeHUD(UAbilitySystemComponent* InAbilitySystemComponent, APHYPlayerState* InPlayerState) { // 获取当前的player controller APlayerController* PC = GetOwningPlayerController(); @@ -44,8 +40,38 @@ void APHYGameHUD::InitializeHUD() PushAction->AfterPush.AddDynamic(this, &APHYGameHUD::OnAfterPushOverlapWidget); PushAction->Activate(); } + if (InAbilitySystemComponent) + { + BoundAbilitySystemComponent = InAbilitySystemComponent; + } else + { + BoundAbilitySystemComponent = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetOwningPawn()); + } + if (InPlayerState) + { + BoundPlayerState = InPlayerState; + } else + { + BoundPlayerState = PC->GetPlayerState(); + + } } +void APHYGameHUD::OnBeforePushOverlapWidget(UCommonActivatableWidget* UserWidget) +{ + +} + +void APHYGameHUD::OnAfterPushOverlapWidget(UCommonActivatableWidget* UserWidget) +{ + if (UMenu_Overlap* OverlapWidget = Cast(UserWidget)) + { + OverlapWidgetInstance = OverlapWidget; + OverlapWidgetInstance->BindAscEvents(BoundAbilitySystemComponent); + } +} + + void APHYGameHUD::EndPlay(const EEndPlayReason::Type EndPlayReason) { if (const APlayerController* PC = GetOwningPlayerController()) diff --git a/Source/PHY/Private/UI/HUD/PHYGameHUD.h b/Source/PHY/Private/UI/HUD/PHYGameHUD.h index d544464..31dfe6c 100644 --- a/Source/PHY/Private/UI/HUD/PHYGameHUD.h +++ b/Source/PHY/Private/UI/HUD/PHYGameHUD.h @@ -8,6 +8,9 @@ #include "PHYGameHUD.generated.h" +class UMenu_Overlap; +class APHYPlayerState; +class UAbilitySystemComponent; class UCommonActivatableWidget; /** * @@ -22,7 +25,7 @@ class PHY_API APHYGameHUD : public AHUD public: - void InitializeHUD(); + void InitializeHUD(UAbilitySystemComponent* InAbilitySystemComponent, APHYPlayerState* InPlayerState); protected: virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; @@ -35,4 +38,8 @@ private: void OnBeforePushOverlapWidget(UCommonActivatableWidget* UserWidget); UFUNCTION() void OnAfterPushOverlapWidget(UCommonActivatableWidget* UserWidget); + UPROPERTY() + UMenu_Overlap* OverlapWidgetInstance; + UAbilitySystemComponent* BoundAbilitySystemComponent; + APHYPlayerState* BoundPlayerState; }; diff --git a/Source/PHY/Private/UI/Menu/Menu_Overlap.cpp b/Source/PHY/Private/UI/Menu/Menu_Overlap.cpp index c85ed62..aeea063 100644 --- a/Source/PHY/Private/UI/Menu/Menu_Overlap.cpp +++ b/Source/PHY/Private/UI/Menu/Menu_Overlap.cpp @@ -2,3 +2,77 @@ #include "Menu_Overlap.h" + +#include "AbilitySystemComponent.h" +#include "AbilitySystem/Attributes/PHYAttributeSet.h" +#include "GameplayTags/UITags.h" +#include "UI/GameUIExtensionPointWidget.h" +#include "UI/Widget/Widget_CharacterInfo.h" + +void UMenu_Overlap::NativePreConstruct() +{ + Super::NativePreConstruct(); + +} + +void UMenu_Overlap::NativeOnActivated() +{ + Super::NativeOnActivated(); + +} + +void UMenu_Overlap::NativeOnInitialized() +{ + Super::NativeOnInitialized(); + // 推送拓展点 + if (UGUIS_ExtensionSubsystem* ExtensionSubsystem = GetWorld()->GetSubsystem()) + { + if (CharacterInfoWidgetClass) + { + CharacterInfoExtHandle = ExtensionSubsystem->RegisterExtensionAsWidget(UITags::Tag__UI_HUD_CharacterInfo,CharacterInfoWidgetClass, 0); + } + } +} + +void UMenu_Overlap::BindAscEvents(UAbilitySystemComponent* AbilitySystemComponent) +{ + if (AbilitySystemComponent == nullptr) return; + const UPHYAttributeSet* Attributes = AbilitySystemComponent->GetSet(); + if (Attributes == nullptr) return; + // 从拓展点获取widget + if (!UserInfoExtensionPoint) return; + UUserWidget* CurrentUserInfoWidget = UserInfoExtensionPoint->FindExtensionWidgetByHandle(CharacterInfoExtHandle); + UWidget_CharacterInfo* CharacterInfoWidget = Cast(CurrentUserInfoWidget); + if (CharacterInfoWidget == nullptr) return; + // 同步初始属性值 + CurrentHp = Attributes->GetHealth(); + MaxHp = Attributes->GetMaxHealth(); + CurrentMp = Attributes->GetInnerPower(); + MaxMp = Attributes->GetMaxInnerPower(); + AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attributes->GetHealthAttribute()).AddLambda( + [this, CharacterInfoWidget](const FOnAttributeChangeData& Data) + { + CurrentHp = Data.NewValue; + CharacterInfoWidget->SetHp(CurrentHp, MaxHp); + }); + AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attributes->GetMaxHealthAttribute()).AddLambda( + [this, CharacterInfoWidget](const FOnAttributeChangeData& Data) + { + MaxHp = Data.NewValue; + CharacterInfoWidget->SetHp(CurrentHp, MaxHp); + }); + AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attributes->GetInnerPowerAttribute()).AddLambda( + [this, CharacterInfoWidget](const FOnAttributeChangeData& Data) + { + CurrentMp = Data.NewValue; + CharacterInfoWidget->SetMp(CurrentMp, MaxMp); + }); + AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attributes->GetMaxInnerPowerAttribute()).AddLambda( + [this, CharacterInfoWidget](const FOnAttributeChangeData& Data) + { + MaxMp = Data.NewValue; + CharacterInfoWidget->SetMp(CurrentMp, MaxMp); + }); + CharacterInfoWidget->SetHp(CurrentHp, MaxHp); + CharacterInfoWidget->SetMp(CurrentMp, MaxMp); +} diff --git a/Source/PHY/Private/UI/Menu/Menu_Overlap.h b/Source/PHY/Private/UI/Menu/Menu_Overlap.h index 6874968..3656f9d 100644 --- a/Source/PHY/Private/UI/Menu/Menu_Overlap.h +++ b/Source/PHY/Private/UI/Menu/Menu_Overlap.h @@ -4,8 +4,11 @@ #include "CoreMinimal.h" #include "UI/GUIS_ActivatableWidget.h" +#include "UIExtension/GUIS_GameUIExtensionSubsystem.h" #include "Menu_Overlap.generated.h" +class UAbilitySystemComponent; +class UGameUIExtensionPointWidget; /** * */ @@ -13,4 +16,26 @@ UCLASS() class PHY_API UMenu_Overlap : public UGUIS_ActivatableWidget { GENERATED_BODY() + + UPROPERTY(meta=(BindWidget)) + UGameUIExtensionPointWidget* UserInfoExtensionPoint; + UPROPERTY(EditDefaultsOnly, Category="Sub Widget Class") + TSubclassOf CharacterInfoWidgetClass; + FGUIS_GameUIExtHandle CharacterInfoExtHandle; + +protected: + virtual void NativePreConstruct() override; + virtual void NativeOnActivated() override; + virtual void NativeOnInitialized() override; + +public: + void BindAscEvents(UAbilitySystemComponent* AbilitySystemComponent); + +private: + float CurrentHp = 0.f; + float MaxHp = 0.f; + float CurrentMp = 0.f; + float MaxMp = 0.f; + float CurrentXp = 0.f; + float MaxXp = 0.f; }; diff --git a/Source/PHY/Private/UI/PHYGameUILayout.cpp b/Source/PHY/Private/UI/PHYGameUILayout.cpp deleted file mode 100644 index 687fba6..0000000 --- a/Source/PHY/Private/UI/PHYGameUILayout.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2026 PHY. All Rights Reserved. - -#include "UI/PHYGameUILayout.h" - -#include "GameplayTags/UITags.h" -#include "Widgets/CommonActivatableWidgetContainer.h" - -#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYGameUILayout) - -UPHYGameUILayout::UPHYGameUILayout(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ -} - -void UPHYGameUILayout::NativeOnInitialized() -{ - Super::NativeOnInitialized(); - - // Register available layers. Widget Blueprint can bind any subset. - if (Layer_Game) - { - RegisterLayer(UITags::Tag__UI_Layer_Game, Layer_Game); - } - if (Layer_GameMenu) - { - RegisterLayer(UITags::Tag__UI_Layer_GameMenu, Layer_GameMenu); - } - if (Layer_Menu) - { - RegisterLayer(UITags::Tag__UI_Layer_Menu, Layer_Menu); - } - if (Layer_Modal) - { - RegisterLayer(UITags::Tag__UI_Layer_Modal, Layer_Modal); - } -} - diff --git a/Source/PHY/Private/UI/PHYGameUILayout.h b/Source/PHY/Private/UI/PHYGameUILayout.h deleted file mode 100644 index ef14836..0000000 --- a/Source/PHY/Private/UI/PHYGameUILayout.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2026 PHY. All Rights Reserved. - -#pragma once - -#include "CoreMinimal.h" -#include "UI/GUIS_GameUILayout.h" -#include "PHYGameUILayout.generated.h" - -class UCommonActivatableWidgetStack; -class UCommonActivatableWidgetContainerBase; - -/** - * Root UI Layout for a single local player. - * - * In BP (Widget Blueprint derived from this), you should: - * - Create several UCommonActivatableWidgetStack (or other ContainerBase) widgets - * - Bind them to the properties below - * - In PreConstruct/Construct, call RegisterLayer for each stack with tags from UITags - */ -UCLASS(Abstract, BlueprintType) -class PHY_API UPHYGameUILayout : public UGUIS_GameUILayout -{ - GENERATED_BODY() - -public: - UPHYGameUILayout(const FObjectInitializer& ObjectInitializer); - -protected: - virtual void NativeOnInitialized() override; - - /** Game HUD layer stack. Tag: UI.Layer.Game */ - UPROPERTY(meta=(BindWidgetOptional), BlueprintReadOnly) - TObjectPtr Layer_Game = nullptr; - - /** In-game menu layer stack. Tag: UI.Layer.GameMenu */ - UPROPERTY(meta=(BindWidgetOptional), BlueprintReadOnly) - TObjectPtr Layer_GameMenu = nullptr; - - /** Main menu layer stack. Tag: UI.Layer.Menu */ - UPROPERTY(meta=(BindWidgetOptional), BlueprintReadOnly) - TObjectPtr Layer_Menu = nullptr; - - /** Modal layer stack. Tag: UI.Layer.Modal */ - UPROPERTY(meta=(BindWidgetOptional), BlueprintReadOnly) - TObjectPtr Layer_Modal = nullptr; -}; - diff --git a/Source/PHY/Private/UI/PHYGameUIPolicy.h b/Source/PHY/Private/UI/PHYGameUIPolicy.h deleted file mode 100644 index fca4a7d..0000000 --- a/Source/PHY/Private/UI/PHYGameUIPolicy.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2026 PHY. All Rights Reserved. - -#pragma once - -#include "CoreMinimal.h" -#include "UI/GUIS_GameUIPolicy.h" -#include "PHYGameUIPolicy.generated.h" - -/** - * Game-specific UI policy. - * - * This class mainly exists so we can set up a default LayoutClass in a Blueprint child, - * and keep all UI wiring inside the game module. - */ -UCLASS(BlueprintType) -class PHY_API UPHYGameUIPolicy : public UGUIS_GameUIPolicy -{ - GENERATED_BODY() -}; - diff --git a/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.cpp b/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.cpp new file mode 100644 index 0000000..7533df2 --- /dev/null +++ b/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.cpp @@ -0,0 +1,63 @@ +// + + +#include "Widget_CharacterInfo.h" + +#include "Components/TextBlock.h" +#include "UI/Synty/Synty_ProgressBar.h" + +void UWidget_CharacterInfo::SetXp(const float InCurrentXp, const float InMaxXp) const +{ + if (InMaxXp == 0) + { + return; + } + if (XP) + { + XP->SetTargetFillAmount(InCurrentXp / InMaxXp); + } + if (XPText) + { + XPText->SetText(FText::FromString(FString::Printf(TEXT("%d / %d"), FMath::RoundToInt(InCurrentXp), FMath::RoundToInt(InMaxXp)))); + } +} + +void UWidget_CharacterInfo::SetHp(const float InCurrentHp, const float InMaxHp) const +{ + if (InMaxHp == 0) + { + return; + } + if (HP) + { + HP->SetTargetFillAmount(InCurrentHp / InMaxHp); + } + if (HPText) + { + HPText->SetText(FText::FromString(FString::Printf(TEXT("%d / %d"), FMath::RoundToInt(InCurrentHp), FMath::RoundToInt(InMaxHp)))); + } +} + +void UWidget_CharacterInfo::SetMp(const float InCurrentMp, const float InMaxMp) const +{ + if (InMaxMp == 0) + { + return; + } + if (MP) + { + MP->SetTargetFillAmount(InCurrentMp / InMaxMp); + } + if (MPText) + { + MPText->SetText(FText::FromString(FString::Printf(TEXT("%d / %d"), FMath::RoundToInt(InCurrentMp), FMath::RoundToInt(InMaxMp)))); + } +} + +void UWidget_CharacterInfo::SetLevel(const int32 InLevel) const +{ + if (LevelText) + { + LevelText->SetText(FText::FromString(FString::Printf(TEXT("%d"), InLevel))); + } +} diff --git a/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.h b/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.h new file mode 100644 index 0000000..3252745 --- /dev/null +++ b/Source/PHY/Private/UI/Widget/Widget_CharacterInfo.h @@ -0,0 +1,42 @@ +// + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "Widget_CharacterInfo.generated.h" + +/** + * + */ +UCLASS() +class PHY_API UWidget_CharacterInfo : public UUserWidget +{ + GENERATED_BODY() + + // xp + UPROPERTY(meta=(BindWidget)) + class USynty_ProgressBar* XP; + // Hp + UPROPERTY(meta=(BindWidget)) + class USynty_ProgressBar* HP; + // Mp + UPROPERTY(meta=(BindWidget)) + class USynty_ProgressBar* MP; + + UPROPERTY(meta=(BindWidget)) + class UTextBlock* LevelText; + + UPROPERTY(meta=(BindWidget)) + class UTextBlock* XPText; + UPROPERTY(meta=(BindWidget)) + class UTextBlock* HPText; + UPROPERTY(meta=(BindWidget)) + class UTextBlock* MPText; + +public: + void SetXp(float InCurrentXp, float InMaxXp) const; + void SetHp(float InCurrentHp, float InMaxHp) const; + void SetMp(float InCurrentMp, float InMaxMp) const; + void SetLevel(int32 InLevel) const; +};