오늘은 강의를 듣다 TSubclassOf<>와 TSoftclassPtr<>에 대해 궁금해서 알아봤습니다.

 

 

TSubclassOf<>란?

 

 TSubclassOf<>는 특정 클래스 또는 그 하위 클래스를 저장할 수 있는 템플릿이다.

  • 컴파일 타임에 UCLASS()로 선언된 클래스 타입을 강제할 수 있다.
  • 런타임 시점에서도 GetDefalutObject() 등을 통해 클래스 정보를 가져올 수 있다.
  • 하드 래퍼런스를 가지므로 클래스가 항상 메모리에 로드된다.

 

예시 코드

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    // 특정 AActor를 상속받은 클래스만 할당 가능
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Config")
    TSubclassOf<AActor> ActorClass; // AActor의 하위 클래스만 저장 가능(UClass* 형태)

    void SpawnMyActor(UWorld* World)
    {
        if (ActorClass) // 유효한 클래스인지 확인
        {
            World->SpawnActor<AActor>(ActorClass, FVector(0, 0, 100), FRotator::ZeroRotator);
            // ActorClass의 인스턴스 생성
        }
    }
};

 

 

TSoftClassPtr<>이란?

 

 TSoftClassPtr<>은 클래스를 경로로 저장하는 소프트 래퍼런스 포인터이다.

  • 언리얼의 ASset Registryt를 이용하여 클래스를 경로 기반으로 참조한다.
  • 객체를 직접 참조하지 않으므로 메모리를 절약할 수 있다.
  • LoadSynchronous() 또는 AsyncLoadClass()를 호출하여 명시적으로 로드해야 한다.

 

예제 코드

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    // TSoftClassPtr을 사용하여 클래스 경로만 저장 (메모리 절약)
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Config")
    TSoftClassPtr<AActor> ActorSoftClass; // 실제 객체가 아니라 경로만 저장

    void LoadAndSpawnActor(UWorld* World)
    {
        if (ActorSoftClass.IsValid()) // 경로가 유효한지 확인
        {
            // 동기적으로 로드 (런타임 성능 고려 필요)
            UClass* LoadedClass = ActorSoftClass.LoadSynchronous();
            if (LoadedClass)
            {
                World->SpawnActor<AActor>(LoadedClass, FVector(0, 0, 100), FRotator::ZeroRotator);
            }
        }
    }
};

 

 

TSubclassOf<> vs TSoftClassPtr<> 비교

 

비교 항목 TSubclassOf<> TSoftClassPtr<>
메모리 사용 하드 래퍼런스 (항상 로드) 소프트 래퍼런스 (지연 로딩 가능)
블루프린트 지원 가능 가능
런타임 접근 즉시 사용 가능 LoadSynchronous() 필요
GC 자동 관리 로딩 시 직접 관리 필요
주 용도 런타임에 즉시 사용할 클래스 저장 클래스의 경로만 저장하여 메모리 절약

 

 

TSubclassOf<> 와 TSoftClassPtr<> 사용 시기

 

TSubclassOf<> 사용 시기

  • 클래스가 항상 메모리에 로드되어 있어야 할 때
  • 즉시 액세스 해야 하며 성능이 중요한 경우 (ex: 스폰 시스템)
  • 컴파일 타임에 타입 안전성을 보장해야 할 때

TSoftClassPtr<> 사용 시기

  • 메모리를 절약해야 하며 클래스를 필요할 때만 로드할 때
  • 특정 클래스가 필요하지 않을 수도 있는 경우 (ex: DLC, 선택 캐릭터)
  • 에셋이 많이지면서 패키지 로딩  최적화가 필요한 경우

+ Recent posts