본문 바로가기
언리얼5 & C++

언리얼5 C++ | 레벨 열기와 특정 게임모드로 레벨 열기

by 17번 일개미 2024. 2. 16.
728x90

레벨을 여는 방법은 간단하다.

 

UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject", AdvancedDisplay = "2", DisplayName = "Open Level (by Name)"), Category="Game")
static ENGINE_API void OpenLevel(const UObject* WorldContextObject, FName LevelName, bool bAbsolute = true, FString Options = FString(TEXT("")));

 

UGameplayStatics 에 정의된 OpenLevel 함수를 사용하면 된다.

 

 

const UWorld* World = GetWorld();
check(World);
UGameplayStatics::OpenLevel(World, *LevelName);

 

요런식으로 쓸 수 있다.

 

하지만 레벨을 열 때, 특정 게임모드로 지정된 레벨을 열고 싶다면?

 

물론, 코드 없이 하는 간단한 방법도 있다.

 

 

Window - World Settings 에 들어가면 Window 관련 메뉴가 열린다.

게임모드 설정을 원하는 레벨에서

 

GameMode Override 를 원하는 BP 혹은 C++ 클래스로 설정하면 해당 레벨은 그 게임모드로 열리게 된다.


하지만 모두 C++ 로 하고 싶다 라면 아래 방법으로 가능하다.


FString Options = FString(TEXT("")

 

 

OpenLevel 함수의 마지막 인자를 보면 Options 가 있다.

 

이 Options 에 원하는 게임모드의 경로를 넣어주면 된다.

단, 앞에 ?game= 가 붙는다.

 

?game=/Script/MyProject.MyGameMode

 

예시로 이런 형식으로 넣어주면 된다.

 

조금 응용하자면 매번 경로를 알기 번거로우니,

클래스이름::StaticClass() 로 접근해서 옵션을 FString 으로 만들어 줄 수 있다.

 

void URPGameInstance::ChangeLevel(const FString& LevelName, const TSubclassOf<AGameModeBase> GameMode) const
{
	const UWorld* World = GetWorld();
	check(World);

	if (GameMode)
	{
		const FString Option = FString::Printf(TEXT("?game=%s"), *GameMode->GetPathName());
		UGameplayStatics::OpenLevel(World, *LevelName, true, *Option);
		return;
	}

	UGameplayStatics::OpenLevel(World, *LevelName);
}

 

TSubClassOf<AGameModeBase> 의 형태로 게임모드의 StaticClass 를 넘겨주면 GetPathName() 을 통해

경로를 가져올 수 있다.

 

GameMode 매개변수에 default 값을 nullptr 로 주어, 매개변수를 넣어주면 게임모드를 set 하면서 로드하고,

매개변수가 없이 레벨 이름만 넘겨주면, 레벨만 열 수도 있다.

728x90