언리얼/언리얼 학습

FInputModeUIOnly

코드망령 2026. 6. 2. 17:02

Udemy에서 구매한 강의를 공부하면서 배운 내용입니다.

개인적으로 따로 알고싶어서 공부한 부분들도 있으니 내용에 틀린 것이 있을 수 있습니다.

https://www.udemy.com/course/unreal-engine-5-cpp-multiplayer-shooter/?couponCode=MT260602G3

 

Unreal Engine 5 C++ Multiplayer Shooter

<p><strong>Over 64 hours of content!</strong></p><p>Learn all about Unreal Engine multiplayer in this fully comprehensive C++ course. From scratch, we create a complete multiplayer shooter game, capable of creating and joining game sessions and connecting

www.udemy.com

 

이 강의를 들으며 공부했습니다.


FInputModeUIOnly

플레이어 컨트롤러에 적용하여 입력이 UI에만 전달되도록 설정하는 클래스

주로 메뉴 화면, 옵션 창, 로그인 화면, 로비 UI처럼

  • 캐릭터 조작은 막고
  • 버튼 클릭
  • 텍스트 입력
  • UI 네비게이션

만 가능하게 만들 때 사용한다.


강의 중 적은 코드

Menu.h

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Menu.generated.h"

UCLASS()
class MULTIPLAYERSESSIONS_API UMenu : public UUserWidget
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable)
    void MenuSetUp();

private:
    UPROPERTY(meta = (BindWidget))
    class UButton* HostButton;

    UButton* JoinButton;
};

Menu.cpp

void UMenu::MenuSetUp()
{
    AddToViewport();
    SetVisibility(ESlateVisibility::Visible);
    SetIsFocusable(true);

    UWorld* World = GetWorld();

    if (World)
    {
        APlayerController* PlayerController =
            World->GetFirstPlayerController();

        if (PlayerController)
        {
            FInputModeUIOnly InputModeData;

            InputModeData.SetWidgetToFocus(TakeWidget());
            InputModeData.SetLockMouseToViewportBehavior(
                EMouseLockMode::DoNotLock);

            PlayerController->SetInputMode(InputModeData);
            PlayerController->SetShowMouseCursor(true);
        }
    }
}

MenuSetUp 흐름

1. UI를 화면에 표시

AddToViewport();
SetVisibility(ESlateVisibility::Visible);

2. UI가 키보드 입력을 받을 수 있도록 설정

SetIsFocusable(true);

bIsFocusable = true 대신 사용


3. 플레이어 컨트롤러 가져오기

APlayerController* PlayerController =
    World->GetFirstPlayerController();

입력 모드를 변경하기 위해 필요하다.


4. UI 전용 입력 모드 생성

FInputModeUIOnly InputModeData;

UI만 입력을 받을 수 있는 입력 모드


5. 포커스를 줄 위젯 설정

InputModeData.SetWidgetToFocus(TakeWidget());

현재 위젯에 키보드 포커스를 준다.


6. 마우스 잠금 설정

InputModeData.SetLockMouseToViewportBehavior(
    EMouseLockMode::DoNotLock);

마우스를 뷰포트 안에 가둘지 결정한다.


7. 입력 모드 적용

PlayerController->SetInputMode(InputModeData);

플레이어 입력을 UI 전용으로 변경


8. 마우스 커서 표시

PlayerController->SetShowMouseCursor(true);

UI를 조작할 수 있도록 마우스 커서를 표시


SetWidgetToFocus

ENGINE_API FInputModeUIOnly&
SetWidgetToFocus(TSharedPtr<SWidget> InWidgetToFocus);

UI 입력 포커스를 받을 위젯을 설정한다.


사용 예시

InputModeData.SetWidgetToFocus(TakeWidget());

현재 UUserWidget을 포커스 대상으로 설정


반환형이 레퍼런스인 이유

체이닝(Chaining)을 지원하기 위해 자기 자신을 반환한다.

InputModeData
    .SetWidgetToFocus(TakeWidget())
    .SetLockMouseToViewportBehavior(
        EMouseLockMode::DoNotLock);

이처럼 함수를 이어서 호출할 수 있다.


SetLockMouseToViewportBehavior

ENGINE_API FInputModeUIOnly&
SetLockMouseToViewportBehavior(
    EMouseLockMode InMouseLockMode);

마우스를 뷰포트 내부에 가둘지 설정한다.


EMouseLockMode 종류

DoNotLock

EMouseLockMode::DoNotLock

마우스를 가두지 않는다.

게임 창 밖으로 이동 가능


LockAlways

EMouseLockMode::LockAlways

게임이 활성화 상태라면 항상 마우스를 뷰포트 안에 가둔다.


LockInFullscreen

EMouseLockMode::LockInFullscreen

전체 화면 모드일 때만 마우스를 가둔다.


LockOnCapture

EMouseLockMode::LockOnCapture

클릭 또는 드래그 등 입력이 발생했을 때 마우스를 가둔다.


사용 예시

InputModeData.SetLockMouseToViewportBehavior(
    EMouseLockMode::DoNotLock);

마우스가 게임 창 밖으로 이동 가능


TakeWidget()

TakeWidget()

UUserWidget을 Slate 시스템의 SWidget 형태로 변환하여 반환한다.


이유

SetWidgetToFocus()

TSharedPtr<SWidget>

형태를 요구한다.

하지만 UMG 위젯은

UUserWidget

기반이기 때문에 직접 전달할 수 없다.

따라서

TakeWidget()

을 사용하여 Slate 위젯으로 변환 후 전달한다.


사용 예시

InputModeData.SetWidgetToFocus(TakeWidget());

현재 위젯이 입력 포커스를 받도록 설정한다.


정리

FInputModeUIOnly

  • UI만 입력 받도록 설정
  • 캐릭터 조작 불가능
  • 메뉴, 옵션, 로그인, 로비 UI에서 사용

주요 함수

SetWidgetToFocus()
  • 입력 포커스를 줄 위젯 지정
SetLockMouseToViewportBehavior()
  • 마우스 잠금 방식 설정
TakeWidget()
  • UUserWidget → SWidget 변환
PlayerController->SetInputMode(InputModeData);
  • UI 전용 입력 모드 적용
PlayerController->SetShowMouseCursor(true);
  • 마우스 커서 표시

'언리얼 > 언리얼 학습' 카테고리의 다른 글

FOnlineSessionSettings  (0) 2026.06.03
GameInstance  (0) 2026.06.01
GameMode  (1) 2026.06.01
Delegate (델리게이트)  (0) 2026.06.01