언리얼 C++ 근접 공격 Input 중복 문제 해결
- 공격 Mongtage 작업 완료 후 공격 모션중 충돌 판정이 필요한 부분에 Collision 작업과 공격당한 상대에게 Damage 판정을 구현 중 이전의 코드 상태면 AnimMontage는 공격 모션이 다 끝나야 다시 시작할 수 있지만 Controller 입력과 Character 의 함수는 계속 호출 됨으로써 COECharacter에 구현할 Collision과 Damage판정에 오류가 생길 가능성을 예방하기 위해 bIsAttacking 값을 만들어 false일때만 공격하게 만들 필요성이 생김
- 처음에는 COECharacter에서 bool bIsAttacking = false인 변수를 public으로 만들고 COEPlayerController에서 인풋이 들어오면 true로 바꾼다음 AnimMontage가 끝날때 OnAttackMontageEnded 함수를 통해 bIsAttacking = fasle로 만들어주려 했으나 계속 true값이 나오는 문제가 생겨 AnimNotify를 이용하는 방법을 찾아 아래와 같이 적용함

//COEPlayerController
// COEChar nullptr 검사와 COEChar->GetCharacter()->IsFalling()으로 공중에있는지 이미 공격 중인지 체크
if (!IsValid(COEChar) || COEChar->GetCharacterMovement()->IsFalling())
{
UE_LOG(LogTemp, Log, TEXT("COEChar == nullptr && bIsFalling == true"));
return;
}
// 공격중이라면 입력 X
if (COEChar->bIsAttacking)
{
UE_LOG(LogTemp, Log, TEXT("bIsAttacking == true"));
return;
}
// 문제없을 시 COECharacter의 DefaultAttack() 실행
COEChar->DefaultAttack();
COEChar->bIsAttacking = true;
//COEAnimInstance
//공격이 끝나면 bIsAttacking = false
UFUNCTION(BlueprintCallable, Category = "Animation")
void AnimNotify_End();
//공격모션 중 타격 타이밍에 Collision 생성
UFUNCTION(BlueprintCallable, Category = "Animation")
void AnimNotify_DoDefaultAttack();
void UCOEAnimInstance::AnimNotify_End()
{
Character->bIsAttacking = false;
UE_LOG(LogTemp, Log, TEXT("bIsAttacking == false"));
}
void UCOEAnimInstance::AnimNotify_DoDefaultAttack()
{
Character->DoDefaultAttck();
UE_LOG(LogTemp, Log, TEXT("DoDefaultAttack"));
}
→ 위와 같은 수정으로 AttackMontage가 끝나야만 공격 Input을 받을 수 있게 변경
'일 > 포트폴리오' 카테고리의 다른 글
| 포트폴리오 log #6 (0) | 2025.08.05 |
|---|---|
| 포트폴리오 log #5 (2) | 2025.07.31 |
| 포트폴리오 log #4 (4) | 2025.07.17 |
| 포트폴리오 log #3 (0) | 2025.07.16 |
| 포트폴리오 log #1 (0) | 2025.07.11 |
