언리얼 엔진을 쓰다보면 TSubclassOf를 자주 사용하게 된다. TSubclassOf는 언리얼의 특정 UClass에 대하여 안전성을 보장해주는 템플릿 클래스다.

UPROPERTY(EditAnywhere)로 설정해두고 프로퍼티창에서 클래스등을 편하게 설정하고 뽑게 만들 수 있기 때문이다.

특정 부모 클래스에서 파생된 자식클래스만 선택하게 만들 수 있기 때문에 프로퍼티에서 클래스를 고르다 실패할 확률을 확 줄여준다.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Engine.h"
#include "GameFramework/Actor.h"
#include "TSubclassOfTest.generated.h"

UCLASS()
class TEST_API ATSubclassOfTest : public AActor
{
	GENERATED_BODY()
	
public:	
	ATSubclassOfTest();

	UPROPERTY(EditAnywhere)
	TSubclassOf<ACharacter> HERO;

};
ACharacter 클래스로부터 파생된 클래스들의 리스트

C++ 수준에서 클래스 유형에 대한 안전성을 확보한다고 보면 된다. 호환되지 않는 UClass를 아예 리스트에서 보여주지도 않을 뿐더러 대입자체도 불가능하다.

UClass를 TSubclassOf에 할당하려할 때 할당이 가능한지 런타임에 체크를 하는데, 그 체크가 실패하면 nullptr을 리턴한다. 잘 되었다면 원하던 클래스에 대한 포인터를 받게된다.

대입하는 방식에 따라 Run Time 에서 체크를 할지 Compile Time에서 체크를 할지 결정하게 되는데, 같은 TSubclassOf로 대입할 경우 어느정도의 ClassFilter의 Range를 갖게될지 미리 알 수 있기 때문이다.

//UDamageType UClass 파생 클래스를 저장함
UClass* ClassA = UDamageType::StaticClass();
//TSubclassOf로 선언된 UDamageType 클래스 포인터 선언
TSubclassOf<UDamageType> ClassB;

ClassB = ClassA; // 런타임에 체크함
//UDamageType의 파생 클래스인 UDamageType_Lava의 파생 클래스 포인터인 ClassC 선언
TSubclassOf<UDamageType_Lava> ClassC;

ClassB = ClassC; // 컴파일 타임에 체크함