본문 바로가기
공부/Unreal Engine 5

[언리얼5] .generated.h 에 대하여

by MY블로그 2024. 6. 4.

#include "classname.generated.h" 란?

언리얼 엔진에서 사용되는 코드 생성 메커니즘과 관련이 있는 헤더입니다.

Unreal Header Tool(UHT)이라는 도구를 사용하여 코드 생성과 관련된 작업을 처리하는데,

이 도구를 통하여 클래스, 구조체, 열거형 등의 메ㅏ데이터를 처리하며 자동으로 코드를 생성합니다.

여기서 .generated.h 파일은 이러한 자동 생성에 사용되는 코드를 포함한느 헤더 입니다.

 

주요 역할

1. 리플렉션(reflection) 시스템의 지원

언리얼 엔진의 리플렉션 시스템은 런타임에 클래스와 데이터 멤버에 대한 메타데이터에 접근할 수 있도록 합니다.

블루프린트(BP)스크립팅, 네트워킹, 시리얼라이제이션 등의 다양한 시스템에서 사용됩니다.

 

2. UCLASS / USTRUCT / UENUM 등의 매크로 처리

언리얼 엔진에서는 클래스, 구조체, 열거형 등을 정의시에 매크로를 사용합니다.

이 매크로들은 .generated.h 파일에서 실제 코드로 확장됩니다.

 

3. 자동 생성된 코드 포함

UHT에 의해 자동으로 성성되기 때문에 클래스의 메타데이터 및 기타 필요한 코드가 포함되고, 개발자는 이 파일을 직접 수정하지 않습니다.

 

예시

// MyActor.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class MYGAME_API AMyActor : public AActor
{
    GENERATED_BODY()
    
public:    
    AMyActor();

protected:
    virtual void BeginPlay() override;

public:    
    virtual void Tick(float DeltaTime) override;
};

위 코드에서 AyActor,generated.h 파일은 UHT에 의하여 생성됩니다.

UCLASS 매크로와 GENERATED_BODY() 매크로가 확장된 코드가 포함됩니다.

 

주의사항

.generated.h를 포함하는 위치는 매우 중요합니다.

해당파일은 UCLASS, USTRUCT, UENUM 등의 매크로가 확장된 코드와 클래스의 메타데이터를 포함하며 추가적인 정의들이 포함되기 때문에 해당 클래스의 전체 정의가 완료되기 전에 다른 헤더파일을 포함해야 합니다.

(즉, generated.h보다 아랫줄에 다른헤더파일이 있을경우 해당 클래스의 전체 정의는 완료되지 않은 상태)

만일 해당 클래스의 전체정의가 완료되지 않은 상태에서 컴파일을 진행할 경우 해당 클래스는 불완전한 정보로 인하여 오류를 발생시킬 수 있습니다.

때문에 generated.h는 다른 포함헤더보다 한줄 띄우고 가장아래 배치하는 편

정리하자면 generated.h는 해당 클래스가 다른 클래스나 구조체에 의존하는 경우 해당 종속성을 먼저 포함한 뒤,

컴파일러가 모든 필요한 정의를 인식하고 매크로를 사용하여 해당 클래스의 구조를 정의하고 메타데이터를 생성합니다.

 

요약

generated.h는 UHT에 의하여 생성되며 다양한 자료형의 메타데이터를 처리하며,

개발자는 해당 파일을 직접 수정하지 않습니다.

 

필요한 헤더를 추가할 경우 추가되는 헤더파일은 generated.h 보다 위에 위치해야 합니다.

댓글