Common UI의 사용 여부 판단
- 주로 다음 상황에서 Common UI 사용이 권장된다.
- 복잡한 Multiple Layer UI를 제공해야 하는 경우
- Cross-Platform을 지원하는 경우
- 반대로 이 두 케이스에 모두 해당되지 않으면 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과 함께 작동하지는 않는다.
- 여기서 WidgetComponent라 함은 3D 월드 상에 표기되는 Widget들을 지칭한다.
Keyboard와 Mouse 입력을 동시에 처리하는 방법
- 일반적으로 Common UI는 Mouse와 Keyboard의 입력을 동시에 지원하지는 않는다.
- 이를 동시에 지원하게 되면 UI 입장에서는 Mouse가 2개인 것처럼 느껴진다.
- 가장 간단한 방법은 입력을 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를 비활성화 하면 된다.
'UE5 > UI' 카테고리의 다른 글
[회고] Common UI, UMG ViewModel 사용 후기 (0) | 2024.09.28 |
---|---|
[UI] CommonUI Technical Guide (0) | 2024.07.10 |
[UI] Common UI Widget (0) | 2024.07.10 |
[UI] Common UI Introduction (0) | 2024.07.10 |
[UI] UMG ViewModel (0) | 2024.07.08 |