fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

PREV | PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++で「Enum(UENUM)」をビットフラグとして扱う(ENUM_CLASS_FLAGS、EnumHasAnyFlags、EnumHasAllFlags)

C++で「Enum(UENUM)」をビットフラグとして扱う方法です。

こちらを参考にさせていただきました。

・UE4 列挙型Enumについてのメモ
https://qiita.com/unknown_ds/items/292cf17a0ffa37f6c4cb

「Enum」をビットフラグとして扱いたいので色々と試してみます。

まずはこんな感じに「UENUM」を定義します。

// 普通の Enum
UENUM(BlueprintType)
enum class EBitFlagEnum : uint8
{

None = 0x00,
One = 0x01,
Two = 0x02,
};

それぞれの値がビットフラグとして扱えるような値になっています。

この「Enum」を使ってやりたいことは以下のものになります。

// ビットを立てたりしてみる(※エラーになる)
EBitFlagEnum aBitFlagEnum = EBitFlagEnum ::None;
aBitFlagEnum |= EBitFlagEnum::One;;
aBitFlagEnum &= ~EBitFlagEnum::Two;


// ビットチェックをしてみる(※エラーになる)
bool aResult = ((aBitFlagEnum & EBitFlagEnum::One) != 0);

これはどの記述もエラーになります。

ただ、やりたいこととしては上記のことになりますので、上記ができるよう実装していきます。

まずは「UENUM」を定義した後に「ENUM_CLASS_FLAGS」を記述します。

// ビットフラグとして使える Enum
UENUM(BlueprintType)
enum class EBitFlagEnum : uint8
{

None = 0x00,
One = 0x01,
Two = 0x02,
};
ENUM_CLASS_FLAGS(EBitFlagEnum);

これで「Enum」がビットフラグとして使えるようになりました。

というわけで確認してみます。

// ビットを立てたりしてみる(※正常に動作する)
EBitFlagEnum aBitFlagEnum = EBitFlagEnum::None;
aBitFlagEnum |= EBitFlagEnum::One;;
aBitFlagEnum &= ~EBitFlagEnum::Two;


// ビットチェックをしてみる(※これはまだエラーになる)
bool aResult = ((aBitFlagEnum & EBitFlagEnum::One) != 0);

というわけでビットを立てたりするのは想定通りに動くようになりましたが
ビットフラグのチェックがまだエラーになるようです。

「ENUM_CLASS_FLAGS」を記述した「UENUM」のビットフラグをチェックする場合は
「EnumHasAnyFlags」関数か「EnumHasAllFlags」関数を使います。

// 変数を定義
EBitFlagEnum aBitFlagEnum = EBitFlagEnum ::None;
// ビットチェックをしてみる(OR)
bool aResultOR = EnumHasAnyFlags(aBitFlagEnum, EBitFlagEnum::One);
// ビットチェックをしてみる(AND)
bool aResultAND = EnumHasAllFlags(aBitFlagEnum, EBitFlagEnum::One);

こんな感じで確認することができます。
上記だと関数に一つだけ渡しているのでどちらを使っても結果は同じになります。

「EnumHasAnyFlags」は二つ以上引数があればどちらかが立っていれば真を返します。
「EnumHasAllFlags」は二つ以上引数があれば両方ともが立っていれば真を返します。

// 変数を定義
EBitFlagEnum aBitFlagEnum = EBitFlagEnum ::None;
// どちらかが立っていればOK(OR)
bool aResultOR = EnumHasAnyFlags(aBitFlagEnum, EBitFlagEnum::One | EBitFlagEnum::Two);
// 両方とも立っていればOK(AND)
bool aResultAND = EnumHasAllFlags(aBitFlagEnum, EBitFlagEnum::One | EBitFlagEnum::Two);

こんな感じになります。

「Enum」をビットフラグとして使いたいことは結構あると思うので覚えておきたいですね。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://kagring.blog.fc2.com/tb.php/796-6dc90644

TRACKBACK

PREV | PAGE-SELECT | NEXT