[CommonUI] UIMapDataAsset, UIManageSubsystem, HUD (GameplayTag 쓰는 방식)
기존 GameplayTag 기반 UI 시스템을 NativeTag 기반 구조로 전환했다.
NativeTag는 C++에서 선언되기 때문에 오타나 잘못된 경로 같은 문제를 컴파일 단계에서 막을 수 있고, .ini 파싱 비용도 없어 초기화가 더 단순해진다.
UI 요청 태그(UI.Request.)와 레이어 태그(UI.Layer.)를 네임스페이스로 묶어 관리하니 구조가 명확해졌고, DataAsset(UUIMapDataAsset)에 UI 정책을 TMap으로 정리해 UI 흐름을 완전히 데이터 기반으로 운영할 수 있게 했다.
UIManageSubsystem에서는 DefaultGame.ini에서 SoftObjectPath를 읽고 DataAsset을 동적으로 로드하도록 변경해 BP 의존도를 제거했다.
UE_DECLARE_GAMEPLAY_TAG_EXTERN / UE_DEFINE_GAMEPLAY_TAG 로 선언 및 정의.ini 파싱이 필요 없어 초기화가 미세하게 더 빠름 (큰 차이는 아님)➡ 유연성은 GameplayTag, 안정성과 유지보수성은 NativeTag
namespace LNGameplayTags
{
// Request
OURLONGNUGHT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Request_MainMenu);
// Layer
OURLONGNUGHT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(UI_Layer_Main);
}
#include "UITags.h"
namespace LNGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(UI_Request_MainMenu, "UI.Request.MainMenu");
UE_DEFINE_GAMEPLAY_TAG(UI_Layer_Main, "UI.Layer.Main");
}
➡ 네임스페이스로 묶는 방식은 UE 공식 샘플(AbilitySystem 포함)에서도 권장됨
➡ NativeTag + DataAsset 조합은 UI 레이어/위젯 매핑을 코드 분리 + 데이터 주도 방식으로 관리할 때 매우 적합
TryLoad()[/Script/OurLongNight.LNUIManageSubsystem]
LNMapDataAssetPath="/Game/UI/DataAssets/DA_LNMap.DA_LNMap"
UIMapDataAssetPath 값으로 DataAsset 로드void UUIManageSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
if (UIMapDataAsset)
{
CachedWidgetMap = UIMapDataAsset->WidgetMap;
UE_LOG(LogTemp, Log, TEXT("UIManageSubsystem: %d개의 UI 맵 로드됨."), CachedWidgetMap.Num());
}
else
{
UE_LOG(LogTemp, Error, TEXT("UIManageSubsystem: UIMapDataAsset 설정 필요"));
}
}