언리얼 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

+ Recent posts