최근 업데이트 2025년 9월 21일 일요일
돌아가기
목차
프로그램이 실행 중에 자기 자신의 구조를 조사하고 수정할 수 있는 기능을 리플렉션이라 합니다.
C++이 제공하지 않는 리플렉션을 UHT(Unreal Header Tool)가 빌드 시점에 생성한다. RTTI 뿐만 아니라 클래스, 변수, 함수에 대한 구조적 정보와 부가 속성(메타데이터)를 엔진 내부에 저장하고, 그걸 기반으로 여러 엔진 기능이 동작하기 때문입니다.
언리얼에서 오브젝트의 베이스 클래스는 UObjet
입니다. UCLASS
매크로는 UObject
에서 파생된 클래스에 태그를 지정하여 UObject 처리 시스템이 인식하도록 할 수 있습니다.
**클래스 디폴트 오브젝트(CDO)**라는 하나의 오브젝트를 갖습니다. CDO는 기본적으로 클래스 생성자에 의해 생성되고 이후에는 수정되지 않는 디폴트 템플릿 오브젝트입니다.
UCLASS와 CDO는 보통 읽기 전용으로 간주되어야하지만 주어진 오브젝트 인스턴스에서 얻어올 수 있습니다. 오브젝트 인스턴스에 대한 UCLASS는 GetClass() 함수를 통해 언제든지 접근할 수 있습니다.
UCLASS 매크로는 클래스를 정의하는 프로퍼티와 함수들의 집합을 포함합니다. 이것들은 표준 C++ 코드의 함수와 변수들이지만 언리얼 엔진에 특화된 메타데이터가 있어 오브젝트 시스템에서 어떻게 행동하는지 제어할 수 있습니다.
UObject는 모든 타입의 함수 또는 멤버 변수를 가질 수 있습니다. 언리얼 엔진이 이러한 변수나 함수를 인식하고 조작하려면 특수 매크로로 표시하고, 타입 표준을 지켜야합니다. 이 특수 매크로를 통해 변수 이름, 타입, 접근 권한, 에디터 표시 방식, 블루프린트 접근 가능 여부, 네트워크 동기화 여부등을 조절할 수 있습니다.
<aside> 💡
참고
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-uproperties https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ufunctions-in-unreal-engine
</aside>
UObject는 생성자 인자를 지원하지 않습니다. 모든 C++ 오브젝트는 엔진 시작 시 초기화되며, 디폴트 생성자를 호출합니다. 디폴트 생성자가 없으면 UObject가 컴파일되지 않습니다.
UObject 생성자는 가벼워야 하고, 디폴트 값과 서브오브젝트를 구성하는 데에만 사용되어야 합니다. 생성 시 다른 함수 기능을 호출해서는 안됩니다.
UObject는 런타임에 NewObject
를 사용하거나, 생성자의 경우 CreateDefaultSubobject
를 사용하여 생성해야 합니다.
이처럼 UObject 파생 타입이, 제공하는 기능을 활용하려면 해당 타입에 대한 헤더 파일에서 전처리 단계를 실행하여 필요한 정보를 대조해야 합니다. 이 전처리 단계는 UnrealHeaderTool, 줄여서 UHT에서 수행합니다. UObject 파생 타입에는 준수해야하는 특정 구조가 있습니다.
UObject의 구현은 특정 기본 구조를 준수해야 합니다. 에디터의 New C++ Class 명령을 사용하는 것은 올바른 포맷의 헤더 파일을 구성하는 가장 쉬운 방법입니다.
#pragma once
#include 'Object.h'
#include 'MyObject.generated.h'
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
GENERATED_BODY()
};
언리얼에서는 티킹(Ticking) 방식으로 오브젝트를 업데이트합니다. 모든 액터, 액터 컴포넌트에는 등록 시 자동으로 호출되는 틱(Tick) 함수가 있지만, UObject
는 없어서 FTickableGameObject
클래스를 상속하여 추가할 수 있습니다.
오프젝트가 더 이상 레퍼런스되지 않을 때 가비지 켈렉션 시스템이 자동으로 오브젝트를 파괴합니다. 즉, UPROPERTY 포인터, 엔진 컨테이너, TStrongObjectPtr 또는 클래스 인스턴스가 강한 참조를 가져서는 안됩니다.
가비지 컬렉터가 자동으로 참조되지 않은 오브젝트를 발견하면 메모리에서 제거하지만, MarkAsGarbage()
함수를 오브젝트에서 바로 호출하여 오브젝트에 대한 포인터를 NULL
로 설정하여 검색에서 오브젝트를 제외시킵니다. 그럼, 다음 가비지 컬렉션 패스에서 완전히 삭제됩니다.
강한 참조가 있으면 UObject가 유지됩니다. 참조 관계가 UObject를 활성 상태로 유지하는 것을 원치 않을 경우 해당 레퍼런스가 위크 포인터를 사용하도록 변환하거나, 프로그래머가 수동으로 삭제하는 노멀 포인터여야 합니다.
액터의 경우, Destroy()
가 호출되어 레벨에서 제거되었더라도 해당 액터에 대한 모든 레퍼런스가 해제될 때까지 가비지 컬렉션되지 않습니다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/reflection-system-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/objects-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-uproperties
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ufunctions-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/metadata-specifiers-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/interfaces-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/structs-in-unreal-engine
E-mail : [email protected]
Phone number : (+82) 010 3902 8624