ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 프로그래머스
  • 티스토리챌린지
  • 그래픽스
  • c#
  • 배열
  • 알고리즘
  • 파이썬
  • C
  • C++
  • 백준
  • string
  • 클래스
  • 오블완
  • 유니티
  • 언리얼
  • SQL
  • 포인터
  • 함수
  • Unity
  • 문자열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[Unreal] Programming Subsystem (프로그래밍 서브시스템)
게임엔진/Unreal

[Unreal] Programming Subsystem (프로그래밍 서브시스템)

2023. 11. 14. 16:25

1. 서브시스템

 

여기서 GameInstance 서브시스템을 커스터마이징했을때, 커스터마이징한 서브시스템의 수명은

class UMyGameSubsystem : public UGameInstanceSubsystem

위 예제 코드처럼 베이스 클래스에서 파생된 클래스를 생성하면 다음 스텝으로 수명이 관리된다.

  • UGameInstance 생성 이후, UMyGameSubsystem 인스턴스 역시 생성한다.
  • UGameInstance 초기화시, UMyGameSubsystem 인스턴스에서 Initialize()가 호출된다.
  • UGameInstance 종료시, UMyGameSubsystem 인스턴스에서 Deinitialize()가 호출된다.
  • Deinitialize()가 호출된 시점에서 UMyGameSubsystem 인스턴스에 대한 참조가 삭제되고 더이상 참조가 없으면 UMyGameSubsystem 인스턴스는 가비지 컬렉션된다.

2. 서브시스템을 사용하는 이유

프로그래밍 서브시스템을 사용하는데는 다음과 같은 몇가지 이유가 존재한다.

  • 프로그래밍 시간이 절약한다.
  • 엔진 클래스 오버라이드를 피할 수 있다.
  • 이미 복잡한 클래스에 API 추가를 피할 수 있다.
  • 사용자에게 친숙한 유형의 노드를 통해 블루프린트로 액세스할 수 있다.
  • 에디터 스크립팅이나 테스트 코드 작성을 위해 Python 스크립트에서 액세스할 수 있다.
  • 코드베이스의 모듈성과 일관성을 제공한다.

서브시스템은 플러그인을 만들때 특히 유용하다. 플러그인 작동에 필요한 코드 관련 지침이 없어도 된다.

사용자는 플러그인을 게임에 추가하기만 하면, 플러그인이 언제 인스턴싱 및 초기화될지 정확히 알 수 있기에 언리얼 엔진 4에서 제공되는 API 및 기능을 사용하는데만 중점을 둘 수 있다.

3. 블루프린트로 서브시스템 액세스

서브시스템은 블루프린트에 자동 노출되며, 컨텍스트를 이해하는 스마트 노드가 추가되므로 형변환이 필요없다.

표준 UFUNCTION() 마크업 및 규칙으로 블루프린트에서 사용할 수 있는 API를 제어할 수 있다.

블루프린트 그래프에 우클릭해서 컨텍스트 메뉴를 표시하고 subsystems를 검색하면 위와 같이 표시된다.

위 사진은 특정 서브시스템에 대한 주요 유형 및 개별 항목 각각에 대한 카테고리다.

위 사진처럼 서브시스템 노드를 추가하면, 서브시스템의 API를 사용할 수 있다.

4. Python으로 서브시스템 액세스

Python을 사용하는 경우, 내장된 접근자를 사용해서 서브시스템에 액세스할 수 있다.

my_engine_subsystem = unreal.get_engine_subsystem(unreal.MyEngineSubsystem)
my_editor_subsystem = unreal.get_editor_subsystem(unreal.MyEditorSubsystem)

5. 각각의 서브시스템 수명

  • Engine Subsystem

Engine Subsystem의 모듈이 로드되면, 서브시스템은 모듈의 Startup() 함수 반환 이후 Initialize()를 호출하고, 모듈의 Shutdown() 함수 반환 이후 Deinitialize()를 호출한다.

class UMyEngineSubsystem : public UEngineSubsystem { ... };

 

Engine Subsystem은 GEngine을 통해 액세스할 수 있다.

UMyEngineSubsystem* MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>();

 

  • Editor Subsystem

Editor Subsystem도 마찬가지로 모듈이 로드되면, 서브시스템은 모듈의 Startup() 함수 반환 이후 Initialize()하고, 모듈의 Shutdown() 함수 반환 이후 Deinitialize()한다.

class UMyEditorSubsystem : public UEditorSubsystem { ... };

 

Editor Subsystem은 GEditor를 통해 액세스할 수 있다.

UMyEditorSubsystem* MySubsystem = GEditor->GetEditorSubsystem<UMyEditorSubsystem>();

 

  • GameInstance Subsystem

GameInstance Subsystem 또한 모듈 로드시 Startup() => Initialize(), Shutdown() => Deinitialize() 순으로 진행된다.

class UMyGameSubsystem : public UGameInstanceSubsystem { ... };

 

GameInstance Subsystem은 UGameInstance를 통해 액세스할 수 있다.

UGameInstance* GameInstance = GetGameInstance();
UMyGameSubsystem* MySubsystem = GameInstance->GetSubsystem<UMyGameSubsystem>();

 

  • LocalPlayer Subsystem

LocalPlayer Subsystem도 모듈 로드시 Startup() => Initialize(), Shutdown() => Deinitialize() 순으로 진행된다.

class UMyPlayerSubsystem : public ULocalPlayerSubsystem { ... };

 

LocalPlayer Subsystem은 위 예제와 같이 ULocalPlayer를 통해 액세스할 수 있다.

UGameInstance* GameInstance = GetGameInstance();
ULocalPlayer* LocalPlayer = GameInstance->GetFirstGamePlayer();;
UMyPlayerSubsystem* MySubsystem = LocalPlayer->GetSubsystem<UMyPlayerSubsystem>();

 

 

[언리얼 C++] 프로그래밍 서브시스템 (tistory.com)

저작자표시 (새창열림)

'게임엔진 > Unreal' 카테고리의 다른 글

[Unreal] 엔진에서 제공하는 데미지 라이브러리  (0) 2023.11.15
[Unreal] 미니맵 및 캐릭터 위치 표시  (0) 2023.11.15
[Unreal] Level Blueprint 를 C++로 접근하기  (0) 2023.11.06
[Unreal] 언리얼 비동기 애셋 로딩 (Asynchronous Loading)  (0) 2023.11.06
[Unreal] Reflection (리플렉션)  (0) 2023.10.26
    '게임엔진/Unreal' 카테고리의 다른 글
    • [Unreal] 엔진에서 제공하는 데미지 라이브러리
    • [Unreal] 미니맵 및 캐릭터 위치 표시
    • [Unreal] Level Blueprint 를 C++로 접근하기
    • [Unreal] 언리얼 비동기 애셋 로딩 (Asynchronous Loading)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바