구분 생성 주체 생명주기 UObject 기반 월드/PIE 대응 주 용도
Game Singleton Engine 설정 Engine 생명주기 가능 약함 전역 데이터 객체
Subsystem Unreal Framework 종류별로 다름 가능 강함 시스템 단위 기능
GameInstance Unreal Framework 게임 실행 세션 가능 강함 레벨 전환 후 유지 데이터

Game Singleton

Unreal Editor의 Project Settings에서 지정하는 Game Singleton은 UEngine이 관리하는 전역 UObject 인스턴스다.
Project Settings 또는 DefaultEngine.ini에서 Singleton 클래스를 지정할 수 있다.

[/Script/Engine.Engine]
GameSingletonClassName=/Script/MyGame.MyGameSingleton

image-1783405959446

접근은 GEngine->GameSingleton을 통해 한다.

UMyGameSingleton* Singleton = Cast<UMyGameSingleton>(GEngine->GameSingleton);

if (Singleton)
{
    // 전역 데이터 접근
}

특징

항목 설명
생성 위치 Engine 초기화 과정
소유자 UEngine
생명주기 엔진이 살아있는 동안 유지
레벨 전환 유지됨
PIE 여러 PIE 환경에서 의도치 않게 공유될 수 있음
네트워크 서버/클라이언트 개념과 직접 연결되지 않음

Subsystem

Subsystem은 Unreal이 제공하는 공식적인 시스템 확장 구조다.
직접 Singleton을 만들지 않고도 특정 생명주기에 맞는 전역성 객체를 만들 수 있다.

대표적인 Subsystem 종류는 다음과 같다.

Subsystem Outer 생명주기 사용 예
UEngineSubsystem Engine 엔진 전체 엔진 단위 서비스
UGameInstanceSubsystem GameInstance 게임 실행 세션 인벤토리, 세이브, 매치 데이터
UWorldSubsystem World 월드 단위 스폰 관리, 월드 이벤트 관리
ULocalPlayerSubsystem LocalPlayer 로컬 플레이어 단위 입력, UI, 플레이어 설정
UEditorSubsystem Editor 에디터 실행 중 에디터 툴, 자동화 기능

기본 구조

UCLASS()
class UMyGameSubsystem : public UGameInstanceSubsystem
{
    GENERATED_BODY()

public:
    virtual void Initialize(FSubsystemCollectionBase& Collection) override;
    virtual void Deinitialize() override;
};
void UMyGameSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
    Super::Initialize(Collection);

    // 초기화
}

void UMyGameSubsystem::Deinitialize()
{
    // 정리

    Super::Deinitialize();
}

접근

UMyGameSubsystem* Subsystem = GetGameInstance()->GetSubsystem<UMyGameSubsystem>();

if (Subsystem)
{
    // 시스템 기능 사용
}

또는 World Context가 있을 경우:

UGameInstance* GI = UGameplayStatics::GetGameInstance(GetWorld());
UMyGameSubsystem* Subsystem = GI->GetSubsystem<UMyGameSubsystem>();

특징

항목 설명
생성 주체 Unreal Framework
초기화 함수 Initialize()
종료 함수 Deinitialize()
UObject 기반 가능
GC 관리 안전
Blueprint 노출 가능
PIE 대응 GameInstance, World, LocalPlayer 기준으로 분리 가능

GameInstance

UGameInstance는 게임 실행 세션 동안 유지되는 객체다.
레벨이 바뀌어도 파괴되지 않는다.

UCLASS()
class UMyGameInstance : public UGameInstance
{
    GENERATED_BODY()

public:
    UPROPERTY()
    int32 Gold;

    UPROPERTY()
    FString PlayerName;
};

접근은 다음과 같다.

UMyGameInstance* GI = Cast<UMyGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()));

if (GI)
{
    GI->Gold += 100;
}

특징

