[UE5] Lena: Dev Diary #15 - 언리얼 엔진의 오류 해결과 컴파일 에러

ChangJin·2024년 7월 20일
0

Unreal Engine5

목록 보기
84/114
post-thumbnail

이번 포스팅에서는 언리얼 엔진의 다양한 오류와 컴파일 에러, 크래시 문제를 다룹니다. 엔진 실행 시 75%에서 멈추는 문제, 블루프린트 관련 이슈 등을 중점적으로 설명합니다.

목차

  1. 언리얼 엔진 실행 시 75%에서 멈추는 문제
  2. TArray, Empty(), IsEmpty() 로 인한 크래시
  3. EXCEPTION_ACCESS_VIOLATION 오류
  4. Git 관련 문제 해결
  5. Lena 모듈을 찾지 못하는 오류

문제 1: 언리얼 엔진 실행 시 75%에서 멈추는 문제

원인:
생성자가 호출되는 시점에 언리얼 엔진이 특정 블루프린트 파일이나 종속성을 로드하는 과정에서 문제가 발생할 수 있습니다. 코드에서 보면 생성자에서 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"

문제 2: 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(); // 배열 비우기
}

문제 3: EXCEPTION_ACCESS_VIOLATION 오류

원인: 주로 널 포인터 참조나 잘못된 메모리 주소에 접근할 때 발생합니다. 현재 프로젝트에서는 플레이어 컨트롤러의 함수에서 문제가 생겼습니다. ShooterPlayerController.cppCheckPickUpItemSweep 함수에서 발생했습니다.

해결 방법: 포인터 접근 전에 항상 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());
                }
            }
        }
    }
}

문제 4: Git 관련 문제 해결

원인:
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

문제 5: Lena 모듈을 찾지 못하는 오류

원인:
언리얼 엔진이 특정 모듈을 찾거나 로드하지 못할 때 발생합니다. 잘 실행되던 프로젝트에서 이 오류가 나오면 너무 당황스럽습니다. json 파일을 만지거나 플러그인을 추가할 때 오류가 날 수 있습니다.

해결 방법:
프로젝트 파일을 정리하고, .uproject 파일을 확인하며, 올바르게 작성한 후에 Visual Studio 프로젝트 파일을 재생성합니다. 인데 perforce 세팅을 해봐야할 것 같습니다.

.uproject 파일 예제:

{
  "Modules": [
    {
      "Name": "Lena",
      "Type": "Runtime",
      "LoadingPhase": "Default"
    }
  ]
}

프로젝트 정리 및 재생성:

rm -rf Intermediate
rm -rf Saved

Visual Studio 프로젝트 파일 재생성:

  • 폴더에서 하는 방법
    .uproject을 마우스 우클릭하고 Generate Visual Studio project files를 클릭하면 됩니다.
인벤토리 위젯
  • 코드로 하는 방법
"C:\Path\To\UnrealEngine\Engine\Binaries\DotNET\UnrealBuildTool.exe" -projectfiles -project="C:\Path\To\YourProject\YourProject.uproject" -game -rocket -progress

이 포스팅을 통해 언리얼 엔진의 다양한 오류와 컴파일 에러를 해결하는 방법을 알게 되셨기를 바랍니다. 도움이 되셨다면, 다음 포스팅도 기대해주세요! 질문이나 피드백은 댓글로 남겨주세요. 감사합니다!

profile
게임 프로그래머

0개의 댓글