C++를 사용한 언리얼 엔진을 학습하던 중, 오브젝트 생성 시 UObject::CreateDefaultObject, New Object<T>, UWorld::SpawnActor<T> 와같은 각기 다른 호출방식이 있었습니다. 이에 대해 어떠한 상황에서 해당 함수들을 호출하는지 학습하고 기록하고자 이번 포스팅을 하게 되었습니다. 또한, 생성자 호출 시 추가적으로 어떠한 과정이 이루어지는지에 대해 알아보던중 CDO를 알게되어 추가적으로 작성하게 되었습니다. 

 

CDO(Class Default Object)

CDO는 엔진이 실행되며 클래스가 로드 될 때 초기화, 생성되는 인스턴스화 되지 않은 기본값을 가지고 있는 객체입니다.

  • C++이 제공하지 않는 언리얼만의 추가 기능들을 제공한다.
  • UClass 클래스에서 추가기능(메타정보)들을 보관한다.
  • 메모리에 한번만 존재하며, 클래스가 로드될 때 자동으로 생성된다.
  • 언리얼 오브젝트를 생성할 때 매번 초기화 하지않고 CDO를 복제해서 사용한다.
    • 객체 생성시 초기값에 대한 일관성 유지 및 재사용으로 인한 생성 비용 감소

 

CDO 생성 및 기본 프로퍼티 값 확인 예시 코드

// AMyCharacter 클래스의 CDO에 접근
AMyCharacter* DefaultCharacter = AMyCharacter::StaticClass()->GetDefaultObject<AMyCharacter>();

// 기본 프로퍼티 값 확인
float DefaultHealth = DefaultCharacter->Health;

 

 

 

CreateDefaultSubObject

  • 클래스의 서브 객체(Ex : Compoenet)들을 생성하고 초기화 하는데 사용한다.
  • 클래스 생성자에서 호출된다.
    • BeginPlay()와 같은 생성자가 아닌 곳에서 호출 시 동적할당으로 생성하게되어 에러가 발생한다.
  • 언리얼 엔진에서 메모리를 관리한다.
  • 생성된 객체는 에디터 단계에서 조작할 수 있다.
// Camera Component와 SpringArm Component를 캐릭터의 컴포넌트로 추가
FPSCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
FPSSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));

 

 

 

 

NewObject

  • 동적으로 객체를 생성할 경우 사용된다.
  • 런타임 단계에서 객체를 생성하고 싶을시에 사용한다.
  • 생성자 단계에서 생성하지 않는 객체들의 생성을 위해 일반적으로 사용된다.
// 런타임 환경에서 객체를 생성하고 싶을 때
// 생성자 이후 객체를 생성 시
UDynamicCreateObject* DCObject = NewObject<UDynamicCreateObject>(this, UDynamicCreateObject::StaticClass());

 

 

 

SpawnActor

  • 액터 객체를 월드에서 동적으로 생성하는 함수
    • 생성자 단계 이후에서 생성해야한다.
  • Transform 정보를 가지는 액터를 스폰하기 위해 사용된다.
  • 액터 라이프사이플에 따른 관리를 받는다.
// 런타임 시 월드에서 액터 스폰
FVector Location(0, 0, 100);
FRotator Rotation(0, 0, 0);
AMonsterActor* SpawnedActor = GetWorld()->SpawnActor<AMonsterActor>(AMonsterActor::StaticClass(), Location, Rotation);

 

 

 

정리

함수 역할 사용 예 주 용도
CreateDefaultSubobject 클래스의 서브 객체(컴포넌트 등) 생성 CreateDefaultSubobject<UCameraComponent>(TEXT("Camera")); 주로 클래스 내부에서 컴포넌트를 생성하고 기본값 설정
NewObject 동적 객체 생성 NewObject<UMyCustomObject>(this, UMyCustomObject::StaticClass()); 런타임에서 새로운 UObject 객체 생성, 주로 데이터 객체 생성
SpawnActor 월드에서 액터 객체 동적 생성 SpawnActor<AMyActor>(AMyActor::StaticClass(), Location, Rotation); 월드에 실제로 존재하는 액터 객체 생성, 게임에서 상호작용 가능

+ Recent posts