오늘은 강의를 듣다 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, 선택 캐릭터)
- 에셋이 많이지면서 패키지 로딩 최적화가 필요한 경우
'언리얼 엔진' 카테고리의 다른 글
| 애니메이션 리타겟팅 하기 (0) | 2025.02.20 |
|---|---|
| 캐릭터 에셋에 붙은 무기 제거하기 (0) | 2025.02.19 |
| 언리얼 엔진 스마트 포인터 (0) | 2025.02.06 |
| 언리얼 Enhanced Input System (0) | 2025.02.05 |
| 부모 액터를 중심으로 회전 하는 자식 액터 만들기 (0) | 2025.01.31 |