게임 개발/학습 일지

언리얼 내배캠 마스터반 수업 - Subsystem과 수명 관리

이개 2026. 6. 10. 12:28
Subsystem이란?
  • 내가 직접 만들고 관리하지 않아도 엔진이 알아서 켜고 꺼주는 시스템
  • 실행 시점과 수명을 직접 결정할 수 있음
 
Engine
  • 상속받는 원본 클래스
  • 태어나는 시점
  • 사라지는 시점
Editor
  • 상속받는 원본 클래스
  • 태어나는 시점
  • 사라지는 시점
 
GameInstance
  • 상속받는 원본 클래스
  • 태어나는 시점
  • 사라지는 시점
 
World(UE5에서 추가)
  • 상속받는 원본 클래스
  • 태어나는 시점
  • 사라지는 시점
 
LocalPlayer
  • 상속받는 원본 클래스
  • 태어나는 시점
  • 사라지는 시점
 
서브시스템의 장점
  1. 통계, UI 관리 기능 등을 별도 파일로 분리해 관리 가능하여 코드가 깔끔해진다.
  2. NewObject로 생성하고 가비지 컬렉션을 걱정할 필요없다. 엔진이 생명주기를 책임진다.
  3. 플러그인을 만들 때 사용자가 따로 설정할 필요없이, 플러그인을 넣기만 하면 서브시스템이 자동으로 활성화되어 기능을 수행한다.
 
내부 에셋들을 할당받기는 힘들다. 블루프린트로 할당하기에는 불안정하다. 하드코딩으로 넣어놓을 수는 있다.
 
실습
WorldSubsystem을 상속받은 새 클래스 MyWorldSubsystem을 만든다.
 
 
 
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
두 함수를 오버라이드한다.
Deinitialize에서는 파일 저장이나 Unbind 등을 진행해주면 된다.
 
UE_LOG로 서브시스템의 시작과 끝을 확인한다.
종료되는 함수는 Super를 뒤에 붙인다.
 
로그를 확인하기 위해 레벨 플루프린트에 Open Level 노드를 배치한다. 
 
새 월드가 열릴 때마다 로그가 출력되는 것을 확인할 수 있다.
 
서브시스템 자동활성화 제어
UWorldSubsystem에 들어가면 ShouldCreateSubsystem이라는 함수가 있는데, 여기서 활성화 여부를 제어할 수 있다.
 
true면 생성, false면 미생성
 
UWorld* World = Cast<UWorld>(Outer); 
-> 현재 액터의 상위 액터
 
ex) 스타터 맵에서만 실행하고 싶은 경우
World를 가져오고, World의 맵 이름에 StaterMap이 들어가는지 확인해서 해당 맵에서만 띄우기
 
 
 
블루프린트에서 서브시스템을 갖고 오고싶다면 바로 호출이 가능하다.
 
날씨 서브시스템과 시간 서브시스템의 관계
만약 시간에 따라 날씨를 조정하고 싶다고하면, 시간 서브시스템이 먼저 생성되고 날씨 시스템은 시간을 가져와서 조정을 할 수 있어야 한다. 그래서 Collection을 통해 의존성을 주입하여 선행 초기화를 시켜준다.
 
 
TimeWorldSubsystem을 만들어준다.
 
GetCurrentHour 함수를 만들고 시간을 리턴해준다.
 
MyWorldSubsystem.cpp에서 연동해준다.
UTimeWorldSubsystem* TimeSub = Collection.InitializeDependency<UTimeWorldSubsystem>(); 로 UTimeWorldSubsystem을 먼저 생성해주는 것이다.
 
실행 화면. 생성 초기에만 한번 실행하기 때문에 0이 뜬다.