[UE5] Level Name에 대해

ChangJin·2024년 11월 20일
0

Unreal Engine5

목록 보기
113/114
post-thumbnail

1. 언리얼 엔진에서 GetWorld()->GetMapName()을 통해 맵 이름을 가져오는 방법

GetWorld()->GetMapName()은 언리얼 엔진에서 매우 자주 사용되는 함수 중 하나입니다. 이 함수는 현재 로드된 맵의 이름을 반환하는데, 특히 여러 레벨을 전환하거나 레벨 데이터를 기반으로 게임 상태를 조작할 때 매우 유용합니다. 하지만 PIE(Play in Editor) 모드에서 이 함수를 사용하면 UEDPIE_0_LevelName처럼 예상치 못한 결과를 얻을 수 있습니다. 이것은 실제 레벨 이름에 UEDPIE_0_라는 접두사가 붙어 반환되기 때문입니다. 이는 멀티플레이어 환경에서 서로 다른 인스턴스를 구분하기 위한 접두사로, 개발 중에는 편리하지만, 실제로 파일 이름이나 맵 이름을 확인하려는 경우 불편할 수 있습니다.

실제 맵 이름을 얻는 방법:

이 문제를 해결하기 위해서는 GetWorld()->StreamingLevelsPrefix.Len() 함수를 사용하여 접두사의 길이를 계산하고 이를 이용해 맵 이름에서 접두사를 제거할 수 있습니다.

FString MapName = GetWorld()->GetMapName();
FString CleanMapName = MapName.Mid(GetWorld()->StreamingLevelsPrefix.Len());
UE_LOG(LogTemp, Log, TEXT("Clean Map Name: %s"), *CleanMapName);

위 코드는 GetMapName()이 반환한 맵 이름에서 접두사를 잘라내고, 실제 맵 이름만 추출하여 CleanMapName 변수에 저장하는 방식입니다. 이 방법은 특히 PIE 모드에서 유용하며, 개발 환경과 실제 게임 환경에서 모두 같은 맵 이름을 사용할 수 있게 해줍니다.

문제점 및 해결:

  • 문제: PIE 모드에서 GetMapName()UEDPIE_0_Level1처럼 접두사를 포함한 이름을 반환하는 문제.
  • 해결: StreamingLevelsPrefix.Len()을 사용하여 접두사를 제거하고 실제 맵 이름을 얻음. 이는 실제 게임에서 필요한 이름을 얻는 데 매우 유용함.

또한, 특정 파일과 관련된 맵 이름을 가져오고자 할 때는 파일의 경로 또는 파일 이름 자체를 활용하여 맵을 로드하거나 확인할 수 있습니다. 맵을 경로 기반으로 불러오는 경우가 많다면 파일 경로를 활용해 더 구체적인 확인을 할 수 있습니다. 예를 들어, FPaths::GetBaseFilename을 사용하면 파일 경로에서 파일 이름만을 추출할 수 있습니다.

FString FullFilePath = "Content/Maps/Level1.umap";
FString MapName = FPaths::GetBaseFilename(FullFilePath);
UE_LOG(LogTemp, Log, TEXT("Map Name from File Path: %s"), *MapName);

이 코드는 파일 경로에서 파일 이름만 추출하고, 이를 맵 이름으로 활용할 수 있게 해줍니다. 이 방식은 맵 파일을 직접적으로 다루고자 할 때 매우 유용하며, 특히 여러 맵 파일을 관리하는 프로젝트에서 효율적으로 사용할 수 있습니다.

접근성을 높이는 방법:

  • 이 방식이 유용하지만, 맵 이름이 아닌 다른 정보도 필요할 때가 있습니다. 맵 이름 외에 맵 경로, 로딩 시간, 메모리 사용량 등 여러 정보를 한꺼번에 가져오고 싶을 때는 UWorld에서 제공하는 다양한 함수를 활용할 수 있습니다.
  • 예를 들어, GetWorld()->PersistentLevel은 현재 로드된 레벨에 대한 더 깊은 정보를 제공하며, 이를 통해 레벨 관련 정보를 더 많이 얻을 수 있습니다.
ULevel* CurrentLevel = GetWorld()->PersistentLevel;
FString LevelName = CurrentLevel->GetName();
UE_LOG(LogTemp, Log, TEXT("Persistent Level Name: %s"), *LevelName);

이 코드에서는 현재 로드된 레벨의 정보를 좀 더 구체적으로 다룰 수 있습니다. 맵 이름뿐만 아니라 맵과 관련된 다른 속성들도 확인할 수 있습니다. 이러한 방식으로 레벨 정보를 처리하면 더욱 구체적인 데이터를 얻어 다양한 목적으로 활용할 수 있습니다.

레벨 간 전환 시 맵 이름 관리:

  • 특히, 여러 맵을 전환하는 게임에서는 맵 이름을 관리하는 것이 중요합니다. 언리얼 엔진의 WorldContext를 활용하여 맵이 전환될 때마다 맵 이름을 추적할 수 있습니다. 이를 통해 맵 간 상태를 유지하거나, 전환 후 데이터를 불러오는 로직을 처리할 수 있습니다.
FWorldContext* WorldContext = GEngine->GetWorldContextFromWorld(GetWorld());
if (WorldContext)
{
    FString CurrentMapName = WorldContext->CurrentWorld()->GetMapName();
    UE_LOG(LogTemp, Log, TEXT("Current Map Name: %s"), *CurrentMapName);
}

이 방식은 특히 여러 개의 맵을 사용하는 프로젝트에서 매우 유용합니다. WorldContext를 통해 현재 맵의 상태나 이름을 더 구체적으로 다룰 수 있으며, 맵이 전환될 때의 로직도 쉽게 처리할 수 있습니다.

맵 이름을 기반으로 데이터 관리:

  • 게임 내에서 맵 이름을 기반으로 데이터를 불러오거나 저장해야 할 경우도 있습니다. 예를 들어, 특정 맵에서만 로드해야 하는 데이터가 있다면 맵 이름을 기준으로 데이터를 관리할 수 있습니다. 이때는 TMap<FString, UDataTable*> 같은 자료구조를 이용해 맵 이름과 관련 데이터를 쉽게 매핑할 수 있습니다.
TMap<FString, UDataTable*> MapToDataTable;
UDataTable* DataTable = MapToDataTable.FindRef(CleanMapName);
if (DataTable)
{
    // 데이터 처리
}

맵 이름을 키로 사용하여 맵에 맞는 데이터를 가져오는 방식은 특히 데이터 중심의 게임에서 많이 사용됩니다. 맵에 따라 다른 설정이나 데이터를 적용해야 할 때 유용하며, 여러 맵을 사용하는 대규모 프로젝트에서도 데이터를 쉽게 관리할 수 있게 해줍니다.

이처럼 GetWorld()->GetMapName()은 단순히 맵 이름을 가져오는 것 이상으로, 맵 이름을 기반으로 데이터를 관리하고 전환하는 데 중요한 역할을 합니다. 이 함수를 효과적으로 활용하면 다양한 게임 시나리오에서 효율적인 맵 전환 및 데이터 처리를 구현할 수 있습니다.

profile
게임 프로그래머

0개의 댓글