From b83ca133ca53122a5526bb8831be29acd642a4d2 Mon Sep 17 00:00:00 2001 From: pcyoung Date: Sun, 6 Aug 2023 19:38:31 +0900 Subject: [PATCH] =?UTF-8?q?[=EB=B0=95=EC=B9=98=EC=98=81]=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=EB=B0=8F=20=EC=83=81=ED=83=9C=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Blueprints/Actor/BP_ToughSword.uasset | Bin 31761 -> 31804 bytes .../Blueprints/BP_CombatCharacter.uasset | Bin 42892 -> 35918 bytes .../7/YS/ZFVZV5RGVXFDJDFNO8TVNW.uasset | Bin 6249 -> 6520 bytes Source/D1/Actor/BaseWeapon.cpp | 39 ++++ Source/D1/Actor/BaseWeapon.h | 17 +- Source/D1/CombatCharacter.cpp | 179 +++++++++++++++--- Source/D1/CombatCharacter.h | 13 +- .../D1/Components/StateManagerComponent.cpp | 22 ++- Source/D1/Components/StateManagerComponent.h | 27 ++- 9 files changed, 259 insertions(+), 38 deletions(-) diff --git a/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset b/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset index d8ac7fb7efe3f2a28ecf7e175e87e9b0703deb8b..0ba055ff3777a91984ac279809f6bb6e4e3a97ba 100644 GIT binary patch delta 7290 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 AM*si- delta 7393 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 Q<+MU^>tfo|J9c>N*XP@bD>)Y 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 literal 42892 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 diff --git a/Content/__ExternalActors__/Maps/ThirdPersonMap/7/YS/ZFVZV5RGVXFDJDFNO8TVNW.uasset b/Content/__ExternalActors__/Maps/ThirdPersonMap/7/YS/ZFVZV5RGVXFDJDFNO8TVNW.uasset index 7da89d1a2a6698387eba096edfb9d83f1ea04798..1758e1044b7ac046107e3f32cb2c3e2361e703dd 100644 GIT binary patch delta 1342 zcmZ{k+fNfw5Qoq9qV!&*-ChW2DYQWYgt$}2bWGk|(+(Il zcX<~vbvxo~&tIR$v%-dH=i_+e073ME#ssQ1 zbdD*L-rE9B@|Cf99;0eG?>)xQWp^FfjQxEq)h3kDr` zgc_)HUcu{4=TVq<*@aqsIhEiQtH^@`Vy93CH^f@ZxF;^*b<%ZE@WXWEoJAXLm{s`w< z(;us5G(zBQ^|1}H7$IGRkOLB4D0i)p(6{v#RYGJ`1{6Yc(?!T*7xxe{tQHT~pPsrt zJazHG(T7)l&W*iDy&C`aeQIQ4Q|z|fJUwys^&~|O&(j4@XwT;J7`dCLE0fc_i-;dU>9$0xS9EVMt~$s#s|Ybjx*IgR`oi7jgrD|mdST>jNy z9=a9gUfFgY5_abO3&q-d;g(zjL3@yoD-kUgAfM3FDfHE<8N$b((i&Ff!H~U9F4Z;Q zW`&iluyS^DW%3@8y8!(*bDdx)3JfY6<^96*1*o05m#{|x5dN2&;Ju>LC4E+eC zd?stmd01*>raJ44&<+T>G|6BPb#+4AsnS-sjKGB=gQrZoRCwp|NLJkp8dMFx4ZB#z z?)Zp#mwc%fJnJB<_C&uTf(GG#hqDTJKI7qbIhGR`=RVUieeSqrJzv11J{|5b1?~H60q=4B P2t=6*OZq-I=#TsXrK;~J diff --git a/Source/D1/Actor/BaseWeapon.cpp b/Source/D1/Actor/BaseWeapon.cpp index 40b1844d..467781d5 100644 --- a/Source/D1/Actor/BaseWeapon.cpp +++ b/Source/D1/Actor/BaseWeapon.cpp @@ -61,3 +61,42 @@ void ABaseWeapon::SimulateWeaponPhysics() GetItemMesh()->SetCollisionProfileName(TEXT("PhysicsActor"), true); GetItemMesh()->SetSimulatePhysics(true); } + +TArray ABaseWeapon::GetActionMontage(ECharacterAction characterAction) +{ + TArray outputArr; + switch (characterAction) + { + case ECharacterAction::Nothing: + break; + case ECharacterAction::GeneralAction: + break; + case ECharacterAction::LightAttack: + outputArr = LightAttackMontage; + break; + case ECharacterAction::HeavyAttack: + outputArr = HeavyAttackMontage; + break; + case ECharacterAction::ChargedAttack: + outputArr = ChargedAttackMontage; + break; + case ECharacterAction::FallingAttack: + outputArr = FallingAttackMontage; + break; + case ECharacterAction::SprintAttack: + outputArr = SprintAttackMontage; + break; + case ECharacterAction::Dodge: + outputArr = DodgeMontage; + break; + case ECharacterAction::EnterCombat: + outputArr.Add(EnterCombat); + break; + case ECharacterAction::ExitCombat: + outputArr.Add(ExitCombat); + break; + default: + break; + } + return outputArr; +} diff --git a/Source/D1/Actor/BaseWeapon.h b/Source/D1/Actor/BaseWeapon.h index 19728a60..5c9605e9 100644 --- a/Source/D1/Actor/BaseWeapon.h +++ b/Source/D1/Actor/BaseWeapon.h @@ -6,6 +6,7 @@ #include "Actor/BaseEquippable.h" #include "Enums/CombatType.h" #include "Animation/CombatAnimInstance.h" +#include "Components/StateManagerComponent.h" #include "BaseWeapon.generated.h" /** @@ -32,10 +33,7 @@ public: //Normal void SimulateWeaponPhysics(); public: - FORCEINLINE UAnimMontage* GetEnterCombat() const { return EnterCombat; } - FORCEINLINE UAnimMontage* GetExitCombat() const { return ExitCombat; } - FORCEINLINE TArray& GetAttackMontage() { return AttackMontage; } - FORCEINLINE TArray& GetDodgeMontage() { return DodgeMontage; } + TArray GetActionMontage(ECharacterAction characterAction); protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Initialization") @@ -45,7 +43,6 @@ protected: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components") TObjectPtr CombatComponent; - UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components") TObjectPtr CollisionComponent; @@ -54,9 +51,17 @@ protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") TObjectPtr ExitCombat; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") - TArray> AttackMontage; + TArray> LightAttackMontage; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") TArray> DodgeMontage; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") + TArray> HeavyAttackMontage; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") + TArray> ChargedAttackMontage; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") + TArray> FallingAttackMontage; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") + TArray> SprintAttackMontage; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stat") float Damage; diff --git a/Source/D1/CombatCharacter.cpp b/Source/D1/CombatCharacter.cpp index 2bc2c848..c4239375 100644 --- a/Source/D1/CombatCharacter.cpp +++ b/Source/D1/CombatCharacter.cpp @@ -65,6 +65,8 @@ ACombatCharacter::ACombatCharacter() StateManagerComponent = CreateDefaultSubobject(TEXT("StateManagerComponent")); StateManagerComponent->OnStateBegin.AddUObject(this, &ACombatCharacter::CharacterStateBegin); StateManagerComponent->OnStateEnd.AddUObject(this, &ACombatCharacter::CharacterStateEnd); + StateManagerComponent->OnActionBegin.AddUObject(this, &ACombatCharacter::CharacterActionBegin); + StateManagerComponent->OnActionEnd.AddUObject(this, &ACombatCharacter::CharacterActionEnd); Health = 100.f; PelvisBoneName = TEXT("pelvis"); @@ -111,7 +113,7 @@ float ACombatCharacter::TakeDamage(float Damage, FDamageEvent const& DamageEvent if (CanReceiveHitReaction()) { - StateManagerComponent->SetState(ECharacterState::Disable); + StateManagerComponent->SetCurrentState(ECharacterState::Disable); //Play Animation PlayAnimMontage(HitMontage); @@ -126,7 +128,7 @@ void ACombatCharacter::ContinueAttack_Implementation() { CombatComponent->SetIsAttackSaved(false); if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) - StateManagerComponent->SetState(ECharacterState::Nothing); + StateManagerComponent->SetCurrentState(ECharacterState::Nothing); AttackEvent(); } } @@ -140,7 +142,7 @@ void ACombatCharacter::ResetCombat_Implementation() { CombatComponent->ResetAttack(); StateManagerComponent->ResetState(); - StateManagerComponent->SetState(ECharacterState::Nothing); + StateManagerComponent->SetCurrentAction(ECharacterAction::Nothing); } FRotator ACombatCharacter::GetDesiredRotation_Implementation() @@ -169,7 +171,7 @@ void ACombatCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerIn { //Jumping - EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACombatCharacter::Jumping); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping); //Moving @@ -228,6 +230,17 @@ void ACombatCharacter::Look(const FInputActionValue& Value) } } +void ACombatCharacter::Jumping(const FInputActionValue& Value) +{ + if (!CanJumping()) + return; + + StopAnimMontage(); + StateManagerComponent->ResetState(); + CombatComponent->ResetAttack(); + Super::Jump(); +} + void ACombatCharacter::Interact(const FInputActionValue& Value) { bool bInput = Value.Get(); @@ -310,6 +323,64 @@ void ACombatCharacter::CharacterStateEnd(ECharacterState CharState) } } +void ACombatCharacter::CharacterActionBegin(ECharacterAction 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; + } +} + +void ACombatCharacter::CharacterActionEnd(ECharacterAction 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; + } +} + void ACombatCharacter::ToggleCombatEvent() { ABaseWeapon* baseWeapon = CombatComponent->GetMainWeapon(); @@ -320,9 +391,9 @@ void ACombatCharacter::ToggleCombatEvent() return; if (!CombatComponent->GetCombatEnabled()) - PlayAnimMontage(baseWeapon->GetEnterCombat()); + PerformAction(ECharacterState::GeneralActionState, ECharacterAction::EnterCombat, 0); else - PlayAnimMontage(baseWeapon->GetExitCombat()); + PerformAction(ECharacterState::GeneralActionState, ECharacterAction::ExitCombat, 0); } void ACombatCharacter::AttackEvent() @@ -331,7 +402,7 @@ void ACombatCharacter::AttackEvent() return; if (CombatComponent->GetCombatEnabled()) - PerformAttack(CombatComponent->GetAttackCount()); + PerformAttack(GetDesiredAttackType(), CombatComponent->GetAttackCount()); else ToggleCombatEvent(); } @@ -342,7 +413,7 @@ void ACombatCharacter::CharacterTakeDamage(float InDamage) Health = UKismetMathLibrary::Clamp(tmp, 0, Health); if (Health <= 0) - StateManagerComponent->SetState(ECharacterState::Dead); + StateManagerComponent->SetCurrentState(ECharacterState::Dead); } void ACombatCharacter::ApplyHitReactionPhysicsVelocity(float InitialSpeed) @@ -366,25 +437,40 @@ void ACombatCharacter::EnableRagdoll() GetMesh()->SetAllBodiesBelowPhysicsBlendWeight(PelvisBoneName, 1.f); } -void ACombatCharacter::PerformAttack(int32 attackIndex) +void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIndex) { ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); if (!CurrentWeapon) return; - if (!CurrentWeapon->GetAttackMontage().IsValidIndex(attackIndex)) - return; - UAnimMontage* attackMontage = CurrentWeapon->GetAttackMontage()[attackIndex]; - if(!IsValid(attackMontage)) + + TArray montages = CurrentWeapon->GetActionMontage(attackType); + int32 attackIdx = attackIndex; + + if (montages.Num() <= attackIdx) + attackIdx = 0; + if (!montages.IsValidIndex(attackIdx)) return; - StateManagerComponent->SetState(ECharacterState::Attacking); - PlayAnimMontage(attackMontage); - - int idx = attackIndex + 1; - if (idx > CurrentWeapon->GetAttackMontage().Num()) - idx = 0; + UAnimMontage* attackMontage = montages[attackIdx]; + if (!IsValid(attackMontage)) + { + FString debugStr = FString::Printf(TEXT("Index %d Is NOT VALID!!"), attackIdx); + GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, debugStr); + return; + } + else + { + StateManagerComponent->SetCurrentState(ECharacterState::Attacking); + StateManagerComponent->SetCurrentAction(attackType); - CombatComponent->SetAttackCount(idx); + PlayAnimMontage(attackMontage); + + int idx = attackIdx + 1; + if (idx > montages.Num()) + idx = 0; + + CombatComponent->SetAttackCount(idx); + } } //ÀÎÀÚ°ªÀº ³ªÁß¿¡ ÇÊ¿äÇϸé Ãß°¡ PerformDodge(int32 dodgeIndex) @@ -394,22 +480,53 @@ void ACombatCharacter::PerformDodge() if (!CurrentWeapon) return; int32 montageIndex = 0; - TArray montages = CurrentWeapon->GetDodgeMontage(); - if (montages.Num() > montageIndex) + TArray montages = CurrentWeapon->GetActionMontage(ECharacterAction::Dodge); + if (montages.Num() <= montageIndex) montageIndex = 0; if (!montages.IsValidIndex(montageIndex)) return; - UAnimMontage* dodgeMontage = CurrentWeapon->GetDodgeMontage()[montageIndex]; + UAnimMontage* dodgeMontage = montages[montageIndex]; if (IsValid(dodgeMontage)) { - StateManagerComponent->SetState(ECharacterState::Dodging); + StateManagerComponent->SetCurrentState(ECharacterState::Dodging); + StateManagerComponent->SetCurrentAction(ECharacterAction::Dodge); PlayAnimMontage(dodgeMontage); } else { FString str = FString::Printf(TEXT("Dodge Index %n is NOT VALID!!"), montageIndex); - GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Blue, str); + GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, str); + } +} + +bool ACombatCharacter::PerformAction(ECharacterState characterState, ECharacterAction characterAction, int32 montageIndex) +{ + ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); + if (!CurrentWeapon) + return false; + + TArray montages = CurrentWeapon->GetActionMontage(characterAction); + int32 montageIdx = montageIndex; + + if (montages.Num() <= montageIdx) + montageIdx = 0; + if (!montages.IsValidIndex(montageIdx)) + return false; + + UAnimMontage* actionMontage = montages[montageIdx]; + if (IsValid(actionMontage)) + { + StateManagerComponent->SetCurrentState(characterState); + StateManagerComponent->SetCurrentAction(characterAction); + PlayAnimMontage(actionMontage); + return true; + } + else + { + FString str = FString::Printf(TEXT("Dodge Index %n is NOT VALID!!"), montageIdx); + GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, str); + return false; } } @@ -498,5 +615,17 @@ bool ACombatCharacter::CanReceiveHitReaction() return ReturnValue; } +ECharacterAction ACombatCharacter::GetDesiredAttackType() +{ + if (GetCharacterMovement()->IsFalling()) + return ECharacterAction::FallingAttack; + + //TODO : Movement Speed Mode Ãß°¡ + + //TODO : Heavy Attack Ãß°¡ + + return ECharacterAction::LightAttack; +} + diff --git a/Source/D1/CombatCharacter.h b/Source/D1/CombatCharacter.h index e01f8ac4..1c952a22 100644 --- a/Source/D1/CombatCharacter.h +++ b/Source/D1/CombatCharacter.h @@ -89,14 +89,17 @@ protected: //Input Funcs void Move(const FInputActionValue& Value); void Look(const FInputActionValue& Value); + void Jumping(const FInputActionValue& Value); void Interact(const FInputActionValue& Value); void ToggleCombat(const FInputActionValue& Value); void LightAttack(const FInputActionValue& Value); void Dodge(const FInputActionValue& Value); -private: +private://Delegate void CharacterStateBegin(ECharacterState CharState); void CharacterStateEnd(ECharacterState CharState); + void CharacterActionBegin(ECharacterAction CharAction); + void CharacterActionEnd(ECharacterAction CharAction); private: void ToggleCombatEvent(); @@ -105,17 +108,19 @@ private: void ApplyHitReactionPhysicsVelocity(float InitialSpeed); void EnableRagdoll(); - void PerformAttack(int32 attackIndex); +private: + void PerformAttack(ECharacterAction attackType, int32 attackIndex); void PerformDodge(); - - UFUNCTION(BlueprintCallable) //Àӽà + bool PerformAction(ECharacterState characterState, ECharacterAction characterAction, int32 montageIndex); void PerformDeath(); +private: bool CanPerformToggleCombat(); bool CanPerformAttack(); bool CanPerformDodge(); bool CanJumping(); bool CanReceiveHitReaction(); + ECharacterAction 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 30517cec..b6e0af0b 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::SetState(ECharacterState NewState) +void UStateManagerComponent::SetCurrentState(ECharacterState NewState) { if (NewState != CurrentState) { @@ -55,4 +55,24 @@ void UStateManagerComponent::ResetState() bool UStateManagerComponent::IsCurrentStateEqualToAny(TArray StatesToCheck) { return StatesToCheck.Contains(CurrentState); +} + +void UStateManagerComponent::SetCurrentAction(ECharacterAction NewAction) +{ + if (CurrentAction != NewAction) + { + OnActionEnd.Broadcast(CurrentAction); + CurrentAction = NewAction; + OnActionBegin.Broadcast(CurrentAction); + } +} + +ECharacterAction UStateManagerComponent::GetCurrentAction() +{ + return CurrentAction; +} + +bool UStateManagerComponent::IsCurrentActionEqualToAny(TArray ActionToCheck) +{ + return ActionToCheck.Contains(CurrentAction); } \ No newline at end of file diff --git a/Source/D1/Components/StateManagerComponent.h b/Source/D1/Components/StateManagerComponent.h index fc84abd7..12f952dd 100644 --- a/Source/D1/Components/StateManagerComponent.h +++ b/Source/D1/Components/StateManagerComponent.h @@ -17,8 +17,25 @@ enum class ECharacterState : uint8 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); UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class D1_API UStateManagerComponent : public UActorComponent @@ -38,16 +55,22 @@ public: virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; public: - void SetState(ECharacterState NewState); + void SetCurrentState(ECharacterState NewState); ECharacterState GetCurrentState(); void ResetState(); bool IsCurrentStateEqualToAny(TArray StatesToCheck); + void SetCurrentAction(ECharacterAction NewAction); + ECharacterAction GetCurrentAction(); + bool IsCurrentActionEqualToAny(TArray ActionToCheck); + public: //Delegate FStateBegin OnStateBegin; FStateEnd OnStateEnd; + FActionBegin OnActionBegin; + FActionEnd OnActionEnd; private: ECharacterState CurrentState; - + ECharacterAction CurrentAction; };