반대로 이 두 케이스에 모두 해당되지 않으면 Common UI를 사용하지 않아도 무방하다.
RTS 게임
이와 별개로, WidgetComponent를 사용하여 배치된 Widget은 가급적 Common UI 사용을 지양하는 것이 좋다.
여기서 WidgetComponent라 함은 3D 월드 상에 표기되는 Widget들을 지칭한다.
캐릭터 닉네임, 체력바, 상태 등등
Common UI는 Cursor-Focus Search, Activate Order, Paint Order(LayerID)에 의존한다.
때문에 2D 게임 HUD도 처리 할 수는 있지만, Game World에 배치 된 Widget과 함께 작동하지는 않는다.
Keyboard와 Mouse 입력을 동시에 처리하는 방법
일반적으로 Common UI는 Mouse와 Keyboard의 입력을 동시에 지원하지는 않는다.
이를 동시에 지원하게 되면 UI 입장에서는 Mouse가 2개인 것처럼 느껴진다.
붕괴 스타레일은 PC에서 마우스 커서를 띄우기 위해서는 ALT 키를 누르고 있어야만 한다.
가장 간단한 방법은 입력을 Toggle로 관리하는 것이다.
보편적인 상황에서는 Keyboard Input으로 메뉴를 띄운다.
특정 키를 입력하고 있으면 Mouse Cursor가 노출된다.
이 때, 모든 키보드 입력은 막히게 된다.
Mouse Cursor가 노출되고 있는 동안에는 마우스 커서만으로 입력을 받는다.
UI 성능에 영향을 미치는 Tick이나 일시정지를 우회하는 방법
Common UI는 LocalPlayerSubsystem으로 동작하여 게임이 일시정지 하면 Tick이 되지 않는다.
Tick이 멈추면 CommonBoundActionBar를 포함한 Common UI가 동작하지 않는다.
이를 우회하려면 관련 Actor와 Widget에 tickable when paused 옵션을 활성화 해야 한다.
UI의 의도된 기능이나 퍼포먼스와 상충되지 않는지 확인 후 작업하자.
KeyHandler Method에서 Analog Input을 얻게 되는 이유
현재 InputKey/InputAxis는 PlayerController 단위에서 작업이 통합되어 있다.
이는 가짜 Input 추가를 쉽게 하고, Input Parameter를 하나로 묶어 쉽게 업데이트 하기 위함이다.
UE5 이전의 코드가 있으면 Analog Input이 Key Handler Callback을 트리거하거나, 반대로 트리거 될 수 있다.
Common UI는 이러한 기능으로부터 영향을 받지 않도록 하는 작업이 필요하다.
하지만 Input Pipeline 초기에 디버깅 중이라면, 이러한 교차 Trigger는 쉽게 발견할 수 있다.
예를 들어 FCommonAnalogCursor는 Input Processor이므로 Input Pipeline 초기 부분과 상호작용한다.
이 때문에 FCommonAnalogCursor::HandleKeyDownEvent에서 Corss Trigger 현상이 발생할 수 있다.
Input Mode가 Menu일 때 Game Input을 받을 수 있는 이유
bool UCommonUIActionRouterBase::CanProcessNormalGameInput() const
{
if (GetActiveInputMode() == ECommonInputMode::Menu)
{
// We still process normal game input in menu mode if the game viewport has mouse capture
// This allows manipulation of preview items and characters in the world while in menus.
// If this is not desired, disable viewport mouse capture in your desired input config.
const ULocalPlayer& LocalPlayer = *GetLocalPlayerChecked();
if (TSharedPtr<FSlateUser> SlateUser = FSlateApplication::Get().GetUser(GetLocalPlayerIndex()))
{
return LocalPlayer.ViewportClient && SlateUser->DoesWidgetHaveCursorCapture(LocalPlayer.ViewportClient->GetGameViewportWidget());
}
}
return true;
}
이 함수로 인해 Game Viewport에 Mouse Capture가 있으면 Menu Mode에서의 Game Input이 가능하다.
이 때문에 Menu에 있을 때 World 내 Preview Item과 Character를 조작할 수 있다.
만약 Game Input을 받고 싶지 않다면 원하는 InputMode에서 Mouse Capture를 비활성화 하면 된다.