[CommonUI] GameInstanceSubSystem, ActiveTags, GameplayTags

김여울·3일 전
0

내일배움캠프

목록 보기
113/114

Overview of Advanced Multiplatform User Interfaces With Common UI for Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

Common UI 주요 기능

1. Layer Widget 관리

  • 여러 UI를 Layer 단위 (Z Order)로 관리
  • HUD, 메뉴, 팝업 등 서로 다른 Layer에 추가해 중첩 표시와 우선순위를 제어
Layer 0  → 가장 밑 (기본 HUD)
Layer 1  → 메뉴 / 인벤토리 등
Layer 2  → 팝업 / 대화창 / 알림 등

2. Reusable Widget (공용 스타일화)

  • UI 요소를 공통 스타일 시스템으로 통합 관리하는 구조
  • Button / Text / Border / Checkbox → 이런 공용 위젯을 Style Asset 으로 분리
  • 폰트, 색상, 패딩, Hover 애니메이션 등을 CommonStyleData / CommonTextStyle 같은 리소스로 통합 관리
    → 위젯 블루프린트 안에서 일일이 설정 안 해도 되고 스타일만 교체하기

3. Input Routing

  • 플랫폼별 입력 (키보드 / 패드 / 터치)을 통합 처리
  • UI별 입력 우선순위를 Layer 단위로 설정 가능
  • Input Action들을 Data Table로 관리해서 UI마다 다른 입력 매핑 지정 가능
메뉴에서 B = 닫기
인벤토리에서 B = 뒤로가기
전투 중에는 무시

언리얼 엔진의 일반범용 UI 퀵스타트 가이드 | 언리얼 엔진 5.5 문서 | Epic Developer Community

Gameplay Tags

UI 상태를 이름표처럼 계층적으로 관리

예시설명
UI.MainMenu메인 메뉴 전체
UI.MainMenu.Main메인 메뉴의 홈화면 버튼
UI.Inventory.Equipment인벤토리 중 장비 탭
  • 태그는 계층적 구조 (UI.MainMenu → UI.MainMenu.Main)
  • 현재 어떤 UI가 떠 있는지 Active Tag로 추적 가능

GameInstanceSubsystem

  • 게임 전반에서 공유되는 시스템
  • 여러 개 생성 가능
  • GameInstance와 함께 켜지고 꺼짐

GISS를 UI에서 쓰는 이유?

게임 중 어디서든 UI 호출이 가능해야 하므로 독립된 관리가 필요하다

  • UI 상태(Active UI Tag) 중앙 관리
  • UI opened/closed, Layer/Z Order 동기화
  • 현재 어떤 UI가 떠 있는지 추적

Active Tags

Active Tag 여러 개 만들어서 Layer처럼 사용해서 각 Layer 마다 Z Order 관리 쉬움

Gameplay Tags 만드는 방법

1. Editer Tag Manager

Project Settings → Gameplay Tags

2. DefaultGameplayTags.ini

Config에 직접 정의

+GameplayTagList=(Tag="UI.MainMenu.Graphic",DevComment="MainMenu에서 Graphic 설정하는 거예요.")
+GameplayTagList=(Tag="UI.MainMenu.Main",DevComment="이거는 MainMenu 입니다.")
+GameplayTagList=(Tag="UI.MainMenu.Audio",DevComment="이거는 MainMenu에서 소리 설정하는 겁니다.")

3. 매크로 / 코드 생성

C++로 StaticTag 선언 (UE_DEFINE_GAMEPLAY_TAG)

UITag.h

#pragma once
#include "NativeGameplayTags.h"
// 이벤트 채널용 네이티브 태그(오타 방지/자동완성)
namespace UI_EVENT_TAG
{
	UE_DECLARE_GAMEPLAY_TAG_EXTERN(OpenPauseMenu);
	UE_DECLARE_GAMEPLAY_TAG_EXTERN(ClosePauseMenu);
	UE_DECLARE_GAMEPLAY_TAG_EXTERN(OpenInventory);
	UE_DECLARE_GAMEPLAY_TAG_EXTERN(CloseInventory);
	UE_DECLARE_GAMEPLAY_TAG_EXTERN(ShowToast);
}

UITag.cpp

#include "UITag.h"

UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::OpenPauseMenu,  "UI.Event.OpenPauseMenu");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::ClosePauseMenu, "UI.Event.ClosePauseMenu");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::OpenInventory,  "UI.Event.OpenInventory");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::CloseInventory, "UI.Event.CloseInventory");
UE_DEFINE_GAMEPLAY_TAG(UI_EVENT_TAG::ShowToast,      "UI.Event.ShowToast");

추가 정리

  • UI는 클라이언트 전용
    → 서버에서 복제되지 않음. 클라이언트에서만 복제!
    → 점수 같은 건 서버에서 전달 필요함

  • UI Subsystem으로 통합 관리
    인벤토리 위젯 직접 띄우기 대신 ActiveTag 등록 → 자동으로 띄움

  • ActiveTag 시스템으로 상태 추적
    → 어떤 UI가 켜져있는지, 어느 Layer에 위치하는지 명확함

  • Layer별 ZOrder 제어
    → 레이어 간 우선 순위 문제 해결

네트워크 클래스별 동기화

[ SERVER ]
 ├─ GameMode  (서버 전용)
 ├─ GameState → 클라 복제
 ├─ PlayerController (모든 유저별 존재)
 ├─ PlayerState → 클라 복제

[ CLIENT (자기 자신) ]
 ├─ PlayerController (자기 것만)
 ├─ PlayerState (모든 유저의 상태 복제)
 ├─ GameState (서버에서 받은 공용 정보)
 ├─ HUD (로컬 생성)
 ├─ Widget (로컬 생성)
구분서버에서만서버→클라 복제클라 전용
서버 전용GameMode
서버→클라 복제GameState, PlayerState
개인 클라 전용PlayerController(로컬), HUD, Widget

  • GameMode → GameState → PlayerState
    데이터만 복제되는 구조
    GameMode 는 서버의 로직 담당
    GameState 가 클라에 공유할 데이터 컨테이너

  • PlayerController → HUD / Widget
    UI는 항상 클라 로컬에서만 생성하고 갱신

  • UI에 서버 정보 표시하고 싶으면 GamesStatePlayerState의 Replicated 변수를 Bind해서 가져옴

0개의 댓글