게임 개발/Unreal Engine 기본

StaticClass, TSubclassOf, CDO

지노윈 2025. 12. 29. 13:10
반응형

1. StaticClass()

"클래스 그 자체의 정보(설계도)를 가져오는 함수"

C++에서는 클래스 이름(예: AMyActor)을 변수에 담거나 런타임에 직접 조작할 수 없습니다. 하지만 언리얼 엔진은 UClass라는 객체를 통해 클래스의 메타데이터(변수 목록, 함수 목록, 부모 클래스 등)를 관리합니다.

  • 역할: 특정 클래스에 대응하는 UClass 타입의 포인터를 반환합니다.
  • 특징: 정적(static) 함수이므로 인스턴스가 없어도 클래스이름::StaticClass() 형태로 호출할 수 있습니다.
  • 사용 예시:
  • C++
     
    // AMyActor 클래스의 정보를 가져옴
    UClass* MyClassInfo = AMyActor::StaticClass(); 
    
    // 특정 객체가 이 클래스 타입인지 확인할 때
    if (SomeActor->GetClass() == AMyActor::StaticClass()) { ... }
    

2. TSubclassOf<T>

"특정 클래스를 상속받은 '클래스 유형'만 담는 안전한 주머니"

UClass*는 모든 언리얼 클래스 정보를 담을 수 있어 너무 광범위합니다. 반면 TSubclassOf는 템플릿을 사용해 특정 부모 클래스를 상속받은 클래스들만 선택할 수 있도록 제한합니다.

  • 역할: 클래스 타입의 **유형 안전성(Type Safety)**을 보장합니다.
  • 특징: * 에디터 연동: UPROPERTY로 선언하면 에디터 상세 창(Details)에서 지정한 클래스(T)와 그 자식 클래스들만 드롭다운 목록에 나타납니다.
    • 런타임 안전: 엉뚱한 클래스가 할당되는 것을 컴파일 타임 혹은 런타임에 방지합니다.
  • 사용 예시:
  • C++
     
    // 에디터에서 AProjectile을 상속받은 블루프린트만 선택 가능하게 함
    UPROPERTY(EditAnywhere, Category = "Combat")
    TSubclassOf<AProjectile> ProjectileClass;
    
    // 선택된 클래스 유형을 이용해 실제로 스폰함
    GetWorld()->SpawnActor<AProjectile>(ProjectileClass, SpawnLocation, SpawnRotation);
    

3. CDO (Class Default Object)

"모든 인스턴스의 모태가 되는 '기본 객체(원본)'"

언리얼 엔진은 엔진이 초기화될 때 각 UClass마다 단 하나의 인스턴스를 미리 생성해 둡니다. 이것이 바로 클래스 디폴트 오브젝트(CDO)입니다.

  • 역할: 새로운 객체가 생성될 때 "기본값"을 복사해주는 템플릿(Master Copy) 역할을 합니다.
  • 특징:
    • 클래스의 생성자가 호출되어 속성값이 설정된 직후의 상태를 저장합니다.
    • 객체를 수천 개 생성할 때 매번 복잡한 초기화 계산을 하는 대신, 메모리에 이미 있는 **CDO를 통째로 복사(Copy)**하여 성능을 최적화합니다.
    • 런타임에 특정 클래스의 기본 공격력이나 기본 속도 같은 설정값만 확인하고 싶을 때 인스턴스를 스폰할 필요 없이 CDO를 조회하면 됩니다.
  • 사용 예시:
  • C++
     
    // 클래스 정보를 통해 CDO를 가져옴
    AMyActor* DefaultActor = GetDefault<AMyActor>();
    
    // 또는 UClass를 통해 가져옴
    AMyActor* DefaultObj = MyClassInfo->GetDefaultObject<AMyActor>();
    
    // 이 값은 게임 세상에 배치된 액터가 아니라, '원본 설계도에 적힌 기본값'입니다.
    float BaseHP = DefaultObj->Health; 
    

요약 및 관계도

개념 비유 설명
StaticClass 설계도 정보 클래스가 어떤 변수와 함수를 가졌는지 기록된 메타데이터
TSubclassOf 설계도 보관함 특정 종류의 설계도들만 모아두는 바구니 (안전장치)
CDO 전시용 샘플 설계도대로 딱 하나 미리 만들어둔 원본 샘플 (복제용)

실제 흐름:

  1. StaticClass()로 클래스 정보를 찾습니다.
  2. 이 정보를 TSubclassOf 변수에 저장해둡니다.
  3. 새 객체를 만들 때, 엔진은 해당 클래스의 CDO를 찾아 그 내용을 그대로 복사해 새로운 인스턴스를 탄생시킵니다.
반응형