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

언리얼 C++  Character 변수명 오류 및 Cast<자료형>(GetCharacter())오류 해결과 Build 시간 단축

  • 언리얼 포트폴리오 작성 중 샘플C++파일을 수정하면서 모든 Input은 PlayerController쪽 클래스에 몰아넣고 Character클래스 쪽에는 카메라 및 AnimInstance 캐스트 정도만 생성자에 몰아 넣어둔 상태로 개발하였고 매번 빌드때마다 오래걸리는 이슈가 발생하였으나 원인을 찾지못한 상태로 진행
  • PlayerController쪽에 키보드 F클릭시 기본공격(근접)을 받아오고 거기서 Character의 DefaultAttakc() 을 호출해서 Character클래스의 DefaultAttack()을 실행 그 뒤 AnimInstance의 DefaultAttackAnim()으로 AttackAnimMontage를 실행 시켜주는 방식으로 구성
  • 그 상태에서 ACOECharacter* Character 같은 변수선언을 COEPlayerController클래스에서 사용 시 오류가 발생하는것을 발견 이전에도 COEPlayerController에서 GetPawn()과 GetCharacter()를 받을때 Character, Pawn등을 변수명으로 사용하면 문제가 되었기에 혹시나 하는 마음으로 Character는 COEChar 으로 아래와 같이 수정하고 매번 Cast해주던 것을 BeginPlay()에서 한번만 Cast해줬더니 빌드가 오래걸리는 문제와 수정전의 불필요해보이고 지저분했던 코드 문제 해결
if (ACOECharacter* Character = Cast<ACOECharacter>(GetCharacter()))
//처음엔 위 코드로 작성하여 사용할때는 Character변수명에 오류 발생

ACharacter* ControllerCharacter = this->GetCharacter(); //수정전
    if (ControllerCharacter != nullptr) 
//처럼 매번 ControllerCharacter에 this->GetCharacter()를 할당해서 사용하던 코드를  아래처럼 BeginPlay()에서 한번만 Cast해주고
void ACOEPlayerController::BeginPlay()
{
	Super::BeginPlay();

	COEChar = Cast<ACOECharacter>(GetCharacter());
}
	if (IsValid(COEChar)) //수정후
//위 코드로 수정하였더니 코드도 간결해 지고 빌드도 빨라짐
  • 추가로 오늘 작업목표중 근접공격 구현에서 아래와 같이 코드를 작성했을때 AnimInstance가 null이 되는 문제가 생겨 찾아보니 생성자에서 AnimInstance를 캐스트하면 매시가 생성전이라 제대로 작동하지 않을 수 있다고 하여 아래와 같이 BeginPlay() 에서 캐스트 해주도록 수정
void ACOECharacter::BeginPlay()
{
    Super::BeginPlay();
    //AnimInstance 캐스트
    AnimInstance = Cast<UCOEAnimInstance>(GetMesh()->GetAnimInstance());
}

void ACOECharacter::DefaultAttack()
{
    //AnimInstance가 nullptr이 아니라면 DefaultAttackAnim 실행
    if (IsValid(AnimInstance))
    {
        AnimInstance->DefaultAttackAnim();
    }
    else
    {
        UE_LOG(LogTemp, Log, TEXT("Null"));
    }
    UE_LOG(LogTemp, Log, TEXT("DefaultAttack"));
}

' > 포트폴리오' 카테고리의 다른 글

포트폴리오 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 #2  (0) 2025.07.15

+ Recent posts