본문으로 건너뛰기
Unreal Engine C++ 기초집LESSON 18

Subsystem 기초

난이도초급
예상 시간45분
선수지식17강의 DataAsset

18강. Subsystem 기초

1. 이번 강의에서 해결할 문제

점수를 가져오기 위해 어디서나 Character를 찾거나 직접 만든 Singleton 전역 변수에 접근합니다. 엔진이 생성·종료 시점을 관리하는 Subsystem에 게임 세션 상태를 둡니다.

2. 학습 목표

3. 핵심 개념

Subsystem은 특정 엔진 객체 수명에 맞춰 자동 생성되는 확장 지점입니다. 공식 Programming Subsystems 문서는 전역 Singleton을 만들지 않고 기능을 모듈화하는 이유와 접근 방법을 설명합니다.

이번 점수는 GameInstance 수명을 사용합니다. 레벨을 다시 열 때 점수를 초기화할지 유지할지는 게임 규칙입니다. ResetRun 함수를 시작 시 명시적으로 호출해 정책을 드러냅니다. 멀티플레이에서는 GameInstance 상태가 복제되지 않으므로 이후 네트워크 과정에서 GameState·PlayerState로 재설계해야 합니다.

4. 단계별 실습

파일 경로: Source/TopDownSurvival/Systems/SurvivalGameSubsystem.h

SurvivalGameSubsystem.h
#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "SurvivalGameSubsystem.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnScoreChanged, int32, NewScore);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnGameOver);

UCLASS()
class TOPDOWNSURVIVAL_API USurvivalGameSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()

public:
UFUNCTION(BlueprintCallable, Category = "Survival")
void ResetRun();

UFUNCTION(BlueprintCallable, Category = "Survival")
void AddScore(int32 Amount);

UFUNCTION(BlueprintCallable, Category = "Survival")
void EndGame();

UFUNCTION(BlueprintPure, Category = "Survival")
int32 GetScore() const { return Score; }

UFUNCTION(BlueprintPure, Category = "Survival")
bool IsGameOver() const { return bGameOver; }

UPROPERTY(BlueprintAssignable, Category = "Survival")
FOnScoreChanged OnScoreChanged;

UPROPERTY(BlueprintAssignable, Category = "Survival")
FOnGameOver OnGameOver;

private:
int32 Score = 0;
bool bGameOver = false;
};

파일 경로: Source/TopDownSurvival/Systems/SurvivalGameSubsystem.cpp

SurvivalGameSubsystem.cpp
#include "Systems/SurvivalGameSubsystem.h"

void USurvivalGameSubsystem::ResetRun()
{
Score = 0;
bGameOver = false;
OnScoreChanged.Broadcast(Score);
}

void USurvivalGameSubsystem::AddScore(int32 Amount)
{
if (bGameOver || Amount <= 0)
{
return;
}
Score += Amount;
OnScoreChanged.Broadcast(Score);
}

void USurvivalGameSubsystem::EndGame()
{
if (bGameOver)
{
return;
}
bGameOver = true;
OnGameOver.Broadcast();
}

접근 예시

어느 World Actor에서든
USurvivalGameSubsystem* Game = GetGameInstance()
? GetGameInstance()->GetSubsystem<USurvivalGameSubsystem>()
: nullptr;

if (Game)
{
Game->AddScore(100);
}

5. 코드가 동작하는 이유

GameInstance가 생성되면 Subsystem도 자동 생성되고 종료 때 정리됩니다. 호출자는 클래스의 static Instance를 관리하지 않습니다. 점수와 게임 오버를 private로 두고 함수로만 변경해 게임 오버 뒤 점수가 오르는 잘못된 상태를 막습니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Subsystem 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Subsystem 기초” 실습 결과를 해석하는 올바른 기준은 무엇인가요?
  2. 문제 2“Subsystem 기초”에서 ‘수명 범위 없이 Singleton 생성’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

18강. Subsystem 기초 미완료 상태