Actor
레벨에 배치가 가능한 오브젝트를 말한다. 트랜스폼을 지원하는 범용 클래스이다.
Object
매크로로 해당 클래스에 대한 인스턴스 정보를 읽을 수 있다. 언리얼에서 제공하는 가장 기본적인 오브젝트는 UObject로 생성시 디폴트 생성자를 호출한다.
절대로 New Keyword를 이용해 생성하면 안된다. 언리얼 엔진으로 관리가 되기 위해서는 누수가 발생할 위험이 크다.
#pragma once
#include 'Object.h'
#include 'MyObject.generated.h' // Unreal Engine 부분
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
GENERATED_BODY()
};
오브젝트가 더 이상 참조되지 않을 때 가비지 컬렉션 시스템이 자동으로 오브젝트를 파괴한다. (Shared_ptr 방식) 강한 참조를 가져서는 안된다. 가비지 컬렉터를 실행하면, 참조되지 않는 오브젝트를 발견하면 메모리에서 제거한다. 또한 MarkPendingKill()함수를 오브젝트에서 바로 호출할 수 있다. 이 함수는 오브젝트에 대한 모든 포인터를 NULL로 설정하고 글로벌 검색에서 오브젝트를 제거한다. 오브젝트는 다음 가비지 컬렉션 패스에서 완전히 삭제 된다.
Object->MarkPendingKill은 Object->MarkAsGarbage()로 대체 되었다.
새로운 함수는 오래된 오브젝트를 추적하는 용도로만 사용한다.
gc.pendingKillEnabled = true인 경우 PendingKill로 표시된 오브젝트는 자동으로 NULL이 되고 가비지 컬렉터에 의해 삭제된다. 강한 참조가 있다면 UObject가 유지된다 그렇기 때문에 이러한 레퍼런스가 UObject를 활성화 한 상태로 유지하는 것을 원하지 않는 경우 WeakPointer를 사용하도록 변환하거나, 수동으로 삭제하는 노멀 포인터여야 한다.
값의 확인은 IsValid를 통해서 해야한다. MarkGarbage는 플래그 표시를 하지만 오브젝트 자체는 해당 오브젝트에 대한 모든 레퍼런스가 해제될 때까지 가비지 컬렉션 되지 않는다.
엑터의 경우, Destroy()가 호출되어서 레벨에서 제거되었어도, 해당 엑터에 대한 모든 레퍼런스가 해제될 때까지 가비지 컬렉션 되지 않는다.(SharedPtr특성)
UCLASS()
- 이 클래스를 언리얼 엔진의 리플렉션 시스템에서 인식하도록 하는 매크로입니다. (이후 강의에서 배우는 내용)
- 언리얼 에디터에서 이 클래스를 블루프린트로 확장할 수 있게 하고, 에디터의 여러 기능과 연동하도록 합니다.
class SPARTAPROJECT_API AItem : public AActor
AActor를 상속받아AItem클래스를 정의한다는 의미입니다.AItem
- 언리얼 엔진 C++에서는 클래스 이름에 접두사를 붙이는 컨벤션이 있습니다.
A(Actor 계열),U(Object 계열),F(일반 구조체),T(템플릿),E(열거형) 등- 우리는 Item 이라는 이름으로 클래스를 만들었지만, 실제 클래스 이름은
Actor클래스를 상속받았으므로,AItem으로 생성됩니다.- 언리얼 엔진 코드 컨벤션 문서
SPARTAPROJECT_API는 이 클래스를 모듈 (여기서는 SpartaProject) 외부로 Export하기 위한 매크로입니다. DLL 등으로 빌드할 때 필요한 선언입니다.GENERATED_BODY()
UCLASS()와 짝을 이루어, 엔진 리플렉션에 필요한 코드를 자동 생성해 주는 매크로입니다.