Enum.GetNamesで列挙名の一覧を取ってきて、それと同数にする...とかでしょうかね?
たとえば下記のような作りになっている場合、
C#
1using System;
2using System.Linq;
3using UnityEngine;
4#if UNITY_EDITOR
5using UnityEditor;
6#endif
7
8public class SomethingBehaviour : MonoBehaviour
9{
10 [SerializeField] private Vector3 foo;
11 [SerializeField] private string bar;
12 [SerializeField] private float baz;
13 [SerializeField][HideInInspector] private bool[] dbFlags = new bool[Enum.GetNames(typeof(E_FLAG)).Length];
14
15 private void Start()
16 {
17 foreach (var (flagValue, flagName) in this.dbFlags.Zip(
18 Enum.GetNames(typeof(E_FLAG)),
19 (flagValue, flagName) => (flagValue, flagName)))
20 {
21 Debug.Log($"{flagName}:{flagValue}");
22 }
23 }
24}
25
26public enum E_FLAG
27{
28 eIS_SKIP_START_SCENARIO,
29 eDRAW_FADESTATE,
30 eDRAW_UICTRL,
31 eNUM,
32 eINVALID = eNUM
33}
34
35#if UNITY_EDITOR
36[CustomEditor(typeof(SomethingBehaviour))]
37public class SomethingBehaviourEditor : Editor
38{
39 private SerializedProperty dbFlagsProperty;
40 private readonly string[] flagNames = Enum.GetNames(typeof(E_FLAG));
41 private GUIStyle boldStyle;
42
43 public override void OnInspectorGUI()
44 {
45 base.OnInspectorGUI();
46 EditorGUILayout.Space();
47 GUILayout.Label("Debug", this.boldStyle);
48 using (new EditorGUI.IndentLevelScope())
49 {
50 var enumCount = this.flagNames.Length;
51 for (var i = 0; i < enumCount; i++)
52 {
53 var dbFlagProperty = this.dbFlagsProperty.GetArrayElementAtIndex(i);
54 EditorGUILayout.PropertyField(dbFlagProperty, new GUIContent(this.flagNames[i]));
55 }
56 }
57
58 this.serializedObject.ApplyModifiedProperties();
59 }
60
61 private void OnEnable()
62 {
63 this.dbFlagsProperty = this.serializedObject.FindProperty("dbFlags");
64 this.boldStyle = new GUIStyle {fontStyle = FontStyle.Bold};
65 }
66}
67#endif
インスペクターの見た目は下図のようになり、
実行すると下図のようにフラグの状態が表示されました。
あるいは、列挙体をビットフィールド方式で定義するのも一案かもしれません。
下記のような作りの場合...
C#
1using System;
2using UnityEngine;
3
4public class SomethingBehaviour2 : MonoBehaviour
5{
6 [SerializeField] private Vector3 foo;
7 [SerializeField] private string bar;
8 [SerializeField] private float baz;
9 [SerializeField] private E_FLAG2 dbFlags;
10
11 private void Start()
12 {
13 foreach (var flagName in Enum.GetNames(typeof(E_FLAG2)))
14 {
15 Debug.Log($"{flagName}:{this.dbFlags.HasFlag((E_FLAG2)Enum.Parse(typeof(E_FLAG2), flagName))}");
16 }
17 }
18}
19
20[Flags]
21public enum E_FLAG2
22{
23 eIS_SKIP_START_SCENARIO = 1 << 0,
24 eDRAW_FADESTATE = 1 << 1,
25 eDRAW_UICTRL = 1 << 2,
26 eNUM = 1 << 3,
27 eINVALID = 1 << 4
28}
インスペクター上には複数の項目を選択できるポップアップメニューが現れるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/30 03:22