LoginSignup
2
0

More than 5 years have passed since last update.

UnityのEnumのフラグチェックをC#6っぽくしてみる

Posted at

概要

Flag属性つけてビットフラグのようにEnumを使うことが出来るが、チェック方法が若干冗長的でした。
Unityのバージョンが上がって.Net 4.x以降が使えるようになったことでデフォルトで使えるメソッドが増えました。
そんなわけで試しに使ってみる。

環境
Unity 2018.3.4f1

やること

プロジェクトの設定

UnityのProjectSetting>Playerで動かす.Netのバージョンを指定する必要があります。
これが3.x以前だと今回のサンプルプログラムのコンパイル通らないと思います。
ちなみに3.x以前が選択されていると「近々3.x消すからヨロシクね」みたいなことが警告として表示されるので、適当なタイミングで移行するのがいいでしょう。

UnityNetFrameworksVersionSetting

3.x以前

フラグチェック時、下記のようにする必要があるため、フラグ1つのために書かなければいけないコード量が正直多くて冗長的でした。

if ((_exportCollectColumn & columnValue) == columnValue)
{
    isToggle = true;
}

そのため、下記リンク先のように拡張メソッドを用意してシンプルにするのがベターでした。

【Unity】HasFlag 関数を Unity でも使用できるようにする拡張メソッド - コガネブログ

4.x以降

下記のようにHasFlagのメソッド呼ぶだけでOKです。シンプル。

if (_outputFlag.HasFlag(flagValue))
{
    isToggle = true;
}

サンプルコード

サンプルコードのリポジトリは下記。
UnitySandbox/EnumFlagSample.cs at develop · KTA552/UnitySandbox

サンプルを実行した結果

UnityEnumFlagSampleOverview.png (340×309)

コード部分


    [Flags]
    enum OutputFlag
    {
        Flag0 = 1 << 0,
        Flag1 = 1 << 1,
        Flag2 = 1 << 2,
        Flag3 = 1 << 3,
        Flag4 = 1 << 4,
    }

    OutputFlag _outputFlag = OutputFlag.Flag0 | OutputFlag.Flag3;

    private void OnGUI()
    {

        using (new EditorGUILayout.VerticalScope())
        {
            EditorGUILayout.Space();

            EditorGUILayout.LabelField("GUI Toggle:");

            foreach (var item in Enum.GetValues(typeof(OutputFlag)))
            {
                var flagName = Enum.GetName(typeof(OutputFlag), item);
                bool isToggle = false;
                var flagValue = (OutputFlag)item;

                if (_outputFlag.HasFlag(flagValue))
                {
                    isToggle = true;
                }

                // 確認したフラグが違ってたら反転
                var toggleResult = EditorGUILayout.Toggle(flagName, isToggle);
                if (toggleResult != isToggle)
                {
                    _outputFlag ^= flagValue;
                }
            }

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("GUI EnumFlagsField:");
            EditorGUILayout.EnumFlagsField(_outputFlag);

            EditorGUILayout.Space();

            // 今のフラグの状態の表示
            EditorGUI.BeginDisabledGroup(true);
            {
                EditorGUILayout.LabelField("CurrentFlag", _outputFlag.ToString());
                EditorGUILayout.LabelField("FlagHexValue", _outputFlag.ToString("X"));
            }
            EditorGUI.EndDisabledGroup();
        }
    }

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0