From 7838da179b39aed5cee408e6eb3a48dd28b8248e Mon Sep 17 00:00:00 2001 From: "PCYPC\\pcy35" Date: Fri, 18 Aug 2023 21:25:29 +0900 Subject: [PATCH] =?UTF-8?q?[=EB=B0=95=EC=B9=98=EC=98=81]=20State=20?= =?UTF-8?q?=EB=B0=8F=20Action=20Enum=EC=9D=84=20GameplayTag=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Config/DefaultEngine.ini | 1 + Source/D1/Actor/BaseWeapon.cpp | 60 ++-- Source/D1/Actor/BaseWeapon.h | 6 +- Source/D1/CombatCharacter.cpp | 271 +++++++++--------- Source/D1/CombatCharacter.h | 14 +- .../D1/Components/StateManagerComponent.cpp | 18 +- Source/D1/Components/StateManagerComponent.h | 50 +--- Source/D1/Components/StatsComponent.cpp | 2 +- Source/D1/D1.Build.cs | 5 +- Source/D1/Definitions/CombatAssetManager.cpp | 22 ++ Source/D1/Definitions/CombatAssetManager.h | 22 ++ Source/D1/Definitions/CombatGameplayTags.cpp | 86 ++++++ Source/D1/Definitions/CombatGameplayTags.h | 34 +++ 13 files changed, 354 insertions(+), 237 deletions(-) create mode 100644 Source/D1/Definitions/CombatAssetManager.cpp create mode 100644 Source/D1/Definitions/CombatAssetManager.h create mode 100644 Source/D1/Definitions/CombatGameplayTags.cpp create mode 100644 Source/D1/Definitions/CombatGameplayTags.h diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index bd3f3d65..81291ada 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -53,6 +53,7 @@ AppliedDefaultGraphicsPerformance=Maximum +ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/D1") +ActiveClassRedirects=(OldClassName="TP_ThirdPersonGameMode",NewClassName="D1GameMode") +ActiveClassRedirects=(OldClassName="TP_ThirdPersonCharacter",NewClassName="D1Character") +AssetManagerClassName=/Script/D1.CombatAssetManager [/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] bEnablePlugin=True diff --git a/Source/D1/Actor/BaseWeapon.cpp b/Source/D1/Actor/BaseWeapon.cpp index e8ebdbc4..fe4af485 100644 --- a/Source/D1/Actor/BaseWeapon.cpp +++ b/Source/D1/Actor/BaseWeapon.cpp @@ -6,6 +6,7 @@ #include "GameFramework/Character.h" #include "Components/CollisionComponent.h" #include "Interface/CombatInterface.h" +#include "Definitions/CombatGameplayTags.h" #include "Kismet/GameplayStatics.h" ABaseWeapon::ABaseWeapon() @@ -21,18 +22,18 @@ ABaseWeapon::ABaseWeapon() CollisionComponent->SetCollisionObjectTypes(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); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack, 10.f); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack, 15.f); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack, 20.f); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack, 10.f); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack, 10.f); + ActionStatCost.Add(FCombatGameplayTags::Get().Character_Action_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); + ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack, 1.f); + ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack, 1.4f); + ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack, 1.5f); + ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack, 1.2f); + ActionDamageMultiplier.Add(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack, 1.2f); } void ABaseWeapon::OnEquipped() @@ -96,41 +97,26 @@ float ABaseWeapon::GetDamage() return outDamage; } -TArray ABaseWeapon::GetActionMontage(ECharacterAction characterAction) +TArray ABaseWeapon::GetActionMontage(FGameplayTag characterAction) { TArray outputArr; - switch (characterAction) - { - case ECharacterAction::Nothing: - break; - case ECharacterAction::GeneralAction: - break; - case ECharacterAction::LightAttack: + + if (FCombatGameplayTags::Get().Character_Action_Attack_LightAttack == characterAction) outputArr = LightAttackMontage; - break; - case ECharacterAction::HeavyAttack: + else if (FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack == characterAction) outputArr = HeavyAttackMontage; - break; - case ECharacterAction::ChargedAttack: + else if (FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack == characterAction) outputArr = ChargedAttackMontage; - break; - case ECharacterAction::FallingAttack: + else if (FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack == characterAction) outputArr = FallingAttackMontage; - break; - case ECharacterAction::SprintAttack: + else if (FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack == characterAction) outputArr = SprintAttackMontage; - break; - case ECharacterAction::Dodge: + else if (FCombatGameplayTags::Get().Character_Action_Dodge == characterAction) outputArr = DodgeMontage; - break; - case ECharacterAction::EnterCombat: + else if (FCombatGameplayTags::Get().Character_Action_EnterCombat == characterAction) outputArr.Add(EnterCombat); - break; - case ECharacterAction::ExitCombat: + else if (FCombatGameplayTags::Get().Character_Action_ExitCombat == characterAction) outputArr.Add(ExitCombat); - break; - default: - break; - } + return outputArr; } diff --git a/Source/D1/Actor/BaseWeapon.h b/Source/D1/Actor/BaseWeapon.h index 30b279a7..98d75e45 100644 --- a/Source/D1/Actor/BaseWeapon.h +++ b/Source/D1/Actor/BaseWeapon.h @@ -35,7 +35,7 @@ public: float GetStatCostForAction(); float GetDamage(); public: - TArray GetActionMontage(ECharacterAction characterAction); + TArray GetActionMontage(FGameplayTag characterAction); protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Initialization") @@ -70,8 +70,8 @@ protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") float Damage; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") - TMap ActionStatCost; + TMap ActionStatCost; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") - TMap ActionDamageMultiplier; + TMap ActionDamageMultiplier; }; diff --git a/Source/D1/CombatCharacter.cpp b/Source/D1/CombatCharacter.cpp index ef460fcc..f88b4345 100644 --- a/Source/D1/CombatCharacter.cpp +++ b/Source/D1/CombatCharacter.cpp @@ -13,6 +13,7 @@ #include "Actor/BaseWeapon.h" #include "Components/CombatComponent.h" #include "Components/StatsComponent.h" +#include "Definitions/CombatGameplayTags.h" #include "Engine/DamageEvents.h" #include "Kismet/KismetSystemLibrary.h" #include "Kismet/KismetMathLibrary.h" @@ -130,7 +131,7 @@ float ACombatCharacter::TakeDamage(float Damage, FDamageEvent const& DamageEvent if (CanReceiveHitReaction()) { - StateManagerComponent->SetCurrentState(ECharacterState::Disable); + StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Disable); //Play Animation PlayAnimMontage(HitMontage); @@ -144,8 +145,8 @@ void ACombatCharacter::ContinueAttack_Implementation() if (CombatComponent->GetIsAttackSaved()) { CombatComponent->SetIsAttackSaved(false); - if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) - StateManagerComponent->SetCurrentState(ECharacterState::Nothing); + if (StateManagerComponent->GetCurrentState() == FCombatGameplayTags::Get().Character_State_Attacking) + StateManagerComponent->SetCurrentState(FGameplayTag::EmptyTag); AttackEvent(); } } @@ -159,7 +160,7 @@ void ACombatCharacter::ResetCombat_Implementation() { CombatComponent->ResetAttack(); StateManagerComponent->ResetState(); - StateManagerComponent->SetCurrentAction(ECharacterAction::Nothing); + StateManagerComponent->SetCurrentAction(FGameplayTag::EmptyTag); } FRotator ACombatCharacter::GetDesiredRotation_Implementation() @@ -174,7 +175,7 @@ FRotator ACombatCharacter::GetDesiredRotation_Implementation() bool ACombatCharacter::CanReceiveDamage_Implementation() { bool result; - result = (StateManagerComponent->GetCurrentState() != ECharacterState::Dead); + result = (StateManagerComponent->GetCurrentState() != FCombatGameplayTags::Get().Character_State_Dead); return result; } @@ -219,6 +220,7 @@ void ACombatCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerIn //Sprint EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Started, this, &ACombatCharacter::StartSprint); EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Completed, this, &ACombatCharacter::StopSprint); + } } @@ -300,7 +302,7 @@ void ACombatCharacter::LightAttack(const FInputActionValue& Value) return; IsHeavyAttack = false; - if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) + if (StateManagerComponent->GetCurrentState() == FCombatGameplayTags::Get().Character_State_Attacking) CombatComponent->SetIsAttackSaved(true); else AttackEvent(); @@ -315,7 +317,7 @@ void ACombatCharacter::LightChargeAttack(const FInputActionInstance& Instance) { if (CanPerformAttack()) { - PerformAttack(ECharacterAction::ChargedAttack, CombatComponent->GetAttackCount()); + PerformAttack(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack, CombatComponent->GetAttackCount()); ABaseWeapon* pBaseWeapon = CombatComponent->GetMainWeapon(); if (IsValid(pBaseWeapon)) { @@ -331,7 +333,7 @@ void ACombatCharacter::HeavyAttack(const FInputActionValue& Value) if (bAttackCharged) return; IsHeavyAttack = true; - if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) + if (StateManagerComponent->GetCurrentState() == FCombatGameplayTags::Get().Character_State_Attacking) CombatComponent->SetIsAttackSaved(true); else AttackEvent(); @@ -376,105 +378,86 @@ void ACombatCharacter::StopSprint(const FInputActionValue& Value) DisableSprint(); } -void ACombatCharacter::CharacterStateBegin(ECharacterState CharState) +void ACombatCharacter::CharacterStateBegin(FGameplayTag CharState) { - switch (CharState) + if (FGameplayTag::EmptyTag == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Attacking == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Dodging == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_GeneralActionState == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Dead == CharState) { - case ECharacterState::Nothing: - break; - case ECharacterState::Attacking: - break; - case ECharacterState::Dodging: - break; - case ECharacterState::GeneralActionState: - break; - case ECharacterState::Dead: PerformDeath(); - break; - case ECharacterState::Disable: - break; - default: - break; } + else if (FCombatGameplayTags::Get().Character_State_Disable == CharState) + {/*None*/} } -void ACombatCharacter::CharacterStateEnd(ECharacterState CharState) +void ACombatCharacter::CharacterStateEnd(FGameplayTag CharState) { - switch (CharState) - { - case ECharacterState::Nothing: - break; - case ECharacterState::Attacking: - break; - case ECharacterState::Dodging: - break; - case ECharacterState::GeneralActionState: - break; - case ECharacterState::Dead: - break; - case ECharacterState::Disable: - break; - default: - break; - } + if (FGameplayTag::EmptyTag == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Attacking == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Dodging == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_GeneralActionState == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Dead == CharState) + {/*None*/} + else if (FCombatGameplayTags::Get().Character_State_Disable == CharState) + {/*None*/} } -void ACombatCharacter::CharacterActionBegin(ECharacterAction CharAction) +void ACombatCharacter::CharacterActionBegin(FGameplayTag CharAction) { - switch (CharAction) - { - case ECharacterAction::Nothing: - break; - case ECharacterAction::GeneralAction: - break; - case ECharacterAction::LightAttack: - break; - case ECharacterAction::HeavyAttack: - break; - case ECharacterAction::ChargedAttack: - break; - case ECharacterAction::FallingAttack: - break; - case ECharacterAction::SprintAttack: - break; - case ECharacterAction::Dodge: - break; - case ECharacterAction::EnterCombat: - break; - case ECharacterAction::ExitCombat: - break; - default: - break; - } + if(FGameplayTag::EmptyTag == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_GeneralAction == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Dodge == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_EnterCombat == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_ExitCombat == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack == CharAction) + {/*None*/ } } -void ACombatCharacter::CharacterActionEnd(ECharacterAction CharAction) +void ACombatCharacter::CharacterActionEnd(FGameplayTag CharAction) { - switch (CharAction) - { - case ECharacterAction::Nothing: - break; - case ECharacterAction::GeneralAction: - break; - case ECharacterAction::LightAttack: - break; - case ECharacterAction::HeavyAttack: - break; - case ECharacterAction::ChargedAttack: - break; - case ECharacterAction::FallingAttack: - break; - case ECharacterAction::SprintAttack: - break; - case ECharacterAction::Dodge: - break; - case ECharacterAction::EnterCombat: - break; - case ECharacterAction::ExitCombat: - break; - default: - break; - } + if(FGameplayTag::EmptyTag == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_GeneralAction == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Dodge == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_EnterCombat == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_ExitCombat == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_LightAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack == CharAction) + {/*None*/ } + else if(FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack == CharAction) + {/*None*/ } } void ACombatCharacter::CharacterCurrentStatValueUpdated(EStats statType, float value) @@ -482,7 +465,7 @@ void ACombatCharacter::CharacterCurrentStatValueUpdated(EStats statType, float v if (!(statType == EStats::Health) || value > 0.f) return; - StateManagerComponent->SetCurrentState(ECharacterState::Dead); + StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Dead); } void ACombatCharacter::ToggleCombatEvent() @@ -495,9 +478,9 @@ void ACombatCharacter::ToggleCombatEvent() return; if (!CombatComponent->GetCombatEnabled()) - PerformAction(ECharacterState::GeneralActionState, ECharacterAction::EnterCombat, 0); + PerformAction(FCombatGameplayTags::Get().Character_State_GeneralActionState, FCombatGameplayTags::Get().Character_Action_EnterCombat, 0); else - PerformAction(ECharacterState::GeneralActionState, ECharacterAction::ExitCombat, 0); + PerformAction(FCombatGameplayTags::Get().Character_State_GeneralActionState, FCombatGameplayTags::Get().Character_Action_ExitCombat, 0); } void ACombatCharacter::AttackEvent() @@ -596,7 +579,7 @@ void ACombatCharacter::SprintStaminaCost() } } -void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIndex) +void ACombatCharacter::PerformAttack(FGameplayTag attackType, int32 attackIndex) { ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); if (!CurrentWeapon) @@ -619,7 +602,7 @@ void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIn } else { - StateManagerComponent->SetCurrentState(ECharacterState::Attacking); + StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Attacking); StateManagerComponent->SetCurrentAction(attackType); PlayAnimMontage(attackMontage); @@ -639,7 +622,7 @@ void ACombatCharacter::PerformDodge() if (!CurrentWeapon) return; int32 montageIndex = 0; - TArray montages = CurrentWeapon->GetActionMontage(ECharacterAction::Dodge); + TArray montages = CurrentWeapon->GetActionMontage(FCombatGameplayTags::Get().Character_Action_Dodge); if (montages.Num() <= montageIndex) montageIndex = 0; if (!montages.IsValidIndex(montageIndex)) @@ -648,8 +631,8 @@ void ACombatCharacter::PerformDodge() UAnimMontage* dodgeMontage = montages[montageIndex]; if (IsValid(dodgeMontage)) { - StateManagerComponent->SetCurrentState(ECharacterState::Dodging); - StateManagerComponent->SetCurrentAction(ECharacterAction::Dodge); + StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Dodging); + StateManagerComponent->SetCurrentAction(FCombatGameplayTags::Get().Character_Action_Dodge); PlayAnimMontage(dodgeMontage); } else @@ -659,7 +642,7 @@ void ACombatCharacter::PerformDodge() } } -bool ACombatCharacter::PerformAction(ECharacterState characterState, ECharacterAction characterAction, int32 montageIndex) +bool ACombatCharacter::PerformAction(FGameplayTag characterState, FGameplayTag characterAction, int32 montageIndex) { ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); if (!CurrentWeapon) @@ -709,15 +692,15 @@ void ACombatCharacter::PerformDeath() bool ACombatCharacter::CanPerformToggleCombat() { bool ReturnValue = true; + + FGameplayTagContainer inputContainer; + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Attacking); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dodging); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dead); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Disable); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_GeneralActionState); - TArray inputArr = { - ECharacterState::Attacking, - ECharacterState::Dodging, - ECharacterState::Dead, - ECharacterState::Disable, - ECharacterState::GeneralActionState - }; - ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); ReturnValue &= !GetCharacterMovement()->IsFalling(); return ReturnValue; } @@ -725,14 +708,15 @@ bool ACombatCharacter::CanPerformToggleCombat() bool ACombatCharacter::CanPerformAttack() { bool ReturnValue = true; - TArray inputArr = { - ECharacterState::Attacking, - ECharacterState::Dodging, - ECharacterState::Dead, - ECharacterState::Disable, - ECharacterState::GeneralActionState - }; - ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + + FGameplayTagContainer inputContainer; + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Attacking); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dodging); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dead); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Disable); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_GeneralActionState); + + ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); ReturnValue &= (StatsComponent->GetCurrentStatValue(EStats::Stamina) >= 10.f); return ReturnValue; @@ -741,13 +725,14 @@ bool ACombatCharacter::CanPerformAttack() bool ACombatCharacter::CanPerformDodge() { bool ReturnValue = true; - TArray inputArr = { - ECharacterState::Dodging, - ECharacterState::Dead, - ECharacterState::Disable, - ECharacterState::GeneralActionState - }; - ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + + FGameplayTagContainer inputContainer; + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dodging); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dead); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Disable); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_GeneralActionState); + + ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); ReturnValue &= !GetCharacterMovement()->IsFalling(); ReturnValue &= (StatsComponent->GetCurrentStatValue(EStats::Stamina) >= 10.f); return ReturnValue; @@ -756,13 +741,14 @@ bool ACombatCharacter::CanPerformDodge() bool ACombatCharacter::CanJumping() { bool ReturnValue = true; - TArray inputArr = { - ECharacterState::Dodging, - ECharacterState::Dead, - ECharacterState::Disable, - ECharacterState::GeneralActionState - }; - ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + + FGameplayTagContainer inputContainer; + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dodging); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dead); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Disable); + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_GeneralActionState); + + ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); ReturnValue &= !GetCharacterMovement()->IsFalling(); return ReturnValue; } @@ -770,10 +756,11 @@ bool ACombatCharacter::CanJumping() bool ACombatCharacter::CanReceiveHitReaction() { bool ReturnValue = true; - TArray inputArr = { - ECharacterState::Dead, - }; - ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputArr); + + FGameplayTagContainer inputContainer; + inputContainer.AddTag(FCombatGameplayTags::Get().Character_State_Dead); + + ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); return ReturnValue; } @@ -782,18 +769,18 @@ bool ACombatCharacter::CanPerformSprint() return (FMath::IsNearlyEqual(GetVelocity().Length(), 0.f)) == false; } -ECharacterAction ACombatCharacter::GetDesiredAttackType() +FGameplayTag ACombatCharacter::GetDesiredAttackType() { if (GetCharacterMovement()->IsFalling()) - return ECharacterAction::FallingAttack; + return FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack; if (GetMovementSpeedMode() == EMovementSpeedMode::Sprinting) - return ECharacterAction::SprintAttack; + return FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack; if (IsHeavyAttack) - return ECharacterAction::HeavyAttack; + return FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack; - return ECharacterAction::LightAttack; + return FCombatGameplayTags::Get().Character_Action_Attack_LightAttack; } diff --git a/Source/D1/CombatCharacter.h b/Source/D1/CombatCharacter.h index 17a2b191..aab44971 100644 --- a/Source/D1/CombatCharacter.h +++ b/Source/D1/CombatCharacter.h @@ -116,10 +116,10 @@ protected: void StopSprint(const FInputActionValue& Value); private://Delegate - void CharacterStateBegin(ECharacterState CharState); - void CharacterStateEnd(ECharacterState CharState); - void CharacterActionBegin(ECharacterAction CharAction); - void CharacterActionEnd(ECharacterAction CharAction); + void CharacterStateBegin(FGameplayTag CharState); + void CharacterStateEnd(FGameplayTag CharState); + void CharacterActionBegin(FGameplayTag CharAction); + void CharacterActionEnd(FGameplayTag CharAction); void CharacterCurrentStatValueUpdated(EStats statType, float value); private: @@ -134,9 +134,9 @@ private: void SprintStaminaCost(); private: - void PerformAttack(ECharacterAction attackType, int32 attackIndex); + void PerformAttack(FGameplayTag attackType, int32 attackIndex); void PerformDodge(); - bool PerformAction(ECharacterState characterState, ECharacterAction characterAction, int32 montageIndex); + bool PerformAction(FGameplayTag characterState, FGameplayTag characterAction, int32 montageIndex); void PerformDeath(); protected: @@ -146,7 +146,7 @@ protected: bool CanJumping(); bool CanReceiveHitReaction(); bool CanPerformSprint(); - ECharacterAction GetDesiredAttackType(); + FGameplayTag GetDesiredAttackType(); public: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true")) TObjectPtr CombatComponent; diff --git a/Source/D1/Components/StateManagerComponent.cpp b/Source/D1/Components/StateManagerComponent.cpp index b6e0af0b..d3a0bd41 100644 --- a/Source/D1/Components/StateManagerComponent.cpp +++ b/Source/D1/Components/StateManagerComponent.cpp @@ -32,7 +32,7 @@ void UStateManagerComponent::TickComponent(float DeltaTime, ELevelTick TickType, // ... } -void UStateManagerComponent::SetCurrentState(ECharacterState NewState) +void UStateManagerComponent::SetCurrentState(FGameplayTag NewState) { if (NewState != CurrentState) { @@ -42,22 +42,22 @@ void UStateManagerComponent::SetCurrentState(ECharacterState NewState) } } -ECharacterState UStateManagerComponent::GetCurrentState() +FGameplayTag UStateManagerComponent::GetCurrentState() { return CurrentState; } void UStateManagerComponent::ResetState() { - CurrentState = ECharacterState::Nothing; + CurrentState = FGameplayTag::EmptyTag; } -bool UStateManagerComponent::IsCurrentStateEqualToAny(TArray StatesToCheck) +bool UStateManagerComponent::IsCurrentStateEqualToAny(FGameplayTagContainer StatesToCheck) { - return StatesToCheck.Contains(CurrentState); + return StatesToCheck.HasTagExact(CurrentState); } -void UStateManagerComponent::SetCurrentAction(ECharacterAction NewAction) +void UStateManagerComponent::SetCurrentAction(FGameplayTag NewAction) { if (CurrentAction != NewAction) { @@ -67,12 +67,12 @@ void UStateManagerComponent::SetCurrentAction(ECharacterAction NewAction) } } -ECharacterAction UStateManagerComponent::GetCurrentAction() +FGameplayTag UStateManagerComponent::GetCurrentAction() { return CurrentAction; } -bool UStateManagerComponent::IsCurrentActionEqualToAny(TArray ActionToCheck) +bool UStateManagerComponent::IsCurrentActionEqualToAny(FGameplayTagContainer ActionToCheck) { - return ActionToCheck.Contains(CurrentAction); + return ActionToCheck.HasTagExact(CurrentAction); } \ No newline at end of file diff --git a/Source/D1/Components/StateManagerComponent.h b/Source/D1/Components/StateManagerComponent.h index 12f952dd..a5b5fb86 100644 --- a/Source/D1/Components/StateManagerComponent.h +++ b/Source/D1/Components/StateManagerComponent.h @@ -4,38 +4,14 @@ #include "CoreMinimal.h" #include "Components/ActorComponent.h" +#include "Definitions/CombatGameplayTags.h" #include "StateManagerComponent.generated.h" -UENUM(BlueprintType) -enum class ECharacterState : uint8 -{ - Nothing UMETA(DisplayName = "Nothing"), - Attacking UMETA(DisplayName = "Attacking"), - Dodging UMETA(DisplayName = "Dodging"), - GeneralActionState UMETA(DisplayName = "GeneralActionState"), - Dead UMETA(DisplayName = "Dead"), - Disable UMETA(DisplayName = "Disable") -}; -UENUM(BlueprintType) -enum class ECharacterAction : uint8 -{ - Nothing UMETA(DisplayName = "Nothing"), - GeneralAction UMETA(DisplayName = "GeneralAction"), - LightAttack UMETA(DisplayName = "LightAttack"), - HeavyAttack UMETA(DisplayName = "HeavyAttack"), - ChargedAttack UMETA(DisplayName = "ChargedAttack"), - FallingAttack UMETA(DisplayName = "FallingAttack"), - SprintAttack UMETA(DisplayName = "SprintAttack"), - Dodge UMETA(DisplayName = "Dodge"), - EnterCombat UMETA(DisplayName = "EnterCombat"), - ExitCombat UMETA(DisplayName = "ExitCombat"), -}; - -DECLARE_MULTICAST_DELEGATE_OneParam(FStateBegin, ECharacterState); -DECLARE_MULTICAST_DELEGATE_OneParam(FStateEnd, ECharacterState); -DECLARE_MULTICAST_DELEGATE_OneParam(FActionBegin, ECharacterAction); -DECLARE_MULTICAST_DELEGATE_OneParam(FActionEnd, ECharacterAction); +DECLARE_MULTICAST_DELEGATE_OneParam(FStateBegin, FGameplayTag); +DECLARE_MULTICAST_DELEGATE_OneParam(FStateEnd, FGameplayTag); +DECLARE_MULTICAST_DELEGATE_OneParam(FActionBegin, FGameplayTag); +DECLARE_MULTICAST_DELEGATE_OneParam(FActionEnd, FGameplayTag); UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class D1_API UStateManagerComponent : public UActorComponent @@ -55,14 +31,14 @@ public: virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; public: - void SetCurrentState(ECharacterState NewState); - ECharacterState GetCurrentState(); + void SetCurrentState(FGameplayTag NewState); + FGameplayTag GetCurrentState(); void ResetState(); - bool IsCurrentStateEqualToAny(TArray StatesToCheck); + bool IsCurrentStateEqualToAny(FGameplayTagContainer StatesToCheck); - void SetCurrentAction(ECharacterAction NewAction); - ECharacterAction GetCurrentAction(); - bool IsCurrentActionEqualToAny(TArray ActionToCheck); + void SetCurrentAction(FGameplayTag NewAction); + FGameplayTag GetCurrentAction(); + bool IsCurrentActionEqualToAny(FGameplayTagContainer ActionToCheck); public: //Delegate FStateBegin OnStateBegin; @@ -71,6 +47,6 @@ public: //Delegate FActionEnd OnActionEnd; private: - ECharacterState CurrentState; - ECharacterAction CurrentAction; + FGameplayTag CurrentState; + FGameplayTag CurrentAction; }; diff --git a/Source/D1/Components/StatsComponent.cpp b/Source/D1/Components/StatsComponent.cpp index 05c4157f..c5e4e92d 100644 --- a/Source/D1/Components/StatsComponent.cpp +++ b/Source/D1/Components/StatsComponent.cpp @@ -78,7 +78,7 @@ void UStatsComponent::TakeDamageOnStat(float inDamage) GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, debugStr); if (GetCurrentStatValue(EStats::Health) <= 0.f) - GetOwner()->GetComponentByClass()->SetCurrentState(ECharacterState::Dead); + GetOwner()->GetComponentByClass()->SetCurrentState(FCombatGameplayTags::Get().Character_State_Dead); } void UStatsComponent::StartRegen(EStats statType) diff --git a/Source/D1/D1.Build.cs b/Source/D1/D1.Build.cs index 35505f8d..d6ce492c 100644 --- a/Source/D1/D1.Build.cs +++ b/Source/D1/D1.Build.cs @@ -8,7 +8,10 @@ public class D1 : ModuleRules { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput" }); + PublicDependencyModuleNames.AddRange(new string[] { + "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", + "EnhancedInput", "GameplayTags" + }); PublicIncludePaths.AddRange(new string[] { "D1" }); } diff --git a/Source/D1/Definitions/CombatAssetManager.cpp b/Source/D1/Definitions/CombatAssetManager.cpp new file mode 100644 index 00000000..e4b3af20 --- /dev/null +++ b/Source/D1/Definitions/CombatAssetManager.cpp @@ -0,0 +1,22 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Definitions/CombatAssetManager.h" +#include "Definitions/CombatGameplayTags.h" + +UCombatAssetManager& UCombatAssetManager::Get() +{ + check(GEngine); + + UCombatAssetManager* CombatAssetManager = Cast(GEngine->AssetManager); + return *CombatAssetManager; +} + +void UCombatAssetManager::StartInitialLoading() +{ + Super::StartInitialLoading(); + + //AssetManager¿¡¼­ Singleton ÃʱâÈ­ + //EditorÀÇ Engine General Settings¿¡¼­ ¼³Á¤ º¯°æ ÇÊ¿ä + FCombatGameplayTags::InitializeNativeGameplayTags(); +} diff --git a/Source/D1/Definitions/CombatAssetManager.h b/Source/D1/Definitions/CombatAssetManager.h new file mode 100644 index 00000000..3ce528ef --- /dev/null +++ b/Source/D1/Definitions/CombatAssetManager.h @@ -0,0 +1,22 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/AssetManager.h" +#include "CombatAssetManager.generated.h" + +/** + * + */ +UCLASS() +class D1_API UCombatAssetManager : public UAssetManager +{ + GENERATED_BODY() + +public: + static UCombatAssetManager& Get(); + +protected: + virtual void StartInitialLoading() override; +}; diff --git a/Source/D1/Definitions/CombatGameplayTags.cpp b/Source/D1/Definitions/CombatGameplayTags.cpp new file mode 100644 index 00000000..e81c0c1e --- /dev/null +++ b/Source/D1/Definitions/CombatGameplayTags.cpp @@ -0,0 +1,86 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Definitions/CombatGameplayTags.h" +#include "GameplayTagsManager.h" + +FCombatGameplayTags FCombatGameplayTags::GameplayTags; + +void FCombatGameplayTags::InitializeNativeGameplayTags() +{ + /** + * State + */ + GameplayTags.Character_State_Attacking = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.Attacking"), + FString("State Attacking") + ); + + GameplayTags.Character_State_Dead = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.Dead"), + FString("State Dead") + ); + + GameplayTags.Character_State_Disable = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.Disable"), + FString("State Disable") + ); + + GameplayTags.Character_State_Dodging = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.Dodging"), + FString("State Dodging") + ); + + GameplayTags.Character_State_GeneralActionState = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.GeneralActionState"), + FString("State GeneralActionState") + ); + + /** + * Action + */ + GameplayTags.Character_Action_Dodge = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Dodge"), + FString("Action Dodge") + ); + + GameplayTags.Character_Action_EnterCombat = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.EnterCombat"), + FString("Action EnterCombat") + ); + + GameplayTags.Character_Action_ExitCombat = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.ExitCombat"), + FString("Action ExitCombat") + ); + + GameplayTags.Character_Action_GeneralAction = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.GeneralAction"), + FString("Action GeneralAction") + ); + + GameplayTags.Character_Action_Attack_ChargedAttack = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.ChargedAttack"), + FString("Action Attack ChargedAttack") + ); + + GameplayTags.Character_Action_Attack_FallingAttack = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.FallingAttack"), + FString("Action Attack FallingAttack") + ); + + GameplayTags.Character_Action_Attack_HeavyAttack = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.HeavyAttack"), + FString("Action Attack HeavyAttack") + ); + + GameplayTags.Character_Action_Attack_LightAttack = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.LightAttack"), + FString("Action Attack LightAttack") + ); + + GameplayTags.Character_Action_Attack_SprintAttack = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.SprintAttack"), + FString("Action Attack SprintAttack") + ); +} diff --git a/Source/D1/Definitions/CombatGameplayTags.h b/Source/D1/Definitions/CombatGameplayTags.h new file mode 100644 index 00000000..ed495f47 --- /dev/null +++ b/Source/D1/Definitions/CombatGameplayTags.h @@ -0,0 +1,34 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameplayTagContainer.h" + +struct FCombatGameplayTags +{ +public: + static const FCombatGameplayTags& Get() { return GameplayTags; } + static void InitializeNativeGameplayTags(); + +public: + //State + FGameplayTag Character_State_Attacking; + FGameplayTag Character_State_Dead; + FGameplayTag Character_State_Disable; + FGameplayTag Character_State_Dodging; + FGameplayTag Character_State_GeneralActionState; + + //Action + FGameplayTag Character_Action_Dodge; + FGameplayTag Character_Action_EnterCombat; + FGameplayTag Character_Action_ExitCombat; + FGameplayTag Character_Action_GeneralAction; + FGameplayTag Character_Action_Attack_ChargedAttack; + FGameplayTag Character_Action_Attack_FallingAttack; + FGameplayTag Character_Action_Attack_HeavyAttack; + FGameplayTag Character_Action_Attack_LightAttack; + FGameplayTag Character_Action_Attack_SprintAttack; +private: + static FCombatGameplayTags GameplayTags; +}; \ No newline at end of file