본문으로 바로가기

[Unreal] Frontend UI Subsystem

category 🎯 game engine/◽ 언리얼(unreal) 2025. 9. 14. 20:16
반응형

아 이제 ui만하면 만들고 있는 프로젝트가 끝이난다... 이번 달 안에 꼭 끝낼 수 있으면 좋겠다 

할 수 있드아 ~!!!!!! 

게임 로직 인강은 정리하면서 할 수 없었는데 이번에는 한 번 정리하면서 UI 프로젝트를 마쳐보려고 한다

 

1. SubSystem이 뭔지? 

언리얼에는 UWorldSubsystem, UGameInstanceSubsystem, UEngineSubsystem 같은 서브시스템 개념이 있다. 

  • 특정 라이프사이클(월드 단위, 게임 인스턴스 단위, 엔진 전체 단위)에 따라 자동으로 생성/초기화되는 매니저 객체.
  • 전역 싱글톤 대신 “월드나 인스턴스 스코프 안에서만” 살아 있는 싱글톤 느낌이라고 보면 된다. 

게임 전반에 걸쳐 공통적으로 쓰이는 UI(특히 프론트엔드 화면) 관련 매니저라고 이해하면 됨.

 

2. subSystem 종류

Subsystem 종류 상속 베이스 라이프사이클(언제 생성/파괴) 용도 

Engine Subsystem UEngineSubsystem 엔진 시작 시 생성 → 엔진 종료 시 파괴 (게임 전체에서 단 하나) 프로젝트 전역 서비스, 로그 매니저, 온라인 서비스 초기화 등
Editor Subsystem UEditorSubsystem 에디터 실행 시 생성 → 에디터 종료 시 파괴 (게임 실행과 무관) 툴 자동화, 커스텀 에디터 기능, 애셋 유틸리티 매니저
GameInstance Subsystem UGameInstanceSubsystem UGameInstance가 생성될 때 같이 생성 → 게임 인스턴스 종료 시 파괴 전역 UI 매니저(FrontendUISubsystem), 세션 매니저, 세이브 시스템
World Subsystem UWorldSubsystem 맵(월드)이 로드될 때 생성 → 언로드될 때 파괴 (월드마다 별도 존재) 맵 단위 로직 매니저, 환경 시스템, 스폰 매니저
LocalPlayer Subsystem ULocalPlayerSubsystem ULocalPlayer 생성 시 생성 → 플레이어 제거 시 파괴 (플레이어마다 하나씩) 입력 매핑, 개별 플레이어 설정, 로컬 HUD 상태 관리

 

UFrontendUISubsystem* UFrontendUISubsystem::Get(const UObject* WorldContextObject)
{
	if (GEngine)
	{
		// “이 함수가 어떤 **맥락(월드/오브젝트 환경)**에서 실행돼야 하는지 알려주는 기준 객체”
		UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::Assert);
		return UGameInstance::GetSubsystem<UFrontendUISubsystem>(World->GetGameInstance());
	}

	return nullptr; 
}

bool UFrontendUISubsystem::ShouldCreateSubsystem(UObject* Outer) const
{

	if (!CastChecked<UGameInstance>(Outer)->IsDedicatedServerInstance())
	{
		TArray<UClass*> FoundClass; 
		GetDerivedClasses(GetClass(), FoundClass); 

		return FoundClass.IsEmpty();
	}
	return false;
}

void UFrontendUISubsystem::RegisterCreatedPrimaryLayoutWidget(UWidget_PrimaryLayout* InCreateWidget)
{
	check(InCreateWidget); 

	CreatedPrimaryLayout = InCreateWidget;
}

 

 

3. 함수 설명

(1). UFrontendUISubsystem* UFrontendUISubsystem::Get(const UObject* WorldContextObject)

(2). bool UFrontendUISubsystem::ShouldCreateSubsystem(UObject* Outer) const

목적: 언리얼이 서브시스템을 생성해도 되는지 ? 결정하는 함수

 

  • Outer(소유자, 즉 GameInstance)가 서버 전용이 아닐 때 (IsDedicatedServerInstance == false)
    → 즉, 클라이언트일 때만 생성
  • GetDerivedClasses로 자신을 상속받은 클래스가 있는지 확인해서,
    다른 파생 클래스가 있으면 생성하지 않고, 없으면 생성.
    그래서 UI 서브시스템은 오직 클라이언트에서만 하나만 만들어진다는 의미.

 

(3) void UFrontendUISubsystem::RegisterCreatedPrimaryLayoutWidget(UWidget_PrimaryLayout* InCreateWidget)

목적: 위젯을 등록하는 함수 (메인화면 / 루트 UI 레이아웃 등등) 게임 실행시 최초로 생성되는 메인 UI 레이아웃을 기억하고 관리하는 함수. 

반응형