UE5/UE4 C++で「Enum(UENUM)」をビットフラグとして扱う(ENUM_CLASS_FLAGS、EnumHasAnyFlags、EnumHasAllFlags)
こちらを参考にさせていただきました。
・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」がビットフラグとして使えるようになりました。// ビットフラグとして使える Enum
UENUM(BlueprintType)
enum class EBitFlagEnum : uint8
{None = 0x00,
One = 0x01,
Two = 0x02,};
ENUM_CLASS_FLAGS(EBitFlagEnum);
というわけで確認してみます。
というわけでビットを立てたりするのは想定通りに動くようになりましたが// ビットを立てたりしてみる(※正常に動作する)
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↑