label | このフィールドの Prefix Label |
enumValue | フラグに使用する enum |
options | An optional list of layout options that specify extra layouting properties. Any values passed in here will override settings defined by the style .See Also: GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight, GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight. |
Enum ユーザーによって設定された値
マスクに基づく enum のフィールドを作成します。
Simple window that shows the enum mask field.
以下は 3 つのオプションを使った EnumMaskField の実装例です。
using UnityEngine; using UnityEditor;
public class EditorEnumExample : EditorWindow { public enum Example { Option_One = 1, //bits: 0000 0001 Option_Two = 2, //bits: 0000 0010 Option_Three = 4 //bits: 0000 0100 }
Example staticFlagMask = 0;
[MenuItem("Examples/Mask Field Usage")] static void Init( ) { // Get existing open window or if none, make a new one: EditorEnumExample window = (EditorEnumExample)EditorWindow.GetWindow( typeof(EditorEnumExample) ); window.Show( ); }
void OnGUI( ) { staticFlagMask = (Example)EditorGUILayout.EnumMaskField( "Static Flags", staticFlagMask );
} }
内部的に、Unity は enum をそれぞれの値がビットマスクである int として保存します。Nothing を選ぶとすべてのビットはクリアされ、整数 0 の値になります。Everything を選ぶとすべてのビットが設定され、整数 -1 の値になります。
ある特定の enum 値が設定されているかを判断するために、enum を int として扱い、ビットワイズかテストを行うか、または、enum 値を走査しそれぞれの enum を再コンストラクトすることによって、Everything の値を設定しなおします。以下の例はその方法を表示しています。
using UnityEngine; using UnityEditor;
public class EditorEnumExample : EditorWindow { public enum Example { Option_One = 1, //bits: 0000 0001 Option_Two = 2, //bits: 0000 0010 Option_Three = 4 //bits: 0000 0100 }
Example staticFlagMask = 0;
[MenuItem("Examples/Mask Field Usage")] static void Init( ) { // Get existing open window or if none, make a new one: EditorEnumExample window = (EditorEnumExample)EditorWindow.GetWindow( typeof(EditorEnumExample) ); window.Show( ); }
void OnGUI( ) { staticFlagMask = (Example)EditorGUILayout.EnumMaskField( "Static Flags", staticFlagMask );
// If "Everything" is set, force Unity to unset the extra bits by iterating through them if( (int)staticFlagMask < 0 ) { int bits = 0; foreach( var enumValue in System.Enum.GetValues( typeof( Example ) ) ) { int checkBit = (int)staticFlagMask & (int)enumValue; if( checkBit != 0 ) bits |= (int)enumValue; }
staticFlagMask = (Example)bits; }
} }