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과 함께 작동하지는 않는다.

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를 비활성화 하면 된다.

'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

+ Recent posts