UENUM in Unreal Engine 5 C++



Syntax

UENUM(BlueprintType)
enum class ECustomEnum : uint8 {
    ValueA UMETA(DisplayName="My Value 1"),
    ValueB,
    ValueC
};

Bitflag Syntax

UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class ECustomBitFlagEnum: uint8
{
    BitValueNone = 0,
    BitValueA = 1 << 0,
    BitValueB = 1 << 1,
    BitValueC  = 1 << 2
};
ENUM_CLASS_FLAGS(ECustomBitFlagEnum);


// Creating
ECustomBitFlagEnum MyBitFlag = ECustomBitFlagEnum::FlagA | ECustomBitFlagEnum::FlagC;

// Turning On Flag
MyBitFlag |= ECustomBitFlagEnum::FlagB;

// Turning Off Flag
MyBitFlag &= ~ECustomBitFlagEnum::FlagA;

// Checking for Flag
bool bIsFlagActive = (MyBitFlag & ECustomBitFlagEnum::FlagC) == ECustomBitFlagEnum::FlagC;

Iterating

There are 3 ways to make an enum iterable

// By Count
UENUM(BlueprintType)
enum class ECustomEnum : uint8
{
    ValueA,
    ValueB,
    ValueC,
    ValueD,
    Count UMETA(Hidden)
};
ENUM_RANGE_BY_COUNT(ECustomEnum, ECustomEnum::Count);



// By First and last
UENUM(BlueprintType)
enum class ECustomEnum : uint8
{
    ValueA,
    ValueB,
    ValueC,
    ValueD
};
ENUM_RANGE_BY_FIRST_AND_LAST(ECustomEnum, ECustomEnum::ValueA, ECustomEnum::ValueD);



// By Values
UENUM(BlueprintType)
enum class ECustomEnum : uint8
{
    ValueA = 90,
    ValueB = 55,
    ValueC = 32,
    ValueD = 78
};

ENUM_RANGE_BY_VALUES(ECustomEnum, ECustomEnum::ValueA, ECustomEnum::ValueB, ECustomEnum::ValueC, ECustomEnum::ValueD)

To iterate

// Iterate
for (ECustomEnum Value : TEnumRange<ECustomEnum>()) {
    GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, FString::Printf(TEXT("Enum: %s"), *UEnum::GetValueAsString(Value)));
    UE_LOG(LogTemp, Warning, TEXT("Enum: %s"), *UEnum::GetValueAsString(Value));
}