UGameInstanceSubsystem을 상속받은 c++ 클래스는 싱글턴처럼 하나만 생성되는 게 원칙이다.

UCLASS()
class MYGAME_API UMySubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
	...
};

 

서브 시스템을 가져다 쓸 때는 클래스 타입으로 검색해서 사용한다.

GetGameInstance()->GetSubsystem<UMySubsystem>()

 

그런데, 만약 c++ 클래스를 상속 받은 블루프린트 클래스를 만들어서 그걸 사용하고 싶다면 어떻게 해야 하는지 궁금해졌다. 검색해서 알아낸 방법은 다음과 같다.

 

먼저, c++의 서브시스템을 블루프린트에서 상속 받을 수 있게 Blueprintable 속성을 추가하고, ShouldCreateSubsystem 함수를 오버라이드해서 c++ 클래스의 생성은 막고 블루프린트 클래스만 생성할 수 있게 한다.

// MySubsystem.h
UCLASS(Blueprintable)
class MYGAME_API UMySubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
	
public:
	virtual bool ShouldCreateSubsystem(UObject* Outer) const override;
    ...
};

// MySubsystem.cpp
bool UMySubsystem::ShouldCreateSubsystem(UObject* Outer) const
{
	// BP 클래스만 생성하자.
	if (this->GetClass()->IsInBlueprint())
	{
		return true;
	}

	return false;
}

 

에디터를 실행해서 MySubsystem을 상속 받는 BP_MySubsystem이라는 블루프린트 클래스를 생성한다.

 

일단 이렇게만 해도 에디터 플레이에서는 잘 작동한다.

 

하지만, 패키징 단계에서 해당 블루프린트 클래스에 대한 참조가 없으면 누락될 수 있으니, GameInstance에서 클래스 참조를 넣어 두자.

UCLASS(BlueprintType, Blueprintable)
class MYGAME_API UMyGameInstance : public UGameInstance
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly) 
	TSubclassOf<UMySubsystem> MySubsystemClass;

변수 선언은 위와 같이 하고, UMyGameInstance를 상속받은 블루프린트 클래스(예: BP_MyGameInstance)에서 MySubsystemClass 변수값에 BP_MySubsystem를 지정해 두도록 하자.

+ Recent posts