이 글은 해당 유튜브를 보고 진행한 것에 대해 공부하여 정리한 글입니다.
열거형 (ENUM)
UE5에서 C++의 열거형(Enum)은 관련된 상수 집합을 정의하는 데 사용되는 데이터 타입입니다.
열거형을 사용하면 코드의 가독성을 높이고, 특정 값의 의미를 명확하게 할 수 있습니다.
[ C++의 기본 열거형 ]
enum class EMyEnum
{
Value1,
Value2,
Value3
};
enum class는 범위가 있는 열거형으로, 전역 네임스페이스에 영향을 미치지 않으며, 타입 안전성을 제공합니다.
[ Unreal Engine의 UENUM ]
Unreal Enigne에서는 UENUM 매크로를 사용하여 열거형을 정의할 수 있습니다.
이는 리플렉션 시스템과 통합되어 블루프린트와의 호환성을 제공합니다.
// Unreal Enigne의 Enum
UENUM()
enum class EMyEnum : uint8
{
Value1 UMETA(DisplayName = "Value One");
Value2 UMETA(DisplayName = "Value Two");
Value3 UMETA(DisplayName = "Value Three");
};
// Blueprint에서 사용될 수 있도록 지정한 Enum
UENUM(BlueprintType)
enum class EMyBlueprintEnum : uint8
{
Value1 UMETA(DisplayName = "Value One");
Value2 UMETA(DisplayName = "Value Two");
Value3 UMETA(DisplayName = "Value Three");
};
- UENUM( )
- UENUM( )을 사용하면 해당 열거형을 Unreal Engine의 리플렉션 시스템에 등록합니다.
이를 통해 런타임에 열거형의 메타데이터에 접근할 수 있습니다. - UENUM(BlueprintType) 매크로를 사용하면 BlueprintType의 옵션으로 인해,
해당 열거형을 블루프린트에서 사용될 수 있도록 지정합니다.
- UENUM( )을 사용하면 해당 열거형을 Unreal Engine의 리플렉션 시스템에 등록합니다.
- uint8
- 열거형의 기본 데이터 타입 uint8로 지정합니다. uint8은 0부터 255까지의 값을 저장할 수 있습니다.
uint16이나 uint32와 같이 다른 정수형 타입을 사용하는 것이 가능합니다. - 보통 uint8로 기본 데이터 타입을 지정하는 이유는, 메모리 최적화를 위함입니다.
보통의 열거형이 255개를 초과하는 값을 필요로하지 않기 때문에 최적화를 위하여 uint8로 지정합니다.
- 열거형의 기본 데이터 타입 uint8로 지정합니다. uint8은 0부터 255까지의 값을 저장할 수 있습니다.
- UMETA(DisplayName = "...")
- 언리얼 에디터에서 표시될 이름을 설정합니다.
※ 리플렉션 시스템
Unreal Engine에서의 리플렉션 시스템은 클래스와 객체의 메타데이터를 관리하고, 런타임에서 객체의 정보에 접근할 수 있게 해주는 시스템입니다.
[특징]
- 메타데이터 관리
- 리플렉션 시스템은 클래스, 변수, 함수 등에 대한 메타데이터를 관리합니다.
- 매크로 사용 필요
- 리플렉션 시스템을 활용하기 위해 UCLASS, UPROPERTY, UFUNCTION과 같은 매크로를 사용합니다.
- 블루프린트와의 통합
- 리플렉션 시스템을 통해 C++로 작성된 클래스와 프로퍼티(property)가 블루프린트에서 사용 될 수 있습니다.
- 동적 객체 생성
- 런타임에 클래스 정보를 바탕으로 객체를 동적으로 생성할 수 있습니다.
예를 들어, 특정 클래스의 인스턴스를 생성하거나, 속성 값을 동적으로 설정하는 것이 가능합니다.
- 런타임에 클래스 정보를 바탕으로 객체를 동적으로 생성할 수 있습니다.
- 데이터 바인딩
- UI 요소와 데이터 간의 바인딩을 통해, 데이터가 변경될 때 UI가 자동으로 업데이트 될 수 있습니다.
이는 리플렉션 시스템을 통해 객체의 상태를 쉽게 추적할 수 있기 때문에 가능합니다.
- UI 요소와 데이터 간의 바인딩을 통해, 데이터가 변경될 때 UI가 자동으로 업데이트 될 수 있습니다.
[ 열거형의 장점 ]
- 가독성
- 열거형을 사용하면 코드에서 의미 있는 이름으로 값을 정의할 수 있어, 코드의 가독성이 높아집니다.
- 유지보수 용이
- 관련된 상수들을 그룹화할 수 있습니다.
새로운 값이 필요할 경우 열거형에 추가하기만 하면 되므로, 코드 수정이 간편해집니다.
- 관련된 상수들을 그룹화할 수 있습니다.
- 타입 안정성
- 잘못된 값의 사용을 방지할 수 있습니다.
예를 들어, 특정 함수에서 열거형 타입만 전달할 수 있도록 제한할 수 있어, 오류를 줄이는데 도움이 됩니다.
- 잘못된 값의 사용을 방지할 수 있습니다.
구조체 (Struct)
UE5에서 C++의 구조체(Struct)는관련된 데이터를 그룹화하여 하나의 데이터 타입으로 묶는 데 사용됩니다.
구조체는 여러 변수(필드)를 포함할 수 있으며, 이러한 변수들을 서로 다른 데이터 타입일 수 있습니다.
[ C++의 기본 구조체]
struct FMyStruct
{
int32 IntegerValue;
float FloatValue;
FString StringValue;
};
[ Unreal Engine의 USTRUCT ]
// Unreal Enigne의 Struct
USTRUCT()
struct FMyStruct
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
int32 IntegerValue;
UPROPERTY(EditAnywhere)
float FloatValue;
UPROPERTY(EditAnywhere)
FString StringValue;
};
// Blueprint에서 사용될 수 있도록 지정한 Struct
USTRUCT()
struct FMyBlueprintStruct
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 IntegerValue;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float FloatValue;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString StringValue;
};
- USTRUCT( )
- USTRUCT( ) 매크로를 사용하여 구조체를 정의합니다. 해당 구조체는 C++에서만 사용할 수 있습니다.
- USTRUCT(BlueprintType) 매크로를 사용하면 BlueprintType의 옵션으로 인해,
해당 구조체를 블루프린트에서도 사용할 수 있도록 설정합니다.
- GENERATED_USTRUCT_BODY( )
- 구조체 정의에 특화된 매크로로, USTRUCT 매크로와 함께 사용됩니다.
이 매크로는 구조체에 필요한 메타데이터와 코드 생성을 처리하며, 해당 구조체를 사용할 때 이 매크로를 사용하여 구조체의 정보를 리플렉션 시스템에 등록합니다. - GENERATED_BODY( )를 통해서도 구조체 정의가 가능합니다.
GENERATED_BODY( )는 일반적으로 UCLASS 또는 USTRUCT 매크로와 함께 사용됩니다. 기능은 GENERATED_USTRUCT_BODY( )와 동일합니다.
- 구조체 정의에 특화된 매크로로, USTRUCT 매크로와 함께 사용됩니다.
- UPROPERTY( )
- EditAnywhere, BlueprintReadWrite 등의 옵션을 통해 구조체의 각 필드를 블루프린트나 에디터에서 사용 가능하도록 설정합니다.
실습
[ItemDataStructs.h]
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "ItemDataStructs.generated.h"
UENUM()
enum class EItemQuality : uint8
{
IQ_Shoddy UMETA(DisplayName = "Shoddy"),
IQ_Common UMETA(DisplayName = "Common"),
IQ_Quality UMETA(DisplayName = "Quality"),
IQ_Masterwork UMETA(DisplayName = "Masterwork"),
IQ_Grandmaster UMETA(DisplayName = "Grandmaster")
};
UENUM()
enum class EItemType : uint8
{
IT_Armor UMETA(DisplayName = "Armor"),
IT_Weapon UMETA(DisplayName = "Weapon"),
IT_Shield UMETA(DisplayName = "Shield"),
IT_Spell UMETA(DisplayName = "Spell"),
IT_Consumable UMETA(DisplayName = "Consumable"),
IT_Quest UMETA(DisplayName = "Quest"),
IT_Mundane UMETA(DisplayName = "Mundane")
};
USTRUCT()
struct FItemStatistics
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
float ArmorRating;
UPROPERTY(EditAnywhere)
float DamageValue;
UPROPERTY(EditAnywhere)
float RestoreionAmount;
UPROPERTY(EditAnywhere)
float SellValue;
};
USTRUCT()
struct FItemTextData
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
FText Name;
UPROPERTY(EditAnywhere)
FText Description;
UPROPERTY(EditAnywhere)
FText InteractionText;
UPROPERTY(EditAnywhere)
FText UsageText;
};
USTRUCT()
struct FItemNumericData
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
float Weight;
UPROPERTY(EditAnywhere)
int32 MaxStackSize;
UPROPERTY(EditAnywhere)
bool bIsStackable;
};
USTRUCT()
struct FItemAssetData
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
UTexture2D* Icon;
UPROPERTY(EditAnywhere)
UStaticMesh* Mesh;
};
USTRUCT()
struct FItemData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, Category = "Item Data")
FName ID; // 검색 필드 역할
UPROPERTY(EditAnywhere, Category = "Item Data")
EItemType ItemType;
UPROPERTY(EditAnywhere, Category = "Item Data")
EItemQuality ItemQuality;
UPROPERTY(EditAnywhere, Category = "Item Data")
FItemStatistics ItemStatistics;
UPROPERTY(EditAnywhere, Category = "Item Data")
FItemTextData TextData;
UPROPERTY(EditAnywhere, Category = "Item Data")
FItemNumericData NumericData;
UPROPERTY(EditAnywhere, Category = "Item Data")
FItemAssetData ItemAssetData;
};
위의 코드와 같이, Item에 필요한 데이터들을 열거형과 구조체로 하여금 구현하였습니다.
해당 코드 파일은 Visual Studio의 새 항목으로 생성하였기 때문에, 언리얼 에디터와 연동을 새로 하여야 합니다.
그를 위해 'Intermediate' 폴더와 'Binaries' 폴더를 삭제한 후, '.uproject' 파일의 옵션에서 'Generated Visual Studio project files'을 선택하여 sln 파일을 언리얼 에디터와 새로 연동해주었습니다.
[Unreal Editor]
'ItemDataStructs.h'에서 만든 구조체 FItemData를 에디터 상에서도 사용할 수 있게 하여야 합니다.
그를 위해 언리얼 에디터에서 Data Table을 만들어 주었습니다.


Data Table을 생성할 때, 'Pick Row Structure'창에서 C++로 구현했던 ItemData 구조체를 선택하면 아래의 이미지와 같이 생성됩니다.

[ 마무리 ]
오늘은 C++로 ItemData 구조체를 생성하고, 이를 Unreal Editor에 연동하여 Data Table을 생성해보았습니다.
Item Data 구조체를 생성하기 위해, 각각의 속성을 열거형과 구조체로 구현해주었습니다.
열거형과 구조체, 그리고 추가로 리플렉션 시스템에 대해 더 자세히 알기 위해 이 글을 정리했고, 제가 한 실습을 따라하고 싶으신 분들은 상단에 유튜브를 보시면서 따라하시면 될 것 같습니다.
영문 유튜브이긴하나, 자동 번역을 키시면 그래도 괜찮으실 것 같습니다. ㅎㅎ
'UE5' 카테고리의 다른 글
| [UE5] FORCEINLINE, Overloading, Clamp (0) | 2025.05.02 |
|---|---|
| [UE5] Git 사용하기 (0) | 2025.04.06 |