언리얼에는 Unreal Engine Reflection System이라는 것이 있다
프로퍼티 시스템이라고도 불리는데 실행 시간에 자기 자신을 조사하는 기능이다.
리플렉션 시스템은 옵션이어서 리플렉션 시스템에 보이도록 하고 싶다면
헤더에 주석(마크업)을 달아줘야 한다. (코드에서 사용하는 주석 // 과는 다른 주석이다.)
UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY()의 주석을 달아주려면
파일에 특수한 include를 추가해야하는데 이것이 C++클래스를 만들면 보이던
generated.h 라는 헤더 파일이다.
#include "FileName.generated.h"
특수한 파일을 추가하고 주석을 달아주면 Unreal Header Tool (UHL)에서 컴파일 때 해당 정보를 수집한다.
Character에서 파생된 MyCharacter 라는 C++클래스를 생성하게 되면 아래와 같이
MyCharacter.generated.h라는 파일이 기본적으로 추가 되어있다.
그리고 보면 GENERATED_BODY()라는 메크로가 있는데 이는 리플렉션된 클래스나 구조체에 필수적인 요소이다.
GENERATED_BODY()는 기본 생성자와 소멸자를 자동으로 생성하고
리플렉션 시스템에 인식되도록 필요한 메타데이터를 자동으로 포함시키며
UCLASS(), UPROPERTY(), UFUNCTION() 등의 메크로에 의해 정의된 속성과 함수가
엔진의 내부 시스템과 통합되도록 하여 클래스의 인스턴스 생성, 데이터의 직렬화,
블루프린트와의 상호작용을 처리할 수 있게 해주는 중요한 메크로이다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"
UCLASS()
class STUDY002_API AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AMyCharacter();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
프로퍼티 시스템에 대한 계층 구조
UObject
|
UField : 리플렉션 시스템에서 사용되는 기본 클래스이며 UObject를 상속받는다.
UStruct : 종합 선물 세트같이 C++ 클래스, 구조체, 함수, 타입 정의 등 다양한 멤버를 포함 할 수 있는 클래스이다.
UClass : C++ 클래스를 정의하는 클래스이며 개체 생성, 타입 정보, 메타데이터 관리를 한다.
UScriptStruct : C++ 구조체를 정의하는 클래스이며, 메타데이터를 정의하고 데이터의 직렬화 / 역직렬화 작업을 지원한다.
UFunction : C++ 함수 또는 메서드를 정의하는 클래스이며, 함수의 메타 데이터와 리플렉션 정보를 관리한다.
UEnum : C++ 열거형을 정의하는 클래스이며 리플렉션 시스템과 통합된다.
UProperty : C++ 클래스의 멤버 변수 또는 함수의 파라미터를 정의하는 클래스이며 속성의 메타 데이터와 리플렉션 정보를 관리한다.
프로퍼티 시스템의 작동 원리
Unreal Build Tool (UBT)와 Unreal Header Tool (UHT)가 함께 실행 시간 리플렉션을 강화한다.
UBT의 역할
- 헤더 파일을 스캔
- 리플렉션된 유형이 최소 하나 있는 헤더가 있는 모듈을 기억
- 이러한 헤더 파일 중 하나라도 변경되면 UHT를 실행하여 리플렉션 데이터를 업데이트
UHT의 역할
- 헤더 파일을 파싱 (프로젝트의 헤더 파일을 읽고 분석. 클래스, 구조체, 열거형, 함수, 속성 등의 정리를 찾음)
- 리플렉션 데이터 세트를 빌드하고 (== 리플렉션 시스템이 작동하는데 필요한 메타 데이터와 정보를 수집하고
이를 구조화된 형태로 저장) 이를 포함하는 C++ 코드를 생성 - 리플렉션 데이터를 효율적으로 사용할 수 있도록 다양한 헬퍼 및 thunk 함수 생성
헬퍼 함수는 특정 속성에 접근하거나 함수를 호출하는 작업을 쉽게 수행할 수 있도록 하고
thunk함수는 블루프린트나 네트워크 리플렉션 시스템에서 C++ 함수를 호출할 때 사용.
참고 링크:
Unreal Engine Reflection System :: 언리얼 엔진 리플렉션 시스템에 관한 문서
언리얼 헤더 툴 :: UObject 시스템을 지원하는 맞춤형 파싱 및 코드 생성 툴
언리얼 빌드 툴 :: 언리얼 엔진 소스 코드의 빌드 프로세스를 관리
'Unreal Engine > UE5' 카테고리의 다른 글
UE5 - 문자열 손질 (String Handling) :: FName vs FString vs FText🔡 (2) | 2024.07.16 |
---|---|
UE5 - 총명한 가리키개 (Smart Pointer) (0) | 2024.07.11 |
UE5 - What is Outer, Onwer ? GetOuter() & GetOwner() (2) | 2024.04.20 |