현재 메뉴에서 호스트버튼을 누르면 호스팅 함수까지 실행이 정상적으로 이루어지나, 그 후 입력이 처리되지 않은 문제가 발생함.

 

-> 여전히 입력이 메뉴에 전달되기때문

 

번외로 GameInstance의 LoadMenu의 함수에 메뉴를 뷰포트로 포함시키고 설정하는 내용의 위치가 적절하지 않아 MainMenu.cpp에 옮긴다.

 

인스턴스에 있는 LoadMenu()의 내용을 MainMenu->Setup으로 옮긴다.

 

GameInstance에서 GetPlayerController을 MainMenu클래스에서는 사용할 수 없기때문에

UWorld에서 호출하는 방식으로 찾아서 완성시킨다.

 

 

UWorld* World = GetWorld();
//플레이어 컨트롤러 획득
APlayerController* PlayerController = World->GetFirstPlayerController();

 

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/UWorld/

 

UWorld

The World is the top level object representing a map or a sandbox in which Actors and Components will exist and be rendered.

docs.unrealengine.com

 

void UPuzzlePlatformsGameInstance::LoadMenu()
{
	//생성자에서 mMenuClass가 할당되지 않을경우 리턴한다. (이전 장에서 다룸)
	if (!ensure(mMenuClass != nullptr)) return;

	//CreateWidget<UUserWidget>함수로 위젯을 생성한다.
	UMainMenu* Menu = CreateWidget<UMainMenu>(this, mMenuClass);

	if (!ensure(Menu != nullptr)) return;

	Menu->Setup();

	Menu->SetMenuInterface(this);
}
void UMainMenu::Setup()
{
	//UUserWidget::AddToViewport()로 뷰포트에 호출한다.
	this->AddToViewport();

	UWorld* World = GetWorld();
	if (!ensure(World != nullptr)) return;

	//플레이어 컨트롤러 획득
	APlayerController* PlayerController = World->GetFirstPlayerController();
	if (!ensure(PlayerController != nullptr)) return;

	//UI 입력모드 구조체 로컬 선언
	FInputModeUIOnly InputModeData;

	//DoNotLock 옵션으로 마우스 락 설정을 한다.
	InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);

	//PlayerController->SetInputMode
	//InputModeData.SetWidgetToFocus(Menu->TakeWidget());

	//UE4.27은 위 코드 대신 아래것을 사용한다.
	this->bIsFocusable = true;

	PlayerController->SetInputMode(InputModeData);
}

 

GameInstance에서 또 Menu를 획득하기는 비효율적이기에 내부 멤버변수로 메뉴를 만들자.

class UMainMenu* Menu;

 

Host버튼을 클릭했을때 메뉴를 제거하고 입력모드를 게임입력모드로 바꿔야하기에 호스트 함수 내부에 Menu->TearDown함수를 호출하도록 설정하고 TearDown을 정의한다.

 

https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/GameFramework/FInputModeDataBase/

 

FInputModeDataBase

Abstract base class for Input Mode structures

docs.unrealengine.com

 

FInputModeDataBase에는 FInputModeGameOnly도 있다. 이것을 이용하여 입력모드를 설정해야함.

//TearDown 함수는 Setup의 반대
void UMainMenu::TearDown()
{
	//UUserWidget::RemoveFromViewport()로 뷰포트에서 제거한다.
	this->RemoveFromViewport();

	//PlayerController을 획득해야함
	UWorld* World = GetWorld();
	if (!ensure(World != nullptr)) return;

	//플레이어 컨트롤러 획득
	APlayerController* PlayerController = World->GetFirstPlayerController();
	if (!ensure(PlayerController != nullptr)) return;

	//게임 입력모드 구조체 로컬 선언
	//FInputModeUIOnly -> FInputModeGameOnly으로 사용
	FInputModeGameOnly InputModeData;

	PlayerController->SetInputMode(InputModeData);
}

 

실행하면 정상적으로 작동함.

bonnate