Input 모드 관리
Game/UI/GameAndUI 입력 모드 전환, 마우스 캡처, 그리고 CommonUI와의 연동을 학습합니다.
UE5 입력 모드 개요
세 가지 입력 모드와 마우스 캡처
// PlayerController에서 입력 모드 설정
// 1. Game Only: 게임 입력만, 마우스 커서 숨김
FInputModeGameOnly GameMode;
SetInputMode(GameMode);
SetShowMouseCursor(false);
// 2. UI Only: UI 입력만, 게임 입력 차단
FInputModeUIOnly UIMode;
UIMode.SetWidgetToFocus(MenuWidget->TakeWidget());
UIMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
SetInputMode(UIMode);
SetShowMouseCursor(true);
// 3. Game and UI: 둘 다 허용 (HUD 상호작용)
FInputModeGameAndUI GameAndUI;
GameAndUI.SetWidgetToFocus(HUDWidget->TakeWidget());
GameAndUI.SetLockMouseToViewportBehavior(EMouseLockMode::LockAlways);
GameAndUI.SetHideCursorDuringCapture(false);
SetInputMode(GameAndUI);
SetShowMouseCursor(true);
| 모드 | 게임 입력 | UI 입력 | 마우스 | 사용 예 |
|---|---|---|---|---|
| Game Only | O | X | 잠금/숨김 | 일반 게임플레이 |
| UI Only | X | O | 자유/표시 | 메뉴, 인벤토리 |
| Game And UI | O | O | 설정 가능 | HUD 상호작용, 빌딩 모드 |
CommonUI를 사용하는 프로젝트에서는 SetInputMode() 직접 호출 대신 CommonUI의 Activatable Widget 입력 모드 설정을 사용하세요. 두 시스템이 동시에 입력 모드를 제어하면 충돌이 발생할 수 있습니다.
마우스 캡처와 잠금
뷰포트 내 마우스 동작 제어
// EMouseCaptureMode 옵션
EMouseCaptureMode::NoCapture // 캡처 없음 (메뉴)
EMouseCaptureMode::CapturePermanently // 항상 캡처 (FPS 게임)
EMouseCaptureMode::CaptureDuringMouseDown // 클릭 중만 캡처
EMouseCaptureMode::CaptureDuringRightMouseDown // 우클릭 중만
// EMouseLockMode 옵션
EMouseLockMode::DoNotLock // 뷰포트 밖으로 이동 가능
EMouseLockMode::LockOnCapture // 캡처 시 잠금
EMouseLockMode::LockAlways // 항상 뷰포트 내 잠금
EMouseLockMode::LockInFullscreen // 전체화면 시만 잠금
// 실전 패턴: 메뉴 열기/닫기
void AMyPlayerController::ToggleMenu()
{
if (bMenuOpen)
{
// 메뉴 닫기 → 게임 모드 복귀
MenuWidget->RemoveFromParent();
FInputModeGameOnly Mode;
SetInputMode(Mode);
SetShowMouseCursor(false);
SetPause(false);
}
else
{
// 메뉴 열기 → UI 모드
MenuWidget = CreateWidget<UMainMenu>(this, MenuClass);
MenuWidget->AddToViewport(100);
FInputModeUIOnly Mode;
Mode.SetWidgetToFocus(MenuWidget->TakeWidget());
SetInputMode(Mode);
SetShowMouseCursor(true);
SetPause(true);
}
bMenuOpen = !bMenuOpen;
}
CommonUI 입력 모드 관리
Activatable Widget 기반의 자동 입력 모드 전환
// CommonUI에서는 Activatable Widget이 입력 모드를 자동 관리
UCLASS()
class UPauseMenu : public UCommonActivatableWidget
{
GENERATED_BODY()
public:
UPauseMenu()
{
// 이 위젯이 활성화되면 자동으로 Menu 모드로 전환
// 비활성화되면 이전 모드로 자동 복귀
SetInputMode(ECommonInputMode::Menu);
SetMouseCaptureMode(EMouseCaptureMode::NoCapture);
}
};
// 위젯 활성화/비활성화만으로 입력 모드가 전환됨
// 수동 SetInputMode() 호출 불필요
MenuStack->AddWidget<UPauseMenu>(PauseMenuClass);
// → 자동으로 Menu 모드 + 마우스 표시
PauseMenu->DeactivateWidget();
// → 자동으로 이전 입력 모드 복귀
CommonUI는 입력 모드를 스택으로 관리합니다. 메뉴 A(Menu 모드) 위에 다이얼로그 B(Menu 모드)를 Push하면, B가 Pop될 때 A의 입력 모드로 복귀합니다. 이 자동 관리 덕분에 수동으로 이전 모드를 추적할 필요가 없습니다.
입력 모드 전환 모범 사례
버그 없는 입력 모드 관리를 위한 패턴
올바른 패턴
- + CommonUI 사용 시 Activatable Widget에 위임
- + 입력 모드 전환을 중앙 관리자에서 처리
- + SetWidgetToFocus로 초기 포커스 명시
- + UI 닫힐 때 반드시 Game 모드 복귀 확인
피해야 할 패턴
- - 여러 곳에서 SetInputMode 중복 호출
- - CommonUI와 SetInputMode 혼용
- - UI 닫기 시 입력 모드 복귀 누락
- - 마우스 커서 상태 불일치
핵심 요약
- UE5는 Game Only, UI Only, Game And UI 세 가지 입력 모드를 제공합니다
- CommonUI 프로젝트에서는
Activatable Widget의 입력 모드 설정이 자동으로 스택 관리됩니다 SetWidgetToFocus()로 입력 모드 전환 시 초기 포커스 대상을 명시해야 게임패드 UX가 정상 동작합니다- 입력 모드 전환 로직은 중앙 관리자(또는 CommonUI)에 집중시켜 중복과 불일치를 방지합니다
- UI를 닫을 때 입력 모드와 마우스 커서 상태를 반드시 원래대로 복귀시켜야 합니다
도전 과제
배운 내용을 직접 실습해보세요
SetInputMode_GameOnly, SetInputMode_UIOnly, SetInputMode_GameAndUI 세 가지 모드를 상황에 맞게 전환하는 시스템을 구현하세요. 인벤토리 열기 시 UIOnly, 닫기 시 GameOnly로 전환하고 마우스 커서를 관리합니다.
FInputModeData의 SetLockMouseToViewportBehavior, SetHideCursorDuringCapture 옵션을 실험하세요. 게임 중에는 마우스가 뷰포트에 잠기고, 메뉴에서는 자유롭게 움직이는 동작을 구현합니다.
게임 상태(탐색/전투/대화/메뉴/컷신)별로 적절한 입력 모드를 자동 설정하는 InputModeManager를 구현하세요. 상태 스택으로 관리하여 중첩된 상태에서도 올바른 입력 모드가 복원되도록 합니다.