概要
Flag属性つけてビットフラグのようにEnumを使うことが出来るが、チェック方法が若干冗長的でした。
Unityのバージョンが上がって.Net 4.x以降が使えるようになったことでデフォルトで使えるメソッドが増えました。
そんなわけで試しに使ってみる。
環境
Unity 2018.3.4f1
やること
プロジェクトの設定
UnityのProjectSetting>Playerで動かす.Netのバージョンを指定する必要があります。
これが3.x以前だと今回のサンプルプログラムのコンパイル通らないと思います。
ちなみに3.x以前が選択されていると「近々3.x消すからヨロシクね」みたいなことが警告として表示されるので、適当なタイミングで移行するのがいいでしょう。
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
サンプルを実行した結果
コード部分
[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();
}
}