1. 개요
언리얼 엔진에는 다양한 객체 생성 방법이 있다.
오늘 아래의 생성 함수의 차이에 대해 살펴보았다.
- CreateDefaultSubobject()
- NewObject()
- SpawnActor()
2. 주요 관점
위 생성 함수들을 호출할 때 어떤 점을 고려하면 좋을지 나열해 보았다.
- 함수 역할
- 호출 위치
- 객체 생성 시점
- 객체 월드 포함 여부
- 객체 소유권
- 객체 메모리 관리
3. CreateDefaultSubobject
MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComp"));
| 함수 역할 | 액터의 컴포넌트 또는 서브 오브젝트(UObject의 하위 오브젝트)를 생성할 때 사용한다. |
| 호출 위치 | 생성자에서만 함수를 호출한다. |
| 객체 생성 시점 | 엔진 초기화시 생성된다. (언리얼 에디터가 실행되는 시점 / 게임이 실행되는 시점) |
| 객체 월드 포함 여부 | 소유하는 액터를 통해 월드에 배치된다. |
| 객체 소유권 | 소유하는 액터의 일부이다. (의존적이다) |
| 메모리 관리 | 소유하는 액터가 파괴되면 함께 삭제된다. |
4. NewObject
/* UClass* AItemClass */
AActor* MyObjectInstance = NewObject<AActor>(AItemClass);
| 함수 역할 | UObject 팩토리 메서드이다. 언리얼 오브젝트(UObject)를 생성할 때 사용한다. |
| 호출 위치 | 생성자 이후에 함수를 호출한다. |
| 객체 생성 시점 | 런타임에 생성된다. |
| 객체 월드 포함 여부 | 월드에 배치되지 않으며 메모리에만 존재한다. |
| 객체 소유권 | 소유하는 언리얼 오브젝트의 일부이다. (의존적이다) |
| 메모리 관리 | 소유하는 언리얼 오브젝트가 파괴되면 함께 삭제된다. 단, UPROPERTY()를 설정하지 않으면 가비지 컬렉션에 의해 강제 삭제된다. |
5. SpawnActor
GetWorld()->SpawnActor<AActor>(UClass*, FVector, FRotator);
| 함수 역할 | 주로 액터(AActor)를 스폰할 때 사용한다. |
| 호출 위치 | 생성자 이후에 함수를 호출한다. |
| 객체 생성 시점 | 런타임에 생성된다. |
| 객체 월드 포함 여부 | 월드에 배치된다. 그리고 월드에 의해 관리된다. |
| 객체 소유권 | 레벨 독립적인 존재이다. |
| 메모리 관리 | 소유하는 언리얼 오브젝트가 없음으로 Destroy()함수를 호출하기 전까지 메모리에 유지된다. |
6. 정리
생성자에서는 CreateDefaultSubobject
생성자 이후, 월드에 배치할 Actor를 스폰한다면 SpawnActor
생성자 이후, 월드에 배치되지 않는 UObject를 생성한다면 NewObejct를 사용한다.