언리얼 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"));
}