현재 메뉴에서 호스트버튼을 누르면 호스팅 함수까지 실행이 정상적으로 이루어지나, 그 후 입력이 처리되지 않은 문제가 발생함.
-> 여전히 입력이 메뉴에 전달되기때문
번외로 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/
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에는 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);
}
실행하면 정상적으로 작동함.
'unreal engine' 카테고리의 다른 글
[언리얼엔진] C++에서 메뉴 탐색하기 (0) | 2022.03.06 |
---|---|
[언리얼엔진] 위젯 스위처를 지닌 서브 메뉴 (0) | 2022.03.06 |
[언리얼엔진] 종속성 반전 인터페이스 (inverting dependencies) (0) | 2022.03.03 |
[언리얼엔진] 언리얼 모션 그래픽을 C++에 연결 (0) | 2022.03.01 |
[언리얼엔진] 커스텀 버튼과 폰트 (0) | 2022.02.28 |