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

ChangJin·2024년 7월 20일
0

Unreal Engine5

목록 보기
84/115
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개의 댓글

관련 채용 정보