오늘은 언리얼 엔진의 리플렉션에 대해 알아보도록 하겠습니다.
1. 리플렉션?
리플렉션이라는 것은 자바나 C#등에서 지원하지만, 언리얼 엔진에서 사용되는 C++은 지원을 하지 않습니다.
그럼 어떻게 언리얼 엔진에서 지원을 해주는 것일가요?
자바는 리플렉션을 사용할때 객체를 통해 클래스의 정보를 분석해 내는 프로그램을 말합니다.
간단하게 컴파일 시간이 아니라 런타임시간에 동적으로 특정 클래스의 정보 객체화를 통해 분석 및 추출할수있는 프로그래밍 기법이라고 합니다.
그럼 언리얼 엔진의 리플렉션은 무엇인가?
공식 문서를 살펴보면
리플렉션은 프로그램이 실행시간에 자기 자신을 조사하는 기능입니다.
이는 엉청나게 유용한 데다 언리얼 엔진 테크놀로지의 근간을 이루는 것으로, 에디터의 디테일 패널, 시리얼라이제이션, 가비지 컬력션, 네트워크 리플리케이션, 블프/C++커뮤니케이션 등 다양한 시스템의 탐재된것
위에서 "자기 자신"은 클래스, 구조체, 함수, 맴버 변수, 열거형 등을 의미합니다.
수집 된 정보는 UCLASS에 보관되며, 런타임에는 GetClass() 함수를 통해 접근하며, 컴파일 타임에는 StaticClass()를 사용하여 접근합니다. 해당 함수들은 언리얼 헤더 툴에 의해 자동으로 생성됩니다.
2. 프로퍼티 시스템?
그럼 왜 언리얼은 프로퍼티 시스템이라고 불를가요?
언리얼은 리플렉션 = 프로퍼티 시스템 이라고 하는데 아마 "리플렉션" 이라는 단어가 반사라는 해석이 있어 그래픽 용어와 혼돈을 가질수있어 프로퍼티 시스템이라고 부른거 같습니다.
리플렉션을 알려주는 방법은?
Unreal Header Tool(UHT)가 프로젝트를 컴파일할 때 해당 정보를 수집합니다.
헤더에 리플렉션이 있는 유형으로 알려주면, 헤더 파일 상단에 특수한 include를 추가해 줘야 합니다.
그러면 리플렉션이 있는 유형은 이 파일을 고려해야 한다는것 그리고 시스템 구현에도 필요함을 UHT에 알려줍니다.
그 #include는 아래와 같습니다.
#include "FileName.generated.h"
위와 같은 헤더가 있으면 열거/UENUM(), 클래스/UCLASS(), 구조체/USTRUCT(), 함수/UFUNCTION(), 맴버변수/UPROPERTY()를 사용하여 헤더의 다양한 유형과 맴버 변수 주석을 달 수 있습니다.
이 매크로 각각은 유형 및 맴버 선언 전에 오며, 추가적인 지정자 키워드를 담을 수 있습니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MainPlayer.generated.h"
UCLASS()
3. 작동 원리
UBT(Unreal Build Tool)는 그 역활을 위해 헤더를 스캔한 다음 리플렉션된 유형이 최소 하나 있는 헤더가 들어있는 모듈을 기억, 그 헤더 중 어떤 것이든 지난 번 컴파일 이후 변경되었다면, UHT 를 실행하여 리플렉션 데이터를 수집하고 업데이트를 합니다.
UHT 는 헤더를 파싱하고, 리플렉션 데이터 세트를 빌드한 다음 리플렉션 데이터가 들어있는 C++코드를 생성할 뿐만 아니라, 다양한 헬퍼 및 thunk함수도 생성,
4. 요약
- 리플렉션은 객체의 정보 및 추출을 담당(실행시간에)
- 실행을 위해 UBT가 리플렉션 키워드를 탐색
- UHT가 해당 .cpp를 파싱
- 리플렉션 데이터 정보를 수집
- 수집한 정보는 별개의 C++코드 .generated.h / .cpp로 저장
- 빌드 시 기존 코드에 .generated.h 코드를 추가해 컴파일
5. Ref
https://hyo-ue4study.tistory.com/182
'개발자 면접 공부 > 언리얼 엔진' 카테고리의 다른 글
FSM, HFSM, BT 의 구조 (0) | 2023.02.28 |
---|---|
언리얼 엔진의 가비지 컬렉션 (0) | 2023.02.22 |
언리얼 엔진의 CDO 로딩 과정 등 (0) | 2023.01.31 |
#9 에디터내 테스팅(플레이 & 시뮬레이트) (0) | 2020.11.11 |
#8 기본 하우투(도움말, 액터 조작, 플레이, 액터 프로퍼티) (0) | 2020.11.11 |