ルルのゲーム開発備忘録

主にUnityやC#に関する情報を気まぐれに投稿していきま~す

【C#】ビットフラグとしてenum型を扱う方法

はじめに

今回は、enum型をビットフラグとして扱う方法について紹介します。
なじみ深いenumにひと工夫することで、複数のフラグを一つの変数に持たせることができます。

定義

enumにSystem.Flags Attributeを付加することで、enum型をビットフラグとして扱うことができます。
↓の書き方ではシフト演算子を使っていますが、直接2の乗数を入れても問題ないです。
普通のenumの場合は、例えばRedとBlueの両方をタイプであることを示したいときにRedAndBlueみたいな感じのタイプを新しく定義したりする必要がありそうですが、ビットフラグをつかえば複数の状態を簡単に扱えます。

   [System.Flags]
    public enum ColorType
    {
        None = 0,
        Red = 1 << 0,  // 1を左に0シフト つまり1
        Blue = 1 << 1,  // 1を左に1シフト つまり2
        Green = 1 << 2,  // 1を左に2シフト つまり4
        Yellow = 1 << 3,  // 1を左に3シフト つまり8
    }

使い方

先ほど定義したColorType型の変数に対して、以下のような感じでフラグを立てたり折ったりできます。

    void Test()
    {
        // OR演算でフラグをたてる
        m_colorType |= ColorType.Red;  // Redを追加
        m_colorType |= ColorType.Blue;  // Blueを追加

        // AND NOT演算でフラグを折る
        m_colorType &= ~ColorType.Red;

        // HasFlagメソッドで指定のフラグが立っているかどうかを確認
        if (m_colorType.HasFlag(ColorType.Blue))
        {

        }
    }