반응형
[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;
};
주의 : 디자이너가 제어할 수 있는 데이터를 공개하려면 대체 방법을 찾아야 합니다.
반응형
'Unreal > Manual' 카테고리의 다른 글
Unreal 언리얼 네트워크 복제 시스템 이해 (0) | 2024.03.16 |
---|---|
Unreal 멀티 플레이어 온라인 서브시스템 Steam 연결하기 (2) | 2024.03.15 |
Unreal 수명이 관리되는 자동 인스턴싱 프로그래밍 서브시스템(Programming Subsystems) (0) | 2024.03.15 |
Unreal 하드코딩 된 REGISTER_NAME (1) | 2024.03.15 |
Unreal Steam Online Subsystem Steam 세션 생성하기 (3) | 2024.03.15 |