이번 포스팅에서는 언리얼 엔진의 다양한 오류와 컴파일 에러, 크래시 문제를 다룹니다. 엔진 실행 시 75%에서 멈추는 문제, 블루프린트 관련 이슈 등을 중점적으로 설명합니다.
TArray
, Empty()
, IsEmpty()
로 인한 크래시EXCEPTION_ACCESS_VIOLATION
오류Lena
모듈을 찾지 못하는 오류원인:
생성자가 호출되는 시점에 언리얼 엔진이 특정 블루프린트 파일이나 종속성을 로드하는 과정에서 문제가 발생할 수 있습니다. 코드에서 보면 생성자에서 WBP_Inventory
라는 위젯 블루프린트를 접근하고 있었습니다. 바로 이것이 75%에서 멈추는 원인이었습니다. Log를 하나하나 읽어보니, UHT에서 문제가 생겼다는 것을 알 수 있었습니다. C++ 코드와 언리얼 엔진의 리플렉션 시스템간의 인터페이스를 만들던 도중 에러가 났다는 것을 확인했습니다.
해결 방법:
생성자에 올바르지 않은 코드를 삭제하고, 해당 기능을 BeginPlay나 PostInitializeComponents 같은 더 적합한 함수에 구현해서 블루프린트 오브젝트를 로드합니다. 그리고 프로젝트 파일을 정리하고, 캐시를 삭제한 후에 블루프린트 종속성을 확인해야합니다.
컴파일이 되고 Fail이 뜬다 | 놀랍게도 10분이상 멈춰있는다 |
AShooterPlayerController::AShooterPlayerController()
{
static ConstructorHelpers::FObjectFinder<UInventoryWidget> InventoryWidgetFinder(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/UI/HUD/WBP_InventoryMain.WBP_InventoryMain'"));
if(InventoryWidgetFinder.Succeeded())
{
InventoryWidget = InventoryWidgetFinder.Object;
}
}
rm -rf Intermediate
rm -rf Saved
프로젝트를 다시 빌드합니다:
"C:\Path\To\UnrealEngine\Engine\Build\BatchFiles\Build.bat" YourProjectNameEditor Win64 Development "C:\Path\To\Your\Project\YourProjectName.uproject"
TArray
, Empty()
, IsEmpty()
로 인한 크래시원인:
Base_Character->GroundItemComponent->Items.Empty();
에서 Items.Empty()
는 배열의 모든 요소를 삭제하지만, 배열의 요소가 AActor 포인터일 경우 배열을 비우기 전에 각 포인터가 유효한지 확인하고 안전하게 파괴하는 것이 중요합니다. 그렇지 않으면 메모리 누수나 참조된 객체가 삭제된 후 접근하려고 시도할 때 크래시가 발생할 수 있습니다.
해결 방법: 배열을 비우기 전에 포인터의 유효성을 확인하고, 유효하지 않은 포인터를 제거하거나, AActor 포인터를 안전하게 파괴합니다.
void UInventoryComponent::ClearItems()
{
for (FInventoryItem& Item : Items)
{
if (Item.ItemActor)
{
Item.ItemActor->Destroy(); // 액터 파괴
Item.ItemActor = nullptr; // 포인터 초기화
}
}
Items.Empty(); // 배열 비우기
}
EXCEPTION_ACCESS_VIOLATION
오류원인: 주로 널 포인터 참조나 잘못된 메모리 주소에 접근할 때 발생합니다. 현재 프로젝트에서는 플레이어 컨트롤러의 함수에서 문제가 생겼습니다. ShooterPlayerController.cpp
의 CheckPickUpItemSweep
함수에서 발생했습니다.
해결 방법: 포인터 접근 전에 항상 nullptr 검사를 수행하고, 충돌 검사 후 결과를 처리하는 부분에서 객체가 유효한지 확인해야합니다. nullptr 검사를 생활화해야합니다!
void AShooterPlayerController::CheckPickUpItemSweep()
{
ABase_Character* PlayerCharacter = Cast<ABase_Character>(GetPawn());
if (!PlayerCharacter)
{
UE_LOG(LogTemp, Warning, TEXT("PlayerCharacter is nullptr"));
return;
}
FVector Start = PlayerCharacter->GetActorLocation();
FVector ForwardVector = PlayerCharacter->GetActorForwardVector();
FVector End = Start + (ForwardVector * 1000.f); // 거리 조정
FCollisionQueryParams CollisionParams;
CollisionParams.AddIgnoredActor(this);
TArray<FHitResult> HitResults;
bool bHit = GetWorld()->SweepMultiByChannel(HitResults, Start, End, FQuat::Identity, ECC_Visibility, FCollisionShape::MakeSphere(50.f), CollisionParams);
if (bHit)
{
for (const FHitResult& Hit : HitResults)
{
if (Hit.GetActor() && Hit.GetActor()->IsA(ABase_Item::StaticClass()))
{
ABase_Item* HitItem = Cast<ABase_Item>(Hit.GetActor());
if (HitItem)
{
PlayerCharacter->PickupItem(HitItem);
UE_LOG(LogTemp, Warning, TEXT("Picked up item: %s"), *HitItem->GetName());
}
}
}
}
}
원인:
Git LFS 데이터 쿼터 초과로 인해 파일을 다운로드할 수 없습니다. 브랜치를 여러 개 만들고 사용하다보니 데이터 쿼터를 초과했습니다. 애셋의 크기가 커지는 만큼 깃 말고 다른 VCS를 찾아봐야 하나 라는 생각이 들었습니다. 최근에 Perforce라는 VCS를 찾았는데 괜찮을 것 같아 다음에 환경 구축을 해보려고 합니다.
해결 방법:
추가 LFS 데이터 팩을 구매하거나, 불필요한 LFS 파일을 제거하고, LFS 파일을 일반 파일로 전환합니다.
LFS 파일을 일반 파일로 전환:
git lfs untrack "*.umap"
git rm --cached *.umap
git add *.umap
git commit -m "Convert umap files from LFS to regular Git"
git push origin main
Lena
모듈을 찾지 못하는 오류원인:
언리얼 엔진이 특정 모듈을 찾거나 로드하지 못할 때 발생합니다. 잘 실행되던 프로젝트에서 이 오류가 나오면 너무 당황스럽습니다. json 파일을 만지거나 플러그인을 추가할 때 오류가 날 수 있습니다.
해결 방법:
프로젝트 파일을 정리하고, .uproject 파일을 확인하며, 올바르게 작성한 후에 Visual Studio 프로젝트 파일을 재생성합니다. 인데 perforce 세팅을 해봐야할 것 같습니다.
{
"Modules": [
{
"Name": "Lena",
"Type": "Runtime",
"LoadingPhase": "Default"
}
]
}
rm -rf Intermediate
rm -rf Saved
Visual Studio 프로젝트 파일 재생성:
인벤토리 위젯 |
"C:\Path\To\UnrealEngine\Engine\Binaries\DotNET\UnrealBuildTool.exe" -projectfiles -project="C:\Path\To\YourProject\YourProject.uproject" -game -rocket -progress
이 포스팅을 통해 언리얼 엔진의 다양한 오류와 컴파일 에러를 해결하는 방법을 알게 되셨기를 바랍니다. 도움이 되셨다면, 다음 포스팅도 기대해주세요! 질문이나 피드백은 댓글로 남겨주세요. 감사합니다!