From 312cf74de4eac0b8c796be5ee3e67eef414f4381 Mon Sep 17 00:00:00 2001 From: "PCYPC\\pcy35" Date: Thu, 10 Aug 2023 19:06:02 +0900 Subject: [PATCH] =?UTF-8?q?[=EB=B0=95=EC=B9=98=EC=98=81]=20Stat=20Componen?= =?UTF-8?q?t=20=EC=9E=91=EC=97=85=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Blueprints/BP_CombatCharacter.uasset | Bin 36684 -> 37201 bytes Content/CombatSystem/UI/WBP_MainHUD.uasset | Bin 0 -> 24176 bytes Content/CombatSystem/UI/WBP_StatBar.uasset | Bin 0 -> 22810 bytes D1.uproject | 3 +- Source/D1/Actor/BaseWeapon.cpp | 34 +++++++ Source/D1/Actor/BaseWeapon.h | 9 ++ Source/D1/CombatCharacter.cpp | 92 +++++++++++++++--- Source/D1/CombatCharacter.h | 14 ++- Source/D1/Components/StatsComponent.cpp | 17 +++- Source/D1/Components/StatsComponent.h | 14 ++- Source/D1/UI/UI_StatBar.cpp | 10 ++ Source/D1/UI/UI_StatBar.h | 22 +++++ 12 files changed, 189 insertions(+), 26 deletions(-) create mode 100644 Content/CombatSystem/UI/WBP_MainHUD.uasset create mode 100644 Content/CombatSystem/UI/WBP_StatBar.uasset create mode 100644 Source/D1/UI/UI_StatBar.cpp create mode 100644 Source/D1/UI/UI_StatBar.h diff --git a/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset b/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset index 63bb72135304053e1d4f5225efbea5b8e2cd0915..a53c7515e0d9d5513d1c8424a5969d35ce41fef8 100644 GIT binary patch delta 8493 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 ha$@_sq)VPY1X1LsAYJm*^v78hkSetCollisionObjectTypes(InputCollisionObjectTypes); CollisionComponent->SetDrawDebugType(EDrawDebugTrace::None); + + ActionStatCost.Add(ECharacterAction::LightAttack, 10.f); + ActionStatCost.Add(ECharacterAction::HeavyAttack, 15.f); + ActionStatCost.Add(ECharacterAction::ChargedAttack, 20.f); + ActionStatCost.Add(ECharacterAction::FallingAttack, 10.f); + ActionStatCost.Add(ECharacterAction::SprintAttack, 10.f); + ActionStatCost.Add(ECharacterAction::Dodge, 20.f); + + ActionDamageMultiplier.Add(ECharacterAction::LightAttack, 1.f); + ActionDamageMultiplier.Add(ECharacterAction::HeavyAttack, 1.4f); + ActionDamageMultiplier.Add(ECharacterAction::ChargedAttack, 1.5f); + ActionDamageMultiplier.Add(ECharacterAction::FallingAttack, 1.2f); + ActionDamageMultiplier.Add(ECharacterAction::SprintAttack, 1.2f); } void ABaseWeapon::OnEquipped() { SetIsEquipped(true); AActor* owner = GetOwner(); + if (!owner) + return; CombatComponent = owner->GetComponentByClass(); + OwnerStateManager = owner->GetComponentByClass(); if (CombatComponent->GetCombatEnabled()) AttachActor(HandSocketName); @@ -62,6 +78,24 @@ void ABaseWeapon::SimulateWeaponPhysics() GetItemMesh()->SetSimulatePhysics(true); } +float ABaseWeapon::GetStatCostForAction() +{ + if (!IsValid(OwnerStateManager)) + return 0.f; + + return *ActionStatCost.Find(OwnerStateManager->GetCurrentAction()); +} + +float ABaseWeapon::GetDamage() +{ + if (!IsValid(OwnerStateManager)) + return Damage; + float outDamage = *ActionDamageMultiplier.Find(OwnerStateManager->GetCurrentAction()); + outDamage = FMath::Clamp(outDamage, 1.f, outDamage) * Damage; + + return outDamage; +} + TArray ABaseWeapon::GetActionMontage(ECharacterAction characterAction) { TArray outputArr; diff --git a/Source/D1/Actor/BaseWeapon.h b/Source/D1/Actor/BaseWeapon.h index 589b4978..30b279a7 100644 --- a/Source/D1/Actor/BaseWeapon.h +++ b/Source/D1/Actor/BaseWeapon.h @@ -32,6 +32,8 @@ public: public: //Normal void SimulateWeaponPhysics(); + float GetStatCostForAction(); + float GetDamage(); public: TArray GetActionMontage(ECharacterAction characterAction); @@ -45,6 +47,8 @@ protected: TObjectPtr CombatComponent; UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components") TObjectPtr CollisionComponent; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components") + TObjectPtr OwnerStateManager; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") TObjectPtr EnterCombat; @@ -65,4 +69,9 @@ protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") float Damage; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") + TMap ActionStatCost; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") + TMap ActionDamageMultiplier; }; diff --git a/Source/D1/CombatCharacter.cpp b/Source/D1/CombatCharacter.cpp index f87b7603..ef460fcc 100644 --- a/Source/D1/CombatCharacter.cpp +++ b/Source/D1/CombatCharacter.cpp @@ -12,6 +12,7 @@ #include "Interface/Interact.h" #include "Actor/BaseWeapon.h" #include "Components/CombatComponent.h" +#include "Components/StatsComponent.h" #include "Engine/DamageEvents.h" #include "Kismet/KismetSystemLibrary.h" #include "Kismet/KismetMathLibrary.h" @@ -71,6 +72,10 @@ ACombatCharacter::ACombatCharacter() StateManagerComponent->OnActionBegin.AddUObject(this, &ACombatCharacter::CharacterActionBegin); StateManagerComponent->OnActionEnd.AddUObject(this, &ACombatCharacter::CharacterActionEnd); + // Setting StatsComponent + StatsComponent = CreateDefaultSubobject(TEXT("StatsComponent")); + StatsComponent->OnCurrentStatValueUpdated.AddUObject(this, &ACombatCharacter::CharacterCurrentStatValueUpdated); + //Setting MovementSpeed MovementSpeedMode = EMovementSpeedMode::Jogging; WalkingSpeed = 200.f; @@ -103,6 +108,8 @@ void ACombatCharacter::BeginPlay() ABaseEquippable* SpawnItem = Cast(GetWorld()->SpawnActor(Weapon, &GetActorTransform(), spawnParam)); if (SpawnItem) SpawnItem->OnEquipped(); + + StatsComponent->InitializeStats(); } float ACombatCharacter::TakeDamage(float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) @@ -113,7 +120,7 @@ float ACombatCharacter::TakeDamage(float Damage, FDamageEvent const& DamageEvent { const FPointDamageEvent* PointDamageEvent = static_cast(&DamageEvent); - CharacterTakeDamage(fDamage); + StatsComponent->TakeDamageOnStat(Damage); //Play Sound UGameplayStatics::PlaySoundAtLocation(this, HitSound, PointDamageEvent->HitInfo.Location); @@ -199,7 +206,6 @@ void ACombatCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerIn //LightAttack EnhancedInputComponent->BindAction(LightAttackAction, ETriggerEvent::Triggered, this, &ACombatCharacter::LightChargeAttack); EnhancedInputComponent->BindAction(LightAttackAction, ETriggerEvent::Completed, this, &ACombatCharacter::LightAttack); - //HeavyAttack EnhancedInputComponent->BindAction(HeavyAttackAction, ETriggerEvent::Started, this, &ACombatCharacter::HeavyAttack); @@ -308,7 +314,15 @@ void ACombatCharacter::LightChargeAttack(const FInputActionInstance& Instance) if (bAttackCharged) { if (CanPerformAttack()) + { PerformAttack(ECharacterAction::ChargedAttack, CombatComponent->GetAttackCount()); + ABaseWeapon* pBaseWeapon = CombatComponent->GetMainWeapon(); + if (IsValid(pBaseWeapon)) + { + StatsComponent->ModifyCurrentStatValue(EStats::Stamina, -1.f * pBaseWeapon->GetStatCostForAction()); + } + } + } } @@ -326,7 +340,15 @@ void ACombatCharacter::HeavyAttack(const FInputActionValue& Value) void ACombatCharacter::Dodge(const FInputActionValue& Value) { if (CanPerformDodge()) + { PerformDodge(); + ABaseWeapon* pBaseWeapon = CombatComponent->GetMainWeapon(); + if (IsValid(pBaseWeapon)) + { + StatsComponent->ModifyCurrentStatValue(EStats::Stamina, -1.f * pBaseWeapon->GetStatCostForAction()); + } + } + } void ACombatCharacter::ToggleWalk(const FInputActionValue& Value) @@ -340,13 +362,18 @@ void ACombatCharacter::ToggleWalk(const FInputActionValue& Value) void ACombatCharacter::StartSprint(const FInputActionValue& Value) { - SetMovementSpeedMode(EMovementSpeedMode::Sprinting); + if (CanPerformSprint()) + { + SetMovementSpeedMode(EMovementSpeedMode::Sprinting); + UWorld* World = GEngine->GetWorldFromContextObjectChecked(this); + if (World) + World->GetTimerManager().SetTimer(StaminaTimerHandle, this, &ACombatCharacter::SprintStaminaCost, 0.1f, true); + } } void ACombatCharacter::StopSprint(const FInputActionValue& Value) { - if (GetMovementSpeedMode() == EMovementSpeedMode::Sprinting) - SetMovementSpeedMode(EMovementSpeedMode::Jogging); + DisableSprint(); } void ACombatCharacter::CharacterStateBegin(ECharacterState CharState) @@ -450,6 +477,14 @@ void ACombatCharacter::CharacterActionEnd(ECharacterAction CharAction) } } +void ACombatCharacter::CharacterCurrentStatValueUpdated(EStats statType, float value) +{ + if (!(statType == EStats::Health) || value > 0.f) + return; + + StateManagerComponent->SetCurrentState(ECharacterState::Dead); +} + void ACombatCharacter::ToggleCombatEvent() { ABaseWeapon* baseWeapon = CombatComponent->GetMainWeapon(); @@ -471,20 +506,15 @@ void ACombatCharacter::AttackEvent() return; if (CombatComponent->GetCombatEnabled()) + { PerformAttack(GetDesiredAttackType(), CombatComponent->GetAttackCount()); + if (IsValid(CombatComponent->GetMainWeapon())) + StatsComponent->ModifyCurrentStatValue(EStats::Stamina, -1.f * CombatComponent->GetMainWeapon()->GetStatCostForAction()); + } else ToggleCombatEvent(); } -void ACombatCharacter::CharacterTakeDamage(float InDamage) -{ - float tmp = Health - InDamage; - Health = UKismetMathLibrary::Clamp(tmp, 0, Health); - - if (Health <= 0) - StateManagerComponent->SetCurrentState(ECharacterState::Dead); -} - void ACombatCharacter::ApplyHitReactionPhysicsVelocity(float InitialSpeed) { if (!GetMesh()) @@ -540,6 +570,32 @@ bool ACombatCharacter::ResetChargeAttack() return true; } +void ACombatCharacter::DisableSprint() +{ + UWorld* World = GEngine->GetWorldFromContextObjectChecked(this); + if (World) + World->GetTimerManager().ClearTimer(StaminaTimerHandle); + + if (GetMovementSpeedMode() == EMovementSpeedMode::Sprinting) + SetMovementSpeedMode(EMovementSpeedMode::Jogging); +} + +void ACombatCharacter::SprintStaminaCost() +{ + if (!CanPerformSprint()) + { + DisableSprint(); + return; + } + + StatsComponent->ModifyCurrentStatValue(EStats::Stamina, -2.f); + if (StatsComponent->GetCurrentStatValue(EStats::Stamina) < 10.f) + { + DisableSprint(); + return; + } +} + void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIndex) { ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); @@ -677,6 +733,8 @@ bool ACombatCharacter::CanPerformAttack() ECharacterState::GeneralActionState }; ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + ReturnValue &= (StatsComponent->GetCurrentStatValue(EStats::Stamina) >= 10.f); + return ReturnValue; } @@ -691,6 +749,7 @@ bool ACombatCharacter::CanPerformDodge() }; ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); ReturnValue &= !GetCharacterMovement()->IsFalling(); + ReturnValue &= (StatsComponent->GetCurrentStatValue(EStats::Stamina) >= 10.f); return ReturnValue; } @@ -718,6 +777,11 @@ bool ACombatCharacter::CanReceiveHitReaction() return ReturnValue; } +bool ACombatCharacter::CanPerformSprint() +{ + return (FMath::IsNearlyEqual(GetVelocity().Length(), 0.f)) == false; +} + ECharacterAction ACombatCharacter::GetDesiredAttackType() { if (GetCharacterMovement()->IsFalling()) diff --git a/Source/D1/CombatCharacter.h b/Source/D1/CombatCharacter.h index 96cde647..37d2eed3 100644 --- a/Source/D1/CombatCharacter.h +++ b/Source/D1/CombatCharacter.h @@ -8,6 +8,7 @@ #include "InputAction.h" #include "Interface/CombatInterface.h" #include "Components/StateManagerComponent.h" +#include "Components/StatsComponent.h" #include "Definitions/GameEnums.h" #include "CombatCharacter.generated.h" @@ -119,16 +120,18 @@ private://Delegate void CharacterStateEnd(ECharacterState CharState); void CharacterActionBegin(ECharacterAction CharAction); void CharacterActionEnd(ECharacterAction CharAction); + void CharacterCurrentStatValueUpdated(EStats statType, float value); private: void ToggleCombatEvent(); void AttackEvent(); - void CharacterTakeDamage(float InDamage); void ApplyHitReactionPhysicsVelocity(float InitialSpeed); void EnableRagdoll(); void SetMovementSpeedMode(EMovementSpeedMode NewSpeedMode); FORCEINLINE EMovementSpeedMode GetMovementSpeedMode() const { return MovementSpeedMode; } bool ResetChargeAttack(); + void DisableSprint(); + void SprintStaminaCost(); private: void PerformAttack(ECharacterAction attackType, int32 attackIndex); @@ -142,13 +145,17 @@ private: bool CanPerformDodge(); bool CanJumping(); bool CanReceiveHitReaction(); + bool CanPerformSprint(); ECharacterAction GetDesiredAttackType(); public: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true")) TObjectPtr CombatComponent; UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true")) - TObjectPtr StateManagerComponent; + TObjectPtr StateManagerComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true")) + TObjectPtr StatsComponent; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Weapon", meta = (AllowPrivateAccess = "true")) TSubclassOf Weapon; @@ -180,6 +187,9 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats", meta = (AllowPrivateAccess = "true")) float Health; +private: + FTimerHandle StaminaTimerHandle; + private: bool IsHeavyAttack; float AttackHeldTime; diff --git a/Source/D1/Components/StatsComponent.cpp b/Source/D1/Components/StatsComponent.cpp index 579fffbc..182ac2c7 100644 --- a/Source/D1/Components/StatsComponent.cpp +++ b/Source/D1/Components/StatsComponent.cpp @@ -13,6 +13,7 @@ UStatsComponent::UStatsComponent() PrimaryComponentTick.bCanEverTick = true; // ... + StaminaRegenRate = 2.f; } @@ -70,9 +71,9 @@ void UStatsComponent::TakeDamageOnStat(float inDamage) float armor = GetCurrentStatValue(EStats::Armor); calDamage = (inDamage / (inDamage + armor)) * inDamage; calDamage = FMath::Clamp(calDamage, 0.f, calDamage); - ModifyCurrentStatValue(EStats::Health, -calDamage); + ModifyCurrentStatValue(EStats::Health, -calDamage, false); - FString debugStr = FString::Printf(TEXT("Damage : %d"), calDamage); + FString debugStr = FString::Printf(TEXT("Damage : %f"), calDamage); GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, debugStr); if (GetCurrentStatValue(EStats::Health) <= 0.f) @@ -109,12 +110,20 @@ void UStatsComponent::StartRegen(EStats statType) void UStatsComponent::RegenerateStamina() { - //TODO : ¿©±âºÎÅÍ ½ÃÀÛ + float curStamina = StaminaRegenRate + GetCurrentStatValue(EStats::Stamina); + curStamina = FMath::Clamp(curStamina, 0.f, GetMaxStatValue(EStats::Stamina)); + SetCurrentStatValue(EStats::Stamina, curStamina); + + if (GetCurrentStatValue(EStats::Stamina) >= GetMaxStatValue(EStats::Stamina)) + { + UWorld* World = GEngine->GetWorldFromContextObjectChecked(this); + if (World) + World->GetTimerManager().ClearTimer(RegenTimerHandle); + } } float UStatsComponent::GetBaseStatValue(EStats stat) { - return BaseStats.Find(stat)->BaseValue; } diff --git a/Source/D1/Components/StatsComponent.h b/Source/D1/Components/StatsComponent.h index 3e0ab4eb..20854780 100644 --- a/Source/D1/Components/StatsComponent.h +++ b/Source/D1/Components/StatsComponent.h @@ -24,7 +24,10 @@ struct FBaseStat FBaseStat() : BaseValue(0.f), MaxValue(0.f) {} FBaseStat(float InputBaseValue, float InputMaxValue) : BaseValue(InputBaseValue), MaxValue(InputMaxValue) {} + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseStat, meta = (AllowPrivateAccess = "true")) float BaseValue; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseStat, meta = (AllowPrivateAccess = "true")) float MaxValue; }; @@ -64,14 +67,15 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseStats, meta = (AllowPrivateAccess = "true")) TMap BaseStats; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stats, meta = (AllowPrivateAccess = "true")) - TMap CurrentStats; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = StatRegen, meta = (AllowPrivateAccess = "true")) float StaminaRegenRate; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Stats, meta = (AllowPrivateAccess = "true")) + TMap CurrentStats; + +public: //Delegate + FOnCurrentStatValueUpdated OnCurrentStatValueUpdated; + private: FTimerHandle RegenTimerHandle; -private: - FOnCurrentStatValueUpdated OnCurrentStatValueUpdated; }; diff --git a/Source/D1/UI/UI_StatBar.cpp b/Source/D1/UI/UI_StatBar.cpp new file mode 100644 index 00000000..a3fbd52b --- /dev/null +++ b/Source/D1/UI/UI_StatBar.cpp @@ -0,0 +1,10 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "UI/UI_StatBar.h" +#include "Components/ProgressBar.h" + +void UUI_StatBar::PreConstruct() +{ + +} diff --git a/Source/D1/UI/UI_StatBar.h b/Source/D1/UI/UI_StatBar.h new file mode 100644 index 00000000..aebcebea --- /dev/null +++ b/Source/D1/UI/UI_StatBar.h @@ -0,0 +1,22 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "UI_StatBar.generated.h" + +/** + * + */ +UCLASS() +class D1_API UUI_StatBar : public UUserWidget +{ + + GENERATED_BODY() +protected: + virtual void PreConstruct() override; +public: + UPROPERTY(EditAnywhere, meta = (BindWidget)) + class UProgressBar* StatBar; +};