본문 바로가기
Unreal/Manual

Unreal Subsystem을 활용한 Unreal 스타일 싱글톤 패턴

by Dev_카페인 2024. 3. 15.
반응형

[Unreal/C++] Subsystem을 활용한 Unreal 스타일 싱글톤 패턴

 

하위 시스템은 전역적으로 액세스 가능한 모듈식 논리를 만드는 간단한 방법입니다.

 

싱글톤 디자인 패턴에는 많은 부담이 있지만 그 유용성은 무시할 수 없습니다. 다행스럽게도 Unreal은 단점을 줄이면서 싱글톤의 이점을 얻을 수 있는 방법을 제공합니다.

 

 

나쁜 방법: C++ 정적 싱글톤

class UMySingleton : public UObject
{
    public:
    static UMySingleton* GetInstance() { return Instance; }

    private:
    static UMySingleton* Instance;
};

C++ 정적 클래스 싱글톤의 장점과 단점:

  • + 인터페이스 프로그래머는 다음과 같은 작업에 익숙합니다.
  • - 편집기와의 상호작용이 좋지 않음: 작업을 하지 않으면 편집기를 통해 게임을 여러 번 실행하는 사이에 인스턴스가 보존됩니다.
  • - 상호 작용이 나쁘다. 클래스 클래스 기본 개체: 작업이 없으면 CDO가 생성될 때 인스턴스가 생성됩니다.
  • - 수명이 불분명함: 싱글톤의 수명을 관리하려면 신중한 프로그래밍과 명확한 의도가 필요합니다.

 

언리얼 서브시스템
Unreal 에는 명시적으로 정의된 라이프사이클이 있고 전역적으로 액세스 가능한 모듈을 만드는 데 사용할 수 있는 Subsystems 라는 것이 있습니다 .

하위 시스템의 수명은 상위 시스템의 수명과 일치합니다. 선택할 수 있는 상위 클래스는 5개입니다(아래 참조). 수명 주기에 대한 자세한 내용은 설명서 에서 확인할 수 있습니다 .

서브시스템 상속 원본 생명 주기
Engine UEngineSubsystem  에디터와 게임 내 모두
Editor UEditorSubsystem  Editor가 시작될 때.
GameInstance UGameInstanceSubsystem  게임의 시작부터 종료될 때까지
LocalPlayer ULocalPlayerSubsystem  상위 항목과 일치, Level 간 이동할 수 있습니다.
World  UWorldSubsystem 상위 항목과 일치, Level 별로 적용

 

C++ 싱글톤에 비해 장점:

  • + 수명은 자동으로 관리됩니다. 올바른 하위 시스템을 하위 클래스로 분류하면 인스턴스가 생성되고 제거됩니다.
  • + 원하는 수명이 명시적으로 지정됩니다.UWorldSubsystem 상속받는 하위 시스템은 World만큼만 존재한다는 것이 분명합니다 .
  • + 더 깨끗한 청사진 액세스.
  • + Python 스크립트에서 액세스할 수 있습니다.
  • - 몇 가지 Unreal 클래스의 수명주기에 대한 이해가 필요합니다.
  • - 대신 Unreal의 액세스 스타일을 배워야 합니다.MyClass::GetInstance()

 

C++에서 하위 시스템에 액세스

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

ULocalPlayer* LocalPlayer = ...;
UMyPlayerSubsystem* MySubsystem = LocalPlayer->GetSubsystem<UMyPlayerSubsystem>();


사용 예


메인 메뉴에서 게임 내까지 게임을 진행하면서 플레이어 원격 측정을 저장하고 싶다고 상상해 보세요. UGameInstanceSubsystem라는 하위 클래스를 만들 수 있습니다 UTelemetrySubsystem. 원격 측정 클래스는 게임이 시작되자마자 인스턴스화되고 원격 측정과 관련된 모든 논리는 해당 하위 시스템 내에 저장됩니다.

하위 시스템 기본 클래스

UCLASS(Abstract)
class ENGINE_API USubsystem : public UObject
{
GENERATED_BODY()

    public:
    USubsystem();

    /** Override to control if the Subsystem should be created at all.
     * For example you could only have your system created on servers.
     * It's important to note that if using this is becomes very important to null check whenever getting the Subsystem.
     *
     * Note: This function is called on the CDO prior to instances being created!
     */
    virtual bool ShouldCreateSubsystem(UObject* Outer) const { return true; }

    /** Implement this for initialization of instances of the system */
    virtual void Initialize(FSubsystemCollectionBase& Collection) {}

    /** Implement this for deinitialization of instances of the system */
    virtual void Deinitialize() {}

    private:
    friend class FSubsystemCollectionBase;
    FSubsystemCollectionBase* InternalOwningSubsystem;

};

 

주의 : 디자이너가 제어할 수 있는 데이터를 공개하려면 대체 방법을 찾아야 합니다.

 

 

 

 

 

Programming Subsystems

An overview of programming subsystems in Unreal Engine 4.

docs.unrealengine.com

 

 

Unreal-style Singletons with Subsystems

Subsystems are a simple way to make modular, globally-accessible logic.

benui.ca

 

반응형