UObject는 언리얼 엔진에서 모든 클래스의 부모 클래스로 언리얼 클래스들은 UObject에서 파생, 리플렉션 시스템(Reflection System)과 가비지 컬렉션(Garbage Collection)과 같은 엔진의 핵심 기능을 제공한다
역할
특징
기능
가비지 컬렉션(Garbage Collection) : 가비지 컬렉션 시스템을 통해 객체들이 자동으로 메모리에서 해제. 이를 위해 스마트 포인터 사용 권장
AddToRoot()
메서드로 객체를 루트 세트에 추가RemoveFromRoot()
를 호출하여 루트 세트에서 해당 객체를 제거해야함UObject
의 MarkPendingKill()
메서드가 호출되어 삭제 대기 상태로 설정UObject::Destroy()
등의 메서드를 호출하여 고아 객체들을 메모리에서 삭제직렬화(Serialization) : 객체의 상태를 바이트 스트림 형태로 변환하여 디스크에 저장하거나 네트워크로 전송할 수 있도록 하는 과정. 캐릭터의 체력을 100 → 200으로 변경하고 저장하면 다음에 불러올 때 캐릭터의 체력을 200으로 불러옴
리플렉션 시스템(Reflection System) : Reflection은 런타임에 인스턴스의 데이터 정보를 확인할 수 있는 기능
UCLASS()
: 언리얼 엔진에서 클래스가 리플렉션 시스템에 등록될 수 있도록 하는 매크로UCLASS()
매크로가 붙은 클래스는 UObject를 상속받으므로, 언리얼 엔진의 가비지 컬렉션, 메모리 관리 등 시스템에서 관리UCLASS()
와 UPROPERTY()
를 특수한 클래스와 함께 사용하면 객체의 변수를 직렬화할 수 있고 Replicated
와 같은 옵션(지정자)를 사용하면 네트워크 통신도 가능UPROPERTY()
: UObject 기반 클래스의 속성(변수)의 메타데이터를 리플렉션 시스템에 등록UFUNCTION()
: UObject 기반 클래스의 함수를 리플렉션 시스템에 등록UENUM()
: 열거형을 리플렉션 시스템에 등록USTRUCT()
: 해당 구조체를 리플렉션 시스템에 등록UCLASS()
가 아닌)도 리플렉션 시스템 활성화나 가비지 컬렉션에 의한 메모리 관리를 할 수 있게 해주고, 지정자에 따라 에디터 및 블루 프린트 통합, 네트워크 시스템 통합 등을 할 수 있게 해준다UClass
, UProperty
, UFunction
, UEnum
, UDelegate
등은 메타데이터를 관리하고 리플렉션 시스템을 활용하는 데 사용되는 클래스로 매크로와 생김새가 비슷하지만 헷갈리지 않도록 유의동적 할당 : NewObject<T>()
함수를 호출하여 객체를 동적으로 생성할 수 있다
new
키워드를 사용하면 안된다상속 및 다형성 : UObejct
를 상속한 클래스는 UObject
의 모든 기능을 사용할 수 있다
AActor는 UObject를 상속한 클래스로, 언리얼 엔진의 world에 존재할 수 있는 모든 게임 오브젝트의 기본 클래스
역할
특징
USceneComponent
와 그 하위 클래스UStaticMeshComponent
, USkeletalMeshComponent
등.UBoxComponent
, USphereComponent
등.UCameraComponent
, USpringArmComponent
, UMovementComponent
UObject
를 상속BeginPlay()
, Tick()
, Destroy()
등 라이프 사이클 이벤트를 활용BeginPlay()
: 액터가 처음 활성화될 때 한 번 호출되는 함수Tick()
: 매 프레임 호출되는 함수Destroy()
: 액터와 관련된 모든 리소스를 해제하고 액터를 파괴EndPlay()
호출EndPlay(const EEndPlayReason::Type EndPlayReason)
: 액터가 파괴되거나 월드에서 제거될 때 호출기능
AActor
는 UObject
를 상속받기 때문에 UObject
에서 제공하는 여러 기능을 사용할 수 있을 뿐만 아니라 추가적인 기능을 제공UObject
와의 차이
AActor
는 UObject
와 다르게 UWorld::SpawnActor<T>()
함수를 사용해야 world에 배치할 수 있고 다른 객체들과 상호작용할 수 있다AActor
는 world와 강한 연계가 되어 있어 일반적으로 가비지 컬렉션의 대상이 아님Destroy()
를 호출하여 명시적으로 제거해야 함 Destroy()
는 내부적으로 Destroyed()
와 EndPlay()
를 호출하고 액터를 삭제 준비 상태("Pending Kill")로 만든다Destroyed()
함수는 Unreal Engine에서 AActor 클래스에 정의된 가상 함수. 액터 삭제에 대한 후처리 작업의 시작 지점으로, EndPlay()
가 그 과정의 일부로 호출된다.EndPlay()
는 주변 정리를 함Destroy
호출 순서가 Destroy() -> DestroyActor() -> Destroyed() -> RouteEndPlay() -> BeginPlay() 했으면 EndPlay() 호출 -> Component들의 EndPlay() -> RouteEndPlay() 중간 부분에서 World->RemoveNetworkActor(this) + 끝 부분에서 UninitializeComponents() -> DestroyActor() 끝 부분에서 "<Pending Kill>"참조 사이트
1. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/actors-in-unreal-engine
2. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-object-handling-in-unreal-engine#%EC%9E%90%EB%8F%99%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EC%B4%88%EA%B8%B0%ED%99%94
3. https://www.unrealengine.com/ko/blog/unreal-property-system-reflection
4. http://heukkellsoft.net/HeukKellLab/Page/UnrealEngine/Archietecture/UObject/Concept/ObjectSystem/Page.html
5. https://minusi.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC-UPROPERTY-Unreal-UPROPERTY