UObject
- UObject는 Unreal Engine에서 가장 기본이 되는 객체다
- UCLASS 매크로 선언으로 UObject를 관리하는 시스템이 이를 인식한다
- Reflection System을 통해 Garbage Collection을 수행하는 등의 역할
Object를 생성하는 방법
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
GENERATED_BODY()
// ...
};
// 가장 일반적인 방법이다
UMyObject* Object2 = NewObject<UMyObject>();
// 아래 방법은 new operator를 overload해야 한다
UMyObject* Object1 = new UMyObject();
// 아래 방법은 4.8 부터 deprecated 되었다
UMyObject* Object3 = NewNamedObject<UMyObject>();
UMyObject* Object4 = ConstructObject<UMyObject>();
UObject는 언제 삭제되는가?
- 엔진이 더 이상 해당 Object를 참조하지 않을 때, Garbage Collection System에 의해 소멸처리 된다
- 마지막으로 참조하던 포인터가 null이 되는 순간
- Strong Reference를 갖지 않는 Actor에 대해 발생한다
MarkPendingKill
- 위 함수는 더 이상 사용하지 않고, PendingKill 기능이 활성화되어 있다면 MarkAsGarbage가 유사한 방식으로 작동하여 대체한다
- 어떤 Object로의 Reference를 모두 null로 만든다
- 다음 Garbage Collection 때 이 Object를 소멸 처리한다
MarkAsGarbage(), IsValid()의 동작 방식
- MarkAsGarbage
- PendingKill 기능이 활성화 되어 있다면 MarkPendingKill와 유사한 방식으로 동작한다
- bPendingKillDisabled는 GPendingKillEnabled의 역 값이며, 이 값이 true인 경우 Garbage Collection에 의해 자동으로 null 처리되지 않는다
- 어떤 Object로의 reference를 모두 null로 만든다
- 다음 Garbage Collection이 작동할 때, 이 Object를 소멸한다
- IsValid
- 인자로 받은 Pointer가 현재 사용되는 Object를 가리키고 있는지 확인
- Reference Graph에서 탐색하고 결과값이 존재하는지 여부를 bool 값으로 반환
IsValid()와 IsVAalidLowLevel()의 차이점
- IsValid는 Object Pointer가 null 여부 및 Garbage collection 대상 여부인지를 확인
- IsValidLowLevel은 IsValid와 동일한 null check를 수행하지만 extra check를 수행한다
- this == nullptr -> null 상태인지 확인
- !ClassPrivate -> Reflection System에 올바르게 등록되었는지 확인
- GUObjectArray.IsValid(this) -> GUObjectArray에서 정상적인 index를 갖고 있는지, 즉 범위 안에 있는지 혹은 해당 index가 다른 Object로 override된 상태가 아닌지 확인
DefaultSuboject란?
- Subobject란 Actor를 구성하는 Component를 의미한다
- 부모 Actor에 할당되는 자식 Actor 역시 ChildActorComponent로 분류한다
- 부모 Actor가 생성 및 초기화하면서 자동으로 생성되는 Component들 역시, 생성된 이후 Default 값으로 초기화된 상태로 부모 Actor에 Attach 된다
C++ 클래스를 상속한 Blueprint Class 만들기
출처