diff --git a/Content/CombatSystem/UI/WBP_MainHUD.uasset b/Content/CombatSystem/UI/WBP_MainHUD.uasset index 7a358493..6b17f599 100644 Binary files a/Content/CombatSystem/UI/WBP_MainHUD.uasset and b/Content/CombatSystem/UI/WBP_MainHUD.uasset differ diff --git a/Content/CombatSystem/UI/WBP_PotionAmountText.uasset b/Content/CombatSystem/UI/WBP_PotionAmountText.uasset new file mode 100644 index 00000000..f3f8c230 Binary files /dev/null and b/Content/CombatSystem/UI/WBP_PotionAmountText.uasset differ diff --git a/Source/D1/Actor/BaseConsumable.cpp b/Source/D1/Actor/BaseConsumable.cpp index 34fc46e4..8791305c 100644 --- a/Source/D1/Actor/BaseConsumable.cpp +++ b/Source/D1/Actor/BaseConsumable.cpp @@ -9,7 +9,7 @@ ABaseConsumable::ABaseConsumable() { //초기화 구문 MaxNumberOfUses = 3; - CurrentNumberOfUses = 0; + CurrentNumberOfUses = MaxNumberOfUses; //Settings OwnedGameplayTags OwnedGameplayTags.AddTag(FCombatGameplayTags::Get().Item_Consumable_Potion); @@ -17,7 +17,7 @@ ABaseConsumable::ABaseConsumable() void ABaseConsumable::UseItem() { - if(MaxNumberOfUses < CurrentNumberOfUses) + if(CurrentNumberOfUses <= 0) return; ICombatInterface* ActionObjects = Cast(GetOwner()); @@ -25,5 +25,12 @@ void ABaseConsumable::UseItem() return; ActionObjects->PerformCustomAction(FCombatGameplayTags::Get().Character_Action_Attack_UseItem, FCombatGameplayTags::Get().Character_State_GeneralActionState, UseItemMontage); - CurrentNumberOfUses++; + CurrentNumberOfUses--; + + OnConsumeUpdated.Broadcast(GetNumberOfConsumable()); +} + +int32 ABaseConsumable::GetNumberOfConsumable() +{ + return FMath::Clamp(CurrentNumberOfUses, 0, CurrentNumberOfUses); } diff --git a/Source/D1/Actor/BaseConsumable.h b/Source/D1/Actor/BaseConsumable.h index 44867e11..506cce1d 100644 --- a/Source/D1/Actor/BaseConsumable.h +++ b/Source/D1/Actor/BaseConsumable.h @@ -9,6 +9,8 @@ /** * */ +DECLARE_MULTICAST_DELEGATE_OneParam(FOnConsumeUpdated, int32) + UCLASS() class D1_API ABaseConsumable : public ABaseEquippable { @@ -18,6 +20,11 @@ public: public: virtual void UseItem() override; +public: + int32 GetNumberOfConsumable(); + +public: //Delegate + FOnConsumeUpdated OnConsumeUpdated; private: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage", meta = (AllowPrivateAccess = "true")) TObjectPtr UseItemMontage; diff --git a/Source/D1/CombatPlayerCharacter.cpp b/Source/D1/CombatPlayerCharacter.cpp index 558bd305..beee2e61 100644 --- a/Source/D1/CombatPlayerCharacter.cpp +++ b/Source/D1/CombatPlayerCharacter.cpp @@ -1,6 +1,8 @@ // Copyright Epic Games, Inc. All Rights Reserved. #include "CombatPlayerCharacter.h" + +#include "CombatPlayerController.h" #include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.h" #include "Components/InputComponent.h" @@ -16,10 +18,14 @@ #include "Definitions/CombatGameplayTags.h" #include "Engine/DamageEvents.h" #include "NiagaraFunctionLibrary.h" +#include "Actor/BaseConsumable.h" #include "DamageType/AttackDamageType.h" #include "Kismet/KismetSystemLibrary.h" #include "Kismet/KismetMathLibrary.h" #include "Kismet/GameplayStatics.h" +#include "UI/CombatHUD.h" +#include "UI/UI_MainHUD.h" +#include "UI/UI_PotionAmountText.h" ////////////////////////////////////////////////////////////////////////// // ACombatCharacter @@ -131,6 +137,11 @@ void ACombatPlayerCharacter::BeginPlay() { SpawnItem->OnEquipped(); EquippedItems.Add(SpawnItem); + if(ABaseConsumable* consumableItem = Cast(SpawnItem)) + { + if(UUI_PotionAmountText* PotionAmountText = Cast(PotionUI)) + PotionAmountText->InitializePotionData(consumableItem); //TODO : [UMG] 관련 부분 구조 변경 필요 + } } } @@ -432,6 +443,11 @@ void ACombatPlayerCharacter::SetMovementSpeedMode(EMovementSpeedMode NewSpeedMod } } +void ACombatPlayerCharacter::SetPotionUI(UUserWidget* potionUI) +{ + PotionUI = potionUI; +} + void ACombatPlayerCharacter::Move(const FInputActionValue& Value) { if(!bCanMove) //Value changes SetCanMove Func Call to Animnotify diff --git a/Source/D1/CombatPlayerCharacter.h b/Source/D1/CombatPlayerCharacter.h index 27f21d35..ca5e911d 100644 --- a/Source/D1/CombatPlayerCharacter.h +++ b/Source/D1/CombatPlayerCharacter.h @@ -139,6 +139,7 @@ public: public: void SetMovementSpeedMode(EMovementSpeedMode NewSpeedMode); FORCEINLINE EMovementSpeedMode GetMovementSpeedMode() const { return MovementSpeedMode; } + void SetPotionUI(UUserWidget* potionUI); protected: //Input Funcs @@ -245,7 +246,8 @@ public: TObjectPtr KnockdownBackMontage; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage|Death", meta = (AllowPrivateAccess = "true")) TArray> DeathAnimations; - + + TObjectPtr PotionUI; private: //Timeline UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Timeline", meta = (AllowPrivateAccess = "true")) diff --git a/Source/D1/Interface/CombatInterface.h b/Source/D1/Interface/CombatInterface.h index fad25936..6385f0c9 100644 --- a/Source/D1/Interface/CombatInterface.h +++ b/Source/D1/Interface/CombatInterface.h @@ -56,5 +56,4 @@ public: virtual bool PerformCustomAction(FGameplayTag ActionTag, FGameplayTag StateTag, UAnimMontage* InMontage, float fMontagePlayRate = 1.f, bool bAutoReset = false); UFUNCTION(Category="CombatActions") virtual bool UseItemByTag(FGameplayTag ItemTag); - }; diff --git a/Source/D1/UI/CombatHUD.cpp b/Source/D1/UI/CombatHUD.cpp index 16133d64..185ca6eb 100644 --- a/Source/D1/UI/CombatHUD.cpp +++ b/Source/D1/UI/CombatHUD.cpp @@ -20,9 +20,3 @@ void ACombatHUD::BeginPlay() } } } - -void ACombatHUD::UpdateHealthPotionAmount() -{ - if(!IsValid(MainUI)) - return; -} diff --git a/Source/D1/UI/CombatHUD.h b/Source/D1/UI/CombatHUD.h index 20a338c0..a89d9b5b 100644 --- a/Source/D1/UI/CombatHUD.h +++ b/Source/D1/UI/CombatHUD.h @@ -16,9 +16,8 @@ class D1_API ACombatHUD : public AHUD protected: virtual void BeginPlay() override; + public: - void UpdateHealthPotionAmount(); -private: UPROPERTY(EditDefaultsOnly, Category = UI) TSubclassOf MainUI; }; diff --git a/Source/D1/UI/UI_MainHUD.h b/Source/D1/UI/UI_MainHUD.h index 214b18d3..ad7949f3 100644 --- a/Source/D1/UI/UI_MainHUD.h +++ b/Source/D1/UI/UI_MainHUD.h @@ -18,4 +18,6 @@ public: TObjectPtr HealthBar; UPROPERTY(meta = (BindWidget)) TObjectPtr StaminaBar; + UPROPERTY(meta = (BindWidget)) + TObjectPtr HealthPotionAmountText; }; diff --git a/Source/D1/UI/UI_PotionAmountText.cpp b/Source/D1/UI/UI_PotionAmountText.cpp new file mode 100644 index 00000000..24aea941 --- /dev/null +++ b/Source/D1/UI/UI_PotionAmountText.cpp @@ -0,0 +1,34 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "UI/UI_PotionAmountText.h" + +#include "CombatPlayerCharacter.h" +#include "Actor/BaseConsumable.h" +#include "Components/TextBlock.h" +#include "Kismet/GameplayStatics.h" + +void UUI_PotionAmountText::NativeConstruct() +{ + Super::NativeConstruct(); + + ACombatPlayerCharacter* player = Cast(UGameplayStatics::GetPlayerController(this, 0)->GetPawn()); + if(player) //TODO : [UMG] 관련 부분 구조 변경 필요 + player->SetPotionUI(this); +} + +void UUI_PotionAmountText::InitializePotionData(ABaseConsumable* instance) +{ + if(instance != nullptr) + { + PotionInstance = instance; + PotionInstance->OnConsumeUpdated.AddUObject(this, &UUI_PotionAmountText::SetPotionAmount); + SetPotionAmount(PotionInstance->GetNumberOfConsumable()); + } +} + +void UUI_PotionAmountText::SetPotionAmount(int32 amount) +{ + FString potionStr = FString::Printf(TEXT("%d"), amount); + PotionAmountText->SetText(FText::FromString(potionStr)); +} diff --git a/Source/D1/UI/UI_PotionAmountText.h b/Source/D1/UI/UI_PotionAmountText.h new file mode 100644 index 00000000..8d0c653a --- /dev/null +++ b/Source/D1/UI/UI_PotionAmountText.h @@ -0,0 +1,32 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "UI_PotionAmountText.generated.h" + +/** + * + */ +class ABaseConsumable; + +UCLASS() +class D1_API UUI_PotionAmountText : public UUserWidget +{ + GENERATED_BODY() + +protected: + virtual void NativeConstruct() override; +public: + void InitializePotionData(ABaseConsumable* instance); + //Delegate + void SetPotionAmount(int32 amount); + +private: + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(BindWidget, AllowPrivateAccess="true")) + TObjectPtr PotionAmountText; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess="true")) + TObjectPtr PotionInstance; +};