TSubclassOf<T>
TSubclassOf 클래스는 UClass 타입 안정성을 제공하는 템플릿 클래스이다.
예를 들어, 데미지 타입을 지정할 수 있는 발사체 클래스를 만든다고 가정했을 때, 다음 코드처럼 UClass 타입의 UPROPERTY를 만들어서 에디터에 노출시킨 뒤, 에디터 작업자에게 이 프로퍼티에 UDamageType의 파생 클래스만 할당해 달라고 한다면 어떻게 될까?
UPROPERTY(EditDefaultsOnly, Category = Damage)
UClass* DamageType;
블루프린트 에디터의 디테일 패널에서 Damage Type 프로퍼티에 클래스를 할당하기 위해서 드롭다운 메뉴를 확장해보면 클래스 타입에 상관없이 모든 클래스가 표시되고 있음을 볼 수 있다. 이런 상황에서 UDamageType의 파생 클래스만 할당해달라고 한다면, 낮은 확률으로라도 언젠가는 잘못된 클래스를 할당하는 일이 분명 생길 수 밖에 없다.
이러한 문제를 예방하기 위해서 존재하는 것이 바로 TSubclssOf 클래스이다. 다음 코드와 같이 TSubclassOf<UDamageType>으로 UPROPERTY를 만든다.
UPROPERTY(EditDefaultsOnly, Category = Damage)
TSubclassOf<UDamageType> DamageType;
그렇게 하면, 블루프린트 창의 디테일 패널에서 Damage Type의 드롭다운 메뉴에서는 UDamageType의 파생 클래스만 표시된다. 이렇게 되면 개발자가 가끔 잘못된 데미지 타입을 골라서 넣는 실수는 할 수 있겠지만, 애초에 잘못된 클래스를 선택하는 문제는 발생하지 않을 것이다.
또한 TSubclassOf 클래스는 이런 UPROPERTY에 대한 안정성 이외에 C++ 수준의 타입 안정성 역시 제공하기 때문에 서로 호환되지 않는 TSubclassOf 타입을 서로 할당하려고 하면 컴파일 오류가 발생하고, UClass 타입을 할당하려고 하면 할당을 수행할 수 있는지 런타임중에 검사한다. 런타임 검사에 실패하면 결과값은 nullptr이 된다.
UClass* ClassA = UDamageType::StaticClass();
TSubclassOf<UDamageType> ClassB;
ClassB = ClassA; // 런타임 중에 체크.
TSubclassOf<UFireDamageType> ClassC;
ClassB = ClassC; // 컴파일 타임 중에 체크
[투네이션]
[Patreon]
[디스코드 채널]
'Unreal Engine4 > Programming' 카테고리의 다른 글
[UE4] Programming - RPG :: 마우스 입력 이동 구현하기 (1) | 2018.12.15 |
---|---|
[UE4] Programming - Player Controller (0) | 2018.12.11 |
[UE4] Programming - 필요없어진 C++ 클래스 삭제하기 (1) | 2018.11.25 |
[UE4] Programming - C++ / USTRUCT 사용자 정의 구조체 만들기 (1) | 2018.11.24 |
[UE4] Programming - 로그 출력하기 (3) | 2018.10.31 |