게임 개발/Unreal Engine 기본

Unreal Engine CDO 사용 방법

지노윈 2025. 12. 30. 13:18
반응형

1. 코드에서 CDO에 접근하는 방법

실행 시간에 특정 클래스의 기본값을 가져오고 싶을 때, 액터를 스폰(SpawnActor)하지 않고도 아래의 함수들을 사용하여 CDO에 접근할 수 있습니다.

GetDefault<T>() 사용 (가장 권장됨)

템플릿 기반으로 작성되어 가독성이 좋고 안전합니다.

// AMyWeapon 클래스의 CDO에서 기본 데미지 값을 가져오기
AMyWeapon* DefaultWeapon = GetDefault<AMyWeapon>();
float Damage = DefaultWeapon->BaseDamage;

// 클래스 변수(UClass*)가 있을 때
UClass* WeaponClass = AMyWeapon::StaticClass();
const AMyWeapon* DefaultObj = GetDefault<AMyWeapon>(WeaponClass);

GetDefaultObject() 사용

UClass 포인터를 가지고 있을 때 유용하며, UObject 타입을 반환하므로 형변환이 필요합니다.

UClass* MyClass = AMyActor::StaticClass();
AMyActor* CDO = MyClass->GetDefaultObject<AMyActor>();

2. 생성자(Constructor)와 CDO의 관계

언리얼 엔진에서 생성자는 주로 CDO를 설정하기 위해 실행됩니다. 우리가 생성자 내부에 작성하는 코드들은 사실상 "이 클래스의 마스터 복사본(CDO)은 이렇게 생겨야 한다"라고 정의하는 과정입니다.

생성자에서 주로 하는 일

  • 컴포넌트 생성: CreateDefaultSubobject를 사용하여 기본 컴포넌트 구조를 잡습니다.
  • 기본값 할당: 변수의 초기값을 설정합니다.
  • 에셋 레퍼런스 지정: FObjectFinder 등을 통해 기본 메쉬나 텍스처를 연결합니다.
AMyCharacter::AMyCharacter()
{
    // CDO에 포함될 기본 컴포넌트 생성
    MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualMesh"));
    
    // CDO의 기본 변수값 설정
    MoveSpeed = 600.0f;
    bCanDoubleJump = false;
}

3. CDO 사용 시 주의할 점 (심화)

런타임 수정 금지

앞서 말씀드렸듯 CDO는 전역 마스터입니다. 만약 게임 도중에 GetDefault<AMyCharacter>()->MoveSpeed = 1000.0f; 처럼 값을 수정하면, 그 이후에 생성되는 모든 캐릭터의 기본 이동 속도가 1000으로 고정됩니다. (이것은 의도치 않은 버그의 원인이 됩니다.)

가비지 컬렉션 (GC)

CDO는 엔진이 켜져 있는 동안 절대 파괴되지 않습니다. 따라서 CDO가 참조하고 있는 에셋(메쉬, 텍스처 등)들도 게임 내내 메모리에 상주하게 됩니다. 생성자에서 너무 무거운 에셋을 너무 많이 참조하지 않도록 주의해야 하는 이유입니다.

로직 실행 자제

생성자는 엔진 초기화 단계(에디터 로딩 중 포함)에서 실행되므로, 월드에 접근하거나(GetWorld()), 다른 액터를 참조하는 등의 동적인 로직은 절대 생성자에 넣으면 안 됩니다. 그런 로직은 BeginPlay()에서 처리해야 합니다.

 

반응형