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
{
TArray<UClass*> ChildClasses;
GetDerivedClasses(GetClass(), ChildClasses, false);
return (ChildClasses.Num() == 0); // 최종 자식 클래스만 생성
}
에디터를 실행해서 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를 지정해 두도록 하자.
'개발 > 언리얼' 카테고리의 다른 글
[UE5] 언리얼 엔진 5.4 빌드 에러 (14.38) (2) | 2024.07.01 |
---|---|
[UE5] 오브젝트 클래스에서 BP 함수 라이브러리 호출하기 (0) | 2024.06.24 |
[UE4] Shipping 클라에서 ini 설정파일 이용막기 (0) | 2022.11.16 |
[UE4] 언리얼 엔진의 각종 버그 대처법 (0) | 2022.05.08 |
[UE4] 언리얼 데이터 에셋에서 TArray<enum>은 사용하지 말자 (0) | 2022.04.24 |