본문 바로가기
언리얼

[UE5] Subsystem

by 안선생 2025. 4. 8.

언리얼 엔진의 서브시스템, 싱글톤의 장점과 그 이면

언리얼 엔진을 사용하다 보면 자연스럽게 접하게 되는 시스템이 있습니다. 바로 **서브시스템(Subsystem)**입니다. 서브시스템은 언리얼 엔진에서 **싱글톤(Singleton)**처럼 동작하는 구조로, 전역적으로 접근 가능하고 수명 주기가 엔진의 흐름을 따라가는 시스템입니다.

 


싱글톤(서브시스템)의 장점

  • 언제 어디서든 접근 가능하다
  • 그래서 실제 게임 개발 현장에서도 자주 사용되는 구조입니다.
  • 간단한 유틸리티나 매니저 같은 것들은 싱글톤이 관리하기 적합합니다.
  • 예를 들어, PIE(Play In Editor) 상황에서는 한 번에 여러 개의 게임 인스턴스를 실행해야 할 때, 각 인스턴스를 전역적으로 관리할 수 있어 편리하죠.


그러면 그냥 싱글톤 만들면 되지 왜 서브시스템을 만들었냐? 그거는 싱글톤 자체의 문제 때문


문제는?

싱글톤의 가장 큰 문제는 한번 생성되면 절대 사라지지 않는다는 점입니다.

  • 언리얼에서는 생명 주기가 복잡합니다.
    • 게임 인스턴스 → 게임 모드 → 게임 월드 → 에디터 모드 → PIE 인스턴스 등 다양한 계층이 존재
  • 이때, 서브시스템이 잘못된 위치에 생성되거나 제거되지 않으면 불필요한 참조가 남아버릴 수 있습니다.
    • 실제로 PIE에서 여러 인스턴스를 실행하면, 이 중 일부가 소멸하지 않고 남아 예기치 않은 동작을 일으키기도 합니다.
  • 특히 서버 쪽 시스템을 싱글톤으로 관리하면, PIE를 재시작했을 때도 이전 상태가 남아 레벨 전환, 게임 월드 변경 등에 영향을 줄 수 있습니다.

어떤 문제가 발생했을까?

실제 경험을 기반으로 한 예시:

  • 서버용 싱글톤을 만들어 게임 인스턴스를 여러 개 실행했는데, PIE 재실행 시 이전 인스턴스가 정리되지 않고 남아있었음.
  • 이로 인해 동일한 오브젝트가 여러 번 로드되거나, 버튼 이벤트가 중복으로 발생하는 문제가 발생함.
  • PIE에서 껐다 켰을 뿐인데, 내부 상태가 유지되고 있어 디버깅에 큰 혼란을 줌.


그러면 서스시스템에 자세히 알아보자!

 

서브시스템(Subsystem)

언리얼 엔진에서는 공통적으로 쓰이는 시스템을 싱글톤처럼 만들어두고 어디서든 접근할 수 있도록 하기 위해 **서브시스템(Subsystem)**이라는 기능을 제공합니다. 서브시스템은 자동으로 생성되고, 특정 엔진 객체의 라이프사이클에 맞춰 관리됩니다.

 

어떤 서브시스템이 언제 살아있을까?

엔진의 구조마다 서브시스템이 붙는 대상과 생존 기간이 다릅니다. 현재 언리얼에서 지원하는 서브시스템 종류는 다음과 같습니다:

서브시스템 종류상속할 클래스생명주기 설명
Engine UEngineSubsystem 엔진 실행 시점 전체
Editor UEditorSubsystem 에디터에서만 작동 (에디터 전용 툴 등)
GameInstance UGameInstanceSubsystem 게임 인스턴스가 살아있는 동안
World UWorldSubsystem 각 레벨(월드) 단위로 생성/제거
LocalPlayer ULocalPlayerSubsystem 각 플레이어마다 별도로 유지

서브시스템 기본 사용법

예를 들어 UGameInstanceSubsystem을 상속받은 서브시스템을 만든다고 해보겠습니다:

 
class UMySystem : public UGameInstanceSubsystem

이제 이렇게 만든 서브시스템은 게임 인스턴스가 살아있는 동안 자동으로 생성됩니다.

접근할 땐 아래처럼 하면 됩니다:

 
UGameInstance* GameInstance = ...; UMySystem* MySystem = GameInstance->GetSubsystem<UMySystem>();
 

 

 

정리

  • 서브시스템은 언리얼 엔진에서 제공하는 라이프사이클 기반 전역 객체
  • GetSubsystem<>() 방식으로 어디서든 접근 가능
  • 각각의 서브시스템은 자신에게 맞는 상속 클래스를 따라야 함 (예: GameInstance는 UGameInstanceSubsystem 상속)