항목 설명
생성 주체 Unreal Framework
생명주기 게임 시작부터 종료까지
레벨 전환 유지됨
월드 종속성 특정 World에 직접 종속되지는 않음
PIE 대응 PIE 인스턴스마다 별도 GameInstance 생성
멀티플레이 서버와 클라이언트가 각각 자기 GameInstance를 가짐
Replication 직접 복제되지 않음

GameInstance는 데이터를 들고 있는 게임 세션 객체이다.
기능이 많아지면 GameInstance가 비대해지기 쉬우므로, 시스템별 기능은 UGameInstanceSubsystem으로 분리하는 편이 좋다.


생명주기 비교

flowchart TD
    A[Engine 시작] --> B[Game Singleton 생성]
    A --> C[EngineSubsystem 생성]

    B --> D[게임 실행]
    C --> D

    D --> E[GameInstance 생성]
    E --> F[GameInstanceSubsystem 생성]

    F --> G[World 생성]
    G --> H[WorldSubsystem 생성]

    H --> I[Level 이동]
    I --> G

    E --> J[게임 종료]
    J --> K[GameInstance / Subsystem 정리]
    K --> L[Engine 종료]
    L --> M[Game Singleton 정리]
객체 레벨 전환 시 유지 게임 종료 시 제거 엔진 종료까지 유지
Game Singleton 유지 경우에 따라 유지 유지
GameInstance 유지 제거 제거
GameInstanceSubsystem 유지 제거 제거
WorldSubsystem 제거 후 새 월드에서 재생성 제거 제거

Game Singleton vs GameInstance

구분 Game Singleton GameInstance
소유자 UEngine 게임 실행 세션
설정 위치 Project Settings / ini Project Settings의 GameInstance Class
생성 시점 엔진 초기화 쪽 게임 실행 시작
레벨 전환 유지 유지
PIE 분리 상대적으로 약함 PIE 인스턴스별 분리
Runtime 상태 관리 부적합 가능
플레이어 세션 데이터 부적합 적합

게임 중 변하는 데이터라면 Game Singleton보다 GameInstance 또는 GameInstanceSubsystem이 더 적합하다.


GameInstance vs GameInstanceSubsystem

구분 GameInstance GameInstanceSubsystem
역할 게임 세션의 중심 객체 세션 단위 기능 모듈
구조 하나의 클래스에 기능이 모이기 쉬움 기능별 분리 가능
확장성 낮아질 수 있음 높음
초기화 Init() Initialize()
종료 Shutdown() Deinitialize()
접근 GetGameInstance() GetSubsystem<T>()
추천 용도 세션 핵심 데이터 인벤토리, 세이브, 매치, 로딩 등 시스템

사용 기준

목적 추천 구조
레벨 이동 후 유지되는 플레이어 데이터 GameInstance
GameInstance에 붙는 시스템 기능 UGameInstanceSubsystem
월드마다 따로 존재해야 하는 시스템 UWorldSubsystem
로컬 플레이어별 UI / 입력 / 설정 ULocalPlayerSubsystem
엔진 전체에서 하나만 필요한 기능 UEngineSubsystem
에디터 툴 기능 UEditorSubsystem
읽기 전용 전역 데이터 접근 Game Singleton 또는 DataAsset
순수 C++ 유틸리티 직접 Singleton 또는 static 함수
게임 중 변하는 전역 상태 Subsystem 권장
Actor 참조 관리 WorldSubsystem 또는 Manager Actor
멀티플레이 상태 GameState, PlayerState, replicated Actor
반응형

'Unreal Engine' 카테고리의 다른 글

AssetManager ⇄ Bundle System(Data Asset)  (0) 2026.07.09
Unreal Engine GC  (0) 2026.07.08
Unreal Engine Tick 최적화  (0) 2026.07.06
UE 애니메이션 리타게팅  (0) 2026.07.03
언리얼 모듈, Build.cs, 리플렉션  (0) 2026.07.02