UObject

// ...
// Unreal Header Tool이 빌드 시 자동 생성
#include "MyObject.generated.h"

// 클래스를 리플렉션 시스템에 등록한다
UCLASS()
// MYPROJECT_API 매크로는 해당 클래스의 기능을 다른 모듈에서 쓸 수 있게 해준다
// 요게 없으면 다른 모듈에서 사용 시 심볼을 Link할 수 없어서 Link 에러가 발생한다
class MYPROJECT_API UMyObject : public UObject
{
  // MyObject.generated.h에서 이 매크로를 정의한다
  GENERATED_BODY()
};

// 오브젝트 생성
UMyObject* MyObject = NewObject<UMyObject>();

// Component 생성
UMyObject::UMyObject()
{
  MyActorComponent = CreateDefaultComponent<UMyActorComponent>(TEXT("MyActorComponent"));
}

// Actor 생성
// ...
AActor* MyActor = GetWorld()->SpawnActor<UMyActor>(SpawnInfo);

UObject의 생성 및 삭제 시점

생성 시점

  1. NewObject로 새로운 UObject 인스턴스 생성 시
  2. Actor Spawn이나 Component의 CreateComponent 등

삭제 시점

  1. 해당 객체의 Strong Reference 객체가 존재하지 않을 때, GC Tick에서 Delete
  2. Actor Destroy, ActorComponent의 DestroyComponent 등 명시적 호출
  3. Level이 Destroy될 때 잠초중인 객체들 삭제

Class Default Object

  • 각 UCLASS는 CDO라는 하나의 오브젝트 객체를 유지
  • CDO는 생성자에 의해 생성된 이후, 수정되지 않는 탬플릿 용도의 오브젝트
  • Read-Only지만, GetClass() 메서드를 통해 접근 가능

Garbage Collector

  • Reference Graph를 만들어서 오브젝트들이 Graph의 Root로부터 참조 여부를 검사한다
  • 연결되지 않았다고 판단된 오브젝트들은 모두 GC 대상이 된다

출처

UObject
CDO