diff --git a/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset b/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset index fafee197..21066ece 100644 Binary files a/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset and b/Content/CombatSystem/Blueprints/Actor/BP_ToughSword.uasset differ diff --git a/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset b/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset index b098aa75..63bb7213 100644 Binary files a/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset and b/Content/CombatSystem/Blueprints/BP_CombatCharacter.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/ChargedAttack_Montage.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/ChargedAttack_Montage.uasset new file mode 100644 index 00000000..3d399157 Binary files /dev/null and b/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/ChargedAttack_Montage.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/JumpSlamAttack.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/JumpSlamAttack.uasset index ef38d4a2..f224070d 100644 Binary files a/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/JumpSlamAttack.uasset and b/Content/CombatSystem/CourseFiles/Animations/LightSword/ChargeAttack/JumpSlamAttack.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/FallingAttack/FallingAttack01_Montage.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/FallingAttack/FallingAttack01_Montage.uasset new file mode 100644 index 00000000..09e146a3 Binary files /dev/null and b/Content/CombatSystem/CourseFiles/Animations/LightSword/FallingAttack/FallingAttack01_Montage.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack.uasset index 7c849594..d5e1dfa6 100644 Binary files a/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack.uasset and b/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack_Montage.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack_Montage.uasset new file mode 100644 index 00000000..9f038e4c Binary files /dev/null and b/Content/CombatSystem/CourseFiles/Animations/LightSword/HeavyAttack/HeavyAttack_Montage.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack.uasset index bd343896..1703a650 100644 Binary files a/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack.uasset and b/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack.uasset differ diff --git a/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack_Montage.uasset b/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack_Montage.uasset new file mode 100644 index 00000000..782469e4 Binary files /dev/null and b/Content/CombatSystem/CourseFiles/Animations/LightSword/SprintAttack/SprintAttack_Montage.uasset differ diff --git a/Source/D1/CombatCharacter.cpp b/Source/D1/CombatCharacter.cpp index bb633af3..f87b7603 100644 --- a/Source/D1/CombatCharacter.cpp +++ b/Source/D1/CombatCharacter.cpp @@ -77,6 +77,7 @@ ACombatCharacter::ACombatCharacter() JoggingSpeed = 500.f; SprintSpeed = 700.f; + ChargeAttackTime = 0.18f; Health = 100.f; PelvisBoneName = TEXT("pelvis"); } @@ -196,7 +197,12 @@ void ACombatCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerIn EnhancedInputComponent->BindAction(ToggleCombatAction, ETriggerEvent::Started, this, &ACombatCharacter::ToggleCombat); //LightAttack - EnhancedInputComponent->BindAction(LightAttackAction, ETriggerEvent::Started, this, &ACombatCharacter::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); //Dodge EnhancedInputComponent->BindAction(DodgeAction, ETriggerEvent::Started, this, &ACombatCharacter::Dodge); @@ -284,6 +290,33 @@ void ACombatCharacter::ToggleCombat(const FInputActionValue& Value) void ACombatCharacter::LightAttack(const FInputActionValue& Value) { + if (!ResetChargeAttack()) + return; + IsHeavyAttack = false; + + if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) + CombatComponent->SetIsAttackSaved(true); + else + AttackEvent(); +} + +//´©¸£°í ÀÖ´Â ½Ã°£À» ¹Þ±â À§Çؼ­ FInputActionValue°¡ ¾Æ´Ï¶ó FInputActionInstance·Î ÀÎÀÚ°ªÀ» ¹ÞÀ½ +void ACombatCharacter::LightChargeAttack(const FInputActionInstance& Instance) +{ + AttackHeldTime = Instance.GetElapsedTime(); + bAttackCharged = (AttackHeldTime >= ChargeAttackTime); + if (bAttackCharged) + { + if (CanPerformAttack()) + PerformAttack(ECharacterAction::ChargedAttack, CombatComponent->GetAttackCount()); + } +} + +void ACombatCharacter::HeavyAttack(const FInputActionValue& Value) +{ + if (bAttackCharged) + return; + IsHeavyAttack = true; if (StateManagerComponent->GetCurrentState() == ECharacterState::Attacking) CombatComponent->SetIsAttackSaved(true); else @@ -495,6 +528,18 @@ void ACombatCharacter::SetMovementSpeedMode(EMovementSpeedMode NewSpeedMode) } } +bool ACombatCharacter::ResetChargeAttack() +{ + AttackHeldTime = 0.f; + if (bAttackCharged) + { + bAttackCharged = false; + return false; + } + else + return true; +} + void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIndex) { ABaseWeapon* CurrentWeapon = CombatComponent->GetMainWeapon(); @@ -524,7 +569,7 @@ void ACombatCharacter::PerformAttack(ECharacterAction attackType, int32 attackIn PlayAnimMontage(attackMontage); int idx = attackIdx + 1; - if (idx > montages.Num()) + if (idx >= montages.Num()) idx = 0; CombatComponent->SetAttackCount(idx); @@ -681,7 +726,8 @@ ECharacterAction ACombatCharacter::GetDesiredAttackType() if (GetMovementSpeedMode() == EMovementSpeedMode::Sprinting) return ECharacterAction::SprintAttack; - //TODO : Heavy Attack Ãß°¡ + if (IsHeavyAttack) + return ECharacterAction::HeavyAttack; return ECharacterAction::LightAttack; } diff --git a/Source/D1/CombatCharacter.h b/Source/D1/CombatCharacter.h index 48f4aeff..96cde647 100644 --- a/Source/D1/CombatCharacter.h +++ b/Source/D1/CombatCharacter.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "InputActionValue.h" +#include "InputAction.h" #include "Interface/CombatInterface.h" #include "Components/StateManagerComponent.h" #include "Definitions/GameEnums.h" @@ -51,6 +52,9 @@ class ACombatCharacter : public ACharacter, public ICombatInterface UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) class UInputAction* LightAttackAction; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) + class UInputAction* HeavyAttackAction; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) class UInputAction* DodgeAction; @@ -59,6 +63,9 @@ class ACombatCharacter : public ACharacter, public ICombatInterface UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) class UInputAction* SprintAction; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true")) + float ChargeAttackTime; public: ACombatCharacter(); @@ -100,6 +107,8 @@ protected: void Interact(const FInputActionValue& Value); void ToggleCombat(const FInputActionValue& Value); void LightAttack(const FInputActionValue& Value); + void LightChargeAttack(const FInputActionInstance& Instance); + void HeavyAttack(const FInputActionValue& Value); void Dodge(const FInputActionValue& Value); void ToggleWalk(const FInputActionValue& Value); void StartSprint(const FInputActionValue& Value); @@ -119,6 +128,7 @@ private: void EnableRagdoll(); void SetMovementSpeedMode(EMovementSpeedMode NewSpeedMode); FORCEINLINE EMovementSpeedMode GetMovementSpeedMode() const { return MovementSpeedMode; } + bool ResetChargeAttack(); private: void PerformAttack(ECharacterAction attackType, int32 attackIndex); @@ -166,8 +176,13 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MovementSpeed", meta = (AllowPrivateAccess = "true")) float SprintSpeed; - + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats", meta = (AllowPrivateAccess = "true")) float Health; + +private: + bool IsHeavyAttack; + float AttackHeldTime; + bool bAttackCharged; };