(1) 언리얼은 프로퍼티 시스템이라고 불를가요?
언리얼은 리플렉션 = 프로퍼티 시스템 이라고 하는데 아마 "리플렉션" 이라는 단어가 반사라는 해석이 있어 그래픽 용어와 혼돈을 가질수있어 프로퍼티 시스템이라고 부른거 같습니다.
리플렉션을 알려주는 방법은?
Unreal Header Tool(UHT)가 프로젝트를 컴파일할 때 해당 정보를 수집합니다.
헤더에 리플렉션이 있는 유형으로 알려주면, 헤더 파일 상단에 특수한 include를 추가해 줘야 합니다.
그러면 리플렉션이 있는 유형은 이 파일을 고려해야 한다는것 그리고 시스템 구현에도 필요함을 UHT에 알려줍니다.
그 #include는 아래와 같습니다.
#include "FileName.generated.h"
위와 같은 헤더가 있으면 열거/UENUM(), 클래스/UCLASS(), 구조체/USTRUCT(), 함수/UFUNCTION(), 맴버변수/UPROPERTY()를 사용하여 헤더의 다양한 유형과 맴버 변수 주석을 달 수 있습니다.
-> C++ 정의 안에서는 GENERATED_BODY() 매크로와 짝을 이루기도 합니다. GENERATED_UCLASS_BODY() / GENERATED_USTRUCT_BODY() 매크로는 리플렉션된 클래스나 구조체에 필수적인데, 클래스 본문에 추가적인 함수나 typedef 를 주입하기 때문입니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MainPlayer.generated.h"
UCLASS()
리플렉션은 프로그램이 실행시간에 자기 자신을 조사하는 기능입니다.
-> 엄청나게 유용한 데다 언리얼 엔진 테크놀로지의 근간을 이루는 것으로, 에디터의 디테일 패널, 시리얼라이제이션, 가비지 컬력션, 네트워크 리플리케이션, 블프/C++커뮤니케이션 등 다양한 시스템의 탐재된것
-> 위에서 "자기 자신"은 클래스, 구조체, 함수, 맴버 변수, 열거형 등을 의미합니다.
수집 된 정보는 UCLASS에 보관되며, 런타임에는 GetClass() 함수를 통해 접근하며, 컴파일 타임에는 StaticClass()를 사용하여 접근합니다. 해당 함수들은 언리얼 헤더 툴에 의해 자동으로 생성됩니다.
UHT -> 언리얼 헤더 툴 작동 원리
- UBT(Unreal Build Tool)는 그 역할을 위해 헤더를 스캔한 다음
-> 리플렉션된 유형이 최소 하나 있는 헤더가 들어있는 모듈을 기억,
-> 그 헤더 중 어떤 것이든 지난 번 컴파일 이후 변경되었다면, UHT 를 실행하여 리플렉션 데이터를 수집하고 업데이트를 합니다.
-> UHT 는 헤더를 파싱하고, 리플렉션 데이터 세트를 빌드한 다음 리플렉션 데이터가 들어있는 C++코드를 생성할 뿐만 아니라, 다양한 헬퍼 및 thunk함수도 생성,