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); | 월드에 실제로 존재하는 액터 객체 생성, 게임에서 상호작용 가능 |
'Unreal Engine > 개념정리' 카테고리의 다른 글
[UE5] - 게임 플레이 프레임워크 (GameMode / GameState / PlayerController / PlayerState) + GameInstance (0) | 2025.01.31 |
---|---|
[UE5] - Actor, Pawn, Character (0) | 2025.01.24 |
Unreal Engine - 델리게이트 Delegate (1) | 2024.12.30 |
언리얼 컨테이너 라이브러리 (TMap, TSet) (0) | 2024.12.20 |
언리얼 컨테이너 라이브러리 , STL 차이점 (+ TArray) (0) | 2024.12.19 |