ルーグの備忘録

主にC#についてまとめてます。

Enum Flagsで入力を検知する

Let's bit演算

qiita.com

bit演算の基本(演算子の意味とか)についてはこちらを参照。

Unityでbit演算

note.dokeep.jp

UnityだとEnum Flagsで使う。

使用例

Enum Flagsを使って入力を検知する。

定義

[Flags]
public enum KeyCodeFlag
{
    None = 0,

    // ----- 移動 ----- //
    W = 1 << 0,
    A = 1 << 1,
    S = 1 << 2,
    D = 1 << 3,
    Right_Shift = 1 << 4,

    // 攻撃
    E = 1 << 5,

    // 戻る
    Q = 1 << 6,

    // メニュー
    M = 1 << 7,

    // Ui決定
    Return = 1 << 8,

    // スキル
    One = 1 << 9,
    Two = 1 << 10,
    Three = 1 << 11,
}

検知

    /// <summary>
    /// 入力中ずっと
    /// </summary>
    /// <returns></returns>
 private KeyCodeFlag CreateGetKeyFlag()
    {
        var flag = KeyCodeFlag.None;

        if (Input.GetKey(KeyCode.W))
            flag |= KeyCodeFlag.W;

        if (Input.GetKey(KeyCode.A))
            flag |= KeyCodeFlag.A;

        if (Input.GetKey(KeyCode.S))
            flag |= KeyCodeFlag.S;

        if (Input.GetKey(KeyCode.D))
            flag |= KeyCodeFlag.D;

        if (Input.GetKey(KeyCode.RightShift))
            flag |= KeyCodeFlag.Right_Shift;

        if (Input.GetKey(KeyCode.E))
            flag |= KeyCodeFlag.E;

        if (Input.GetKey(KeyCode.Q))
            flag |= KeyCodeFlag.Q;

        if (Input.GetKey(KeyCode.M))
            flag |= KeyCodeFlag.M;

        if (Input.GetKey(KeyCode.Return))
            flag |= KeyCodeFlag.Return;

        if (Input.GetKey(KeyCode.Alpha1))
            flag |= KeyCodeFlag.One;

        if (Input.GetKey(KeyCode.Alpha2))
            flag |= KeyCodeFlag.Two;

        if (Input.GetKey(KeyCode.Alpha3))
            flag |= KeyCodeFlag.Three;

        return flag;
    }

判定

// 拡張メソッド
static class EnumExtensions
{
    public static bool HasBitFlag(this KeyCodeFlag value, KeyCodeFlag flag) => (value & flag) == flag;
